Copyright 2020 The TensorFlow Authors.
変数の概要
TensorFlow の変数は、プログラムが操作する共通の永続的な状態を表すために推奨される方法です。このガイドでは、TensorFlow で tf.Variable
のインスタンスを作成、更新、管理する方法について説明します。
変数は tf.Variable
クラスを介して作成および追跡されます。tf.Variable
は、そこで演算を実行して値を変更できるテンソルを表します。特定の演算ではこのテンソルの値の読み取りと変更を行うことができます。tf.keras
などのより高度なライブラリは tf.Variable
を使用してモデルのパラメーターを保存します。
セットアップ
このノートブックでは、変数の配置について説明します。変数が配置されているデバイスを確認するには、この行のコメントを外します。
変数の作成
変数を作成するには、初期値を指定します。tf.Variable
は、初期化の値と同じ dtype
を持ちます。
変数の外観と動作はテンソルに似ており、実際にデータ構造が tf.Tensor
で裏付けられています。テンソルのように dtype
と形状を持ち、NumPy にエクスポートできます。
ほとんどのテンソル演算は期待どおりに変数を処理しますが、変数は変形できません。
上記のように、変数はテンソルによって裏付けられています。テンソルは tf.Variable.assign
を使用して再割り当てできます。assign
を呼び出しても、(通常は)新しいテンソルは割り当てられません。代わりに、既存テンソルのメモリが再利用されます。
演算でテンソルのような変数を使用する場合、通常は裏付けているテンソルで演算します。
既存の変数から新しい変数を作成すると、裏付けているテンソルが複製されます。2 つの変数が同じメモリを共有することはありません。
ライフサイクル、命名、監視
Python ベースの TensorFlow では、tf.Variable
インスタンスのライフサイクルは他の Python オブジェクトと同じです。変数への参照がない場合、変数は自動的に割り当て解除されます。
変数には名前を付けることもでき、変数の追跡とデバッグに役立ちます。2 つの変数に同じ名前を付けることができます。
変数名は、モデルの保存と読み込みを行う際に維持されます。デフォルトでは、モデル内の変数は一意の変数名を自動的に取得するため、必要がない限り自分で割り当てる必要はありません。
変数は区別のためには重要ですが、一部の変数は区別する必要はありません。作成時に trainable
を false に設定すると、変数の勾配をオフにすることができます。勾配を必要としない変数には、トレーニングステップカウンターなどがあります。
変数とテンソルの配置
パフォーマンスを向上させるため、TensorFlow はテンソルと変数を dtype
と互換性のある最速のデバイスに配置しようとします。つまり、GPU を使用できる場合はほとんどの変数が GPU に配置されることになります。
ただし、この動作はオーバーライドすることができます。このスニペットでは GPU が使用できる場合でも浮動小数点数テンソルと変数を CPU に配置します。デバイスの配置ログをオンにすると(セットアップを参照)、変数が配置されている場所を確認できます。
注:手動配置も機能しますが、配置戦略 を使用したほうがより手軽かつスケーラブルに計算を最適化することができます。
このノートブックを GPU の有無にかかわらず異なるバックエンドで実行すると、異なるログが表示されます。ロギングデバイスの配置は、セッション開始時にオンにする必要があります。
あるデバイスで変数またはテンソルの場所を設定し、別のデバイスで計算を行うことができます。この処理ではデバイス間でデータをコピーする必要があるため、遅延が発生します。
ただし、複数の GPU ワーカーがあっても 1 つの変数のコピーだけが必要な場合は、この処理を実行することができます。
注意: tf.config.set_soft_device_placement
はデフォルトでオンになっているため、このコードは GPU のないデバイスで実行する場合でも実行され、CPU で乗算ステップが発生します。
分散トレーニングの詳細については、ガイドをご覧ください。
次のステップ
変数が一般的にどのように使用されているかを理解するには、自動分散に関するガイドをご覧ください。