このページは Cloud Translation API によって翻訳されました。
Switch to English

変数の概要

TensorFlow.orgで見る Google Colabで実行 GitHubでソースを表示する ノートブックをダウンロード

TensorFlow 変数は、プログラムが操作する共有された永続的な状態を表すための推奨される方法です。このガイドでは、 tf.Variableでtf.Variableのインスタンスを作成、更新、管理する方法について説明します。

変数は、 tf.Variableクラスを介して作成および追跡されます。 tf.Variableは、その上でopsを実行することによって値を変更できるテンソルを表します。特定の演算を使用すると、このテンソルの値を読み取って変更できます。以下のような高いレベルのライブラリtf.keras使用tf.Variable格納するモデルパラメータに。

セットアップ

このノートブックでは、変数の配置について説明します。変数が配置されているデバイスを確認するには、この行のコメントを外します。

 import tensorflow as tf

# Uncomment to see where your variables get placed (see below)
# tf.debugging.set_log_device_placement(True)
 

変数を作成する

変数を作成するには、初期値を指定します。 tf.Variable同じになりますdtype初期値としてを。

 my_tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
my_variable = tf.Variable(my_tensor)

# Variables can be all kinds of types, just like tensors
bool_variable = tf.Variable([False, False, False, True])
complex_variable = tf.Variable([5 + 4j, 6 + 1j])
 

変数はテンソルのように見え、動作します。実際、変数はtf.Tensorによってサポートされるデータ構造tf.Tensor 。テンソルのように、それらにはdtypeと形状があり、NumPyにエクスポートできます。

 print("Shape: ",my_variable.shape)
print("DType: ",my_variable.dtype)
print("As NumPy: ", my_variable.numpy)
 
Shape:  (2, 2)
DType:  <dtype: 'float32'>
As NumPy:  <bound method BaseResourceVariable.numpy of <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>>

ほとんどのテンソル操作は、変数を期待どおりに処理しますが、変数は再形成できません。

 print("A variable:",my_variable)
print("\nViewed as a tensor:", tf.convert_to_tensor(my_variable))
print("\nIndex of highest value:", tf.argmax(my_variable))

# This creates a new tensor; it does not reshape the variable.
print("\nCopying and reshaping: ", tf.reshape(my_variable, ([1,4])))
 
A variable: <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>

Viewed as a tensor: tf.Tensor(
[[1. 2.]
 [3. 4.]], shape=(2, 2), dtype=float32)

Index of highest value: tf.Tensor([1 1], shape=(2,), dtype=int64)

Copying and reshaping:  tf.Tensor([[1. 2. 3. 4.]], shape=(1, 4), dtype=float32)

上記のように、変数はテンソルによって支えられています。 tf.Variable.assignを使用してテンソルを再割り当てできます。 assign呼び出しても、(通常は)新しいテンソルは割り当てられません。代わりに、既存のテンソルのメモリが再利用されます。

 a = tf.Variable([2.0, 3.0])
# This will keep the same dtype, float32
a.assign([1, 2]) 
# Not allowed as it resizes the variable: 
try:
  a.assign([1.0, 2.0, 3.0])
except Exception as e:
  print(f"{type(e).__name__}: {e}")
 
ValueError: Shapes (2,) and (3,) are incompatible

演算でテンソルのような変数を使用する場合、通常はバッキングテンソルで演算します。

既存の変数から新しい変数を作成すると、バッキングテンソルが複製されます。 2つの変数が同じメモリを共有することはありません。

 a = tf.Variable([2.0, 3.0])
# Create b based on the value of a
b = tf.Variable(a)
a.assign([5, 6])

# a and b are different
print(a.numpy())
print(b.numpy())

# There are other versions of assign
print(a.assign_add([2,3]).numpy())  # [7. 9.]
print(a.assign_sub([7,9]).numpy())  # [0. 0.]
 
[5. 6.]
[2. 3.]
[7. 9.]
[0. 0.]

ライフサイクル、命名、監視

PythonベースのTensorFlowでは、 tf.Variableインスタンスのライフサイクルは他のPythonオブジェクトと同じです。変数への参照がない場合、変数は自動的に割り当て解除されます。

変数には名前を付けることもでき、変数の追跡とデバッグに役立ちます。 2つの変数に同じ名前を付けることができます。

 # Create a and b; they have the same value but are backed by different tensors.
a = tf.Variable(my_tensor, name="Mark")
# A new variable with the same name, but different value
# Note that the scalar add is broadcast
b = tf.Variable(my_tensor + 1, name="Mark")

# These are elementwise-unequal, despite having the same name
print(a == b)
 
tf.Tensor(
[[False False]
 [False False]], shape=(2, 2), dtype=bool)

変数名は、モデルを保存およびロードするときに保持されます。デフォルトでは、モデル内の変数は一意の変数名を自動的に取得するため、必要がない限り、自分で割り当てる必要はありません。

変数は区別するために重要ですが、一部の変数は区別する必要はありません。作成時にtrainableをfalseに設定することで、変数の勾配をオフにすることができます。勾配を必要としない変数の例は、トレーニングステップカウンターです。

 step_counter = tf.Variable(1, trainable=False)
 

変数とテンソルの配置

パフォーマンスを向上させるために、TensorFlowはテンソルと変数を、そのdtypeと互換性のある最速のデバイスに配置しようとします。これは、GPUが利用可能な場合、ほとんどの変数がGPUに配置されることを意味します。

ただし、これはオーバーライドできます。このスニペットでは、GPUが利用可能であっても、浮動小数点テンソルと変数をCPUに配置できます。デバイス配置ログをオンにすると( セットアップを参照)、変数が配置されている場所を確認できます。

このノートブックをGPUの有無にかかわらず異なるバックエンドで実行すると、異なるログが表示されます。 ロギングデバイスの配置は、セッションの開始時にオンにする必要があることに注意してください。

 with tf.device('CPU:0'):

  # Create some tensors
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
  c = tf.matmul(a, b)

print(c)
 
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

あるデバイスで変数またはテンソルの場所を設定し、別のデバイスで計算を行うことができます。デバイス間でデータをコピーする必要があるため、これにより遅延が発生します。

ただし、複数のGPUワーカーがあり、変数のコピーが1つだけ必要な場合は、これを行うことができます。

 with tf.device('CPU:0'):
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.Variable([[1.0, 2.0, 3.0]])

with tf.device('GPU:0'):
  # Element-wise multiply
  k = a * b

print(k)
 
tf.Tensor(
[[ 1.  4.  9.]
 [ 4. 10. 18.]], shape=(2, 3), dtype=float32)

分散トレーニングの詳細については、ガイドをご覧ください

次のステップ

変数の一般的な使用方法については、 自動配信に関するガイドをご覧ください。