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

変数の概要

TensorFlow.orgで表示 GoogleColabで実行 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:  [[1. 2.]
 [3. 4.]]

ほとんどのテンソル操作は期待どおりに変数に対して機能しますが、変数の形状を変更することはできません。

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つの変数に同じ名前を付けることができます。

0bf68b​​e290
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)

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

次のステップ

変数が通常どのように使用されるかを理解するには、自動微分に関するガイドを参照してください。