TensorFlow 2.0 Alpha : ガイド : Variables (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/11/2019
* 本ページは、TensorFlow の本家サイトの TF 2.0 Alpha の以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
ガイド : Variables
TensorFlow 変数は貴方のプログラムで操作される共有される、持続性のある状態を表わすために最善の方法です。
変数は tf.Variable クラスを通して操作されます。tf.Variable は tensor を表し、その値はその上で ops を実行することにより変更できます。特定の ops はこの tensor の値を読みそして変更することを可能にします。tf.keras のような高位ライブラリはモデル・パラメータをストアするために tf.Variable を使用します。このガイドは TensorFlow で tf.Variables をどのように作成し、更新しそして管理するかをカバーしています。
変数を作成する
変数を作成するには、単純に初期値を提供します。
my_variable = tf.Variable(tf.zeros([1., 2., 3.]))
これはゼロで満たされた shape [1, 2, 3] を持つ 3 次元 tensor である変数を作成します。この変数はデフォルトでは dtype tf.float32 を持ちます。dtype は指定されなければ、初期値から推論されます。
アクティブな tf.device スコープがあれば、変数はそのデバイス上に置かれます ; そうでなければ変数はその dtype と互換な “最速の” デバイス上に置かれるでしょう (これは一つの GPU が利用可能であれば殆どの変数は自動的に GPU 上に置かれることを意味します)。例えば、次のスニペットは v という名前の変数を作成してそれを 2 番目の GPU デバイス上に置きます :
with tf.device("/device:GPU:1"): v = tf.Variable(tf.zeros([10, 10]))
理想的には tf.distribute API を使用するべきですが、何故ならばそれはコードを一度だけ書いてそれを多くの異なる分散セットアップ下で動作させることを可能にするからです。
変数を使用する
TensorFlow グラフで tf.Variable の値を使用するには、単純にそれを通常の tf.Tensor のように扱います :
v = tf.Variable(0.0) w = v + 1 # w is a tf.Tensor which is computed based on the value of v. # Any time a variable is used in an expression it gets automatically # converted to a tf.Tensor representing its value.
値を変数に割り当てるには、tf.Variable クラスのメソッド assign, assign_add そして friends を使用します。例えば、ここにこれらのメソッドをどのように呼び出すかがあります :
v = tf.Variable(0.0) v.assign_add(1)
殆どの TensorFlow optimizer はある勾配降下-like なアルゴリズムに従って変数の値を効率的に更新する特別な ops を持ちます。optimizer をどのように使用するかの説明については tf.keras.optimizers.Optimizer を見てください。
read_value を使用して、変数の現在値を明示的に読むこともまたできます :
v = tf.Variable(0.0) v.assign_add(1) v.read_value() # 1.0
tf.Variable への最後の参照がスコープから出るときにそのメモリは解放されます。
変数を追跡し続ける
TensorFlow の変数は Python オブジェクトです。層、モデル、optimizer そして他の関連ツールを構築するとき、貴方は (例えば) モデルの総ての変数のリストを得ることを望みがちでしょう。
貴方自身の Python コードで変数をその場しのぎで追跡し続けられる一方で tf.Module を変数を所有する貴方のクラスの基底クラスとして使用することを推奨します。tf.Module のインスタンスは変数と (潜在的には他のモジュールを通り抜ける) そのモデルから到達可能な総ての (訓練可能な) 変数を返す trainable_variables メソッドを持ちます。
class MyModuleOne(tf.Module): def __init__(self): self.v0 = tf.Variable(1.0) self.vs = [tf.Variable(x) for x in range(10)] class MyOtherModule(tf.Module): def __init__(self): self.m = MyModuleOne() self.v = tf.Variable(10.0) m = MyOtherModule() len(m.variables) # 12; 11 from m.m and another from m.v
層を実装する場合、tf.keras.Layer がより良い基底クラスかもしれないことに注意してください、何故ならばそのインターフェイスを実装することは貴方の層を完全に Keras に統合させて、model.fit と他の上手く統合された API を使用することを可能にするからです。tf.keras.Layer の変数追跡は tf.Module のそれと同一です。
以上