Copyright 2020 The TensorFlow Authors.
TensorFlow の基礎
このガイドでは、TensorFlow basics の簡単な概要を説明します。このドキュメントの各セクションは、より大きなトピックの概要です。各セクションの末尾に、ガイド全文へのリンクを記載しています。
TensorFlow は機械学習用のエンドツーエンドプラットフォームで、以下の内容をサポートしています。
多次元配列ベースの数値計算(NumPy に類似)
GPU および分散処理
自動微分
モデルの構築、トレーニング、およびエクスポート
その他
テンソル
TensorFlow は、tf.Tensor
として表現される多次元配列またはテンソルを操作します。以下は2次元テンソルです。
tf.Tensor
の最も重要な属性は shape
と dtype
です。
Tensor.shape
: 各軸に沿ったテンソルのサイズを示します。Tensor.dtype
: テンソル内のすべての要素の型を示します。
TensorFlow はテンソルに標準の算術演算や機械学習に特化した多数の演算を実装します。
以下に例を示します。
注意: 通常、TensorFlow 関数が Tensor
を入力として期待する場合、関数は tf.convert_to_tensor
を使用して Tensor
に変換できるものをすべて受け入れます。例については、以下を参照してください。
大規模な計算を CPU で実行すると低速化する可能性があります。適切に構成すれば、TensorFlow は GPU などのアクセラレータハードウェアを使用して演算を非常に素早く実行することが可能です。
詳細は、テンソルガイドをご覧ください。
変数
通常の tf.Tensor
オブジェクトはイミュータブルです。TensorFlow にモデルの重み(またはその他のミュータブルな状態)を格納するには、tf.Variable
を使用します。
詳細は、変数ガイドをご覧ください。
自動微分
最新の機械学習の基礎は、勾配降下と関連アルゴリズムです。
これを可能にするために、TensorFlow は自動微分(autodiff)を実装しており、微積分を使用して勾配を計算します。通常、モデルの重みに関する誤差または損失の勾配を計算する際にこれを使用します。
x = 1.0
の場合、y = f(x) = (1**2 + 2*1 - 5) = -2
となります。
y
の導関数は y' = f'(x) = (2*x + 2) = 4
です。TensorFlow はこれを自動的に計算できます。
この単純な例は、単一のスカラー(x
)に関する導関数のみを取っていますが、TensorFlow はスカラーでない任意の数のテンソルに関する勾配を同時に計算できます。
詳細は、自動微分ガイドをご覧ください。
グラフと tf.function
TensorFlow は Python ライブラリのように対話型で使用できますが、以下を行うためのツールも提供しています。
パフォーマンス最適化: トレーニングと推論を高速化します。
エクスポート: モデルのトレーニングが完了したら、そのモデルを保存できます。
これらを行うには、tf.function
を使用して、純粋な TensorFlow コードと Python を分離する必要があります。
tf.function
を初めて実行すると、Python として実行されますが、関数内で行われた TensorFlow 計算を表現する最適化された完全なグラフがキャプチャされます。
後続の呼び出しでは、TensorFlow は最適化グラフのみを実行し、TensorFlow でないステップが省略されます。以下では、my_func
でトレーシングが出力されないところに注意してください。print
は Python 関数であり、TensorFlow 関数ではないためです。
シグネチャ(shape
と dtype
)が異なる入力ではグラフを再利用できない可能性があるため、代わりに新しいグラフが生成されます。
詳細は、グラフの導入をご覧ください。
モジュール、レイヤー、モデル
tf.Module
は、tf.Variable
オブジェクトと、それを操作する tf.function
オブジェクトを管理するためのクラスです。tf.Module
は、以下の重要な 2 つの機能をサポートするために必要なクラスです。
tf.train.Checkpoint
を使用すると、変数の値を保存し、復元することができます。モデルの状態を素早く保存して復元できるため、トレーニング中に役立ちます。tf.saved_model
を使用すると、tf.Variable
の値とtf.function
グラフのインポートとエクスポートを行えます。そのため、モデルを作成した Python プログラムに頼らずに、モデルを実行することができます。
単純な tf.Module
オブジェクトの完全なエクスポート例を以下に示します。
Module
を保存します。
結果で得られる SavedModel は、それを作成したコードから独立しています。この SavedModel は、Python、その他の言語バインディング、または TensorFlow Serving から読み込むことができアンス。また、TensorFlow Lite または TensorFlow JS で実行できるように変換することも可能です。
tf.keras.layers.Layer
クラスと tf.keras.Model
クラスは tf.Module
を基礎とし、モデルを構築、トレーニング、および保存するための追加機能と便利な方法を提供します。一部の機能については、次のセクションで説明しています。
詳細は、モジュールの導入をご覧ください。
トレーニングループ
では、これらをゼロから合わせて基本的なモデルを構築し、トレーニングします。
まず、サンプルデータを作成します。これは、二次曲線に緩やかに沿ったポイントクラウドを生成します。
ランダムに初期化した重みとバイアスを使って、二次モデルを作成します。
トレーニングする前に、モデルのパフォーマンスを観察します。
次に、モデルtの損失を定義します。
このモデルは連続する値を予測するものであるため、損失関数には平均二乗誤差(MSE)が最適です。予測のベクトルを とすると、予測値とグラウンドトゥルースの二乗差の平均として定義されます。
モデルの基本的なトレーニングループを記述します。このループは、モデルのパラメータを反復的に更新するために、MSE 損失関数と入力に対する勾配を利用します。トレーニングのミニバッチを使用すると、メモリ効率とより高速な収束を得られます。tf.data.Dataset
API には、バッチ処理とシャッフル用の便利な関数が備わっています。
トレーニングする前に、モデルのパフォーマンスを観察しましょう。
動作してはいますが、tf.keras
モジュールには、共通のトレーニングユーティリティの実装が存在することを思い出してください。独自のユーティリティを記述する前に、それらを使用することを検討できます。まず、Model.compile
と Model.fit
メソッドを使って、トレーニングループを実装できます。
tf.keras.Sequential
を使って Keras で Sequential Model を作成することから始めます。最も単純な Keras レイヤーの 1 つは Dense レイヤーです。これは、tf.keras.layers.Dense
を使ってインスタンス化できます。密なレイヤーは、 の形態の多次元線形リレーションを学習できます。 の非線形式を学習するために、密なレイヤーの入力は and を特徴量とするデータ行列である必要があります。tf.keras.layers.Lambda
ラムダレイヤーは、このスタック変換を実行するために使用できます。
トレーニング後の Keras モデルのパフォーマンスを観察します。
詳細は、基本トレーニングループと Keras ガイドをご覧ください。