TensorFlowは初めてです。既存のドキュメントを読んでいると、tensor
という用語が本当に紛らわしいことがわかりました。そのため、次の質問を明確にする必要があります。
tensor
とVariable
、tensor
の関係は何ですかtf.constant
、「テンソル」とtf.placeholder
?TensorFlowにはファーストクラスのTensorオブジェクトがありません。つまり、ランタイムによって実行される基礎となるグラフにはTensor
という概念はありません。代わりに、グラフは、操作を表す互いに接続されたopノードで構成されます。操作は、エンドポイント:0
、:1
などで使用可能な出力にメモリを割り当てます。これらの各エンドポイントはTensor
と考えることができます。 nodename:0
に対応するtensor
がある場合、その値をsess.run(tensor)
またはsess.run('nodename:0')
としてフェッチできます。実行粒度は操作レベルで発生するため、run
メソッドはopを実行し、:0
エンドポイントだけでなく、すべてのエンドポイントを計算します。出力のないOpノード(tf.group
など)を使用することもできます。この場合、テンソルは関連付けられていません。基礎となるOpノードなしでテンソルを持つことはできません。
このようなことを行うことで、基になるグラフで何が起こるかを調べることができます
tf.reset_default_graph()
value = tf.constant(1)
print(tf.get_default_graph().as_graph_def())
したがって、tf.constant
を使用すると、単一の操作ノードを取得し、sess.run("Const:0")
またはsess.run(value)
を使用してフェッチできます。
同様に、value=tf.placeholder(tf.int32)
はPlaceholder
という名前の通常のノードを作成し、feed_dict={"Placeholder:0":2}
またはfeed_dict={value:2}
としてフィードできます。同じsession.run
呼び出しでプレースホルダーをフィードおよびフェッチすることはできませんが、tf.identity
ノードを上部にアタッチしてフェッチすることで結果を確認できます。
変数用
tf.reset_default_graph()
value = tf.Variable(tf.ones_initializer()(()))
value2 = value+3
print(tf.get_default_graph().as_graph_def())
2つのノードVariable
およびVariable/read
を作成することがわかります。:0
エンドポイントは、これらのノードの両方でフェッチする有効な値です。ただし、Variable:0
には特別なref
型があり、これは変更操作への入力として使用できることを意味します。 Python呼び出しtf.Variable
の結果はPython Variable
オブジェクトであり、Variable/read:0
またはVariable:0
に代わるいくつかのPythonマジックがあります突然変異が必要かどうか。ほとんどのopには1つのエンドポイントしかないため、:0
は削除されます。別の例はQueue
です-close()
メソッドは、Close
opに接続する新しいQueue
opノードを作成します。要約すると、Variable
やQueue
のようなpythonオブジェクトの操作は、使用法に応じて異なる基になるTensorFlow opノードにマッピングされます。
複数のエンドポイントを持つノードを作成するtf.split
やtf.nn.top_k
などのopsの場合、Pythonのsession.run
呼び出しは、Tuple
またはTensor
オブジェクトのcollections.namedtuple
で出力を自動的にラップします個別に取得できます。
用語集 から:
テンソルは、型指定された多次元配列です。たとえば、寸法[バッチ、高さ、幅、チャネル]の画像のミニバッチを表す浮動小数点数の4次元配列。
基本的に、すべてのdataはTensorFlowのテンソルです(名前の由来):
sess.run()
の_feed_dict
_引数を使用)var.assign()
で)更新できるテンソルです。技術的には、_tf.Variable
_は_tf.Tensor
_のサブクラスではありませんがtf.constant
_は最も基本的なテンソルであり、作成時に指定された固定値が含まれますただし、グラフでは、すべてのノードが操作であり、入力または出力としてテンソルを使用できます。
他の人がすでに述べたように、はい、それらはすべてテンソルです。
私がそれらを理解したのは、下の図のように、最初に1D、2D、3D、4D、5D、および6Dテンソルを視覚化して理解することです。 (ソース:knoldus)
TensorFlowのコンテキストでは、次のような計算グラフを想像できます。
ここで、Op
sは2つのテンソルa
とb
をinputとして取ります。 テンソルとそれ自体を乗算し、次にaddsこれらの乗算の結果を結果テンソルを生成しますt3
。そして、これらのmultiplicationsとadditionOp
sは計算グラフのノード。
そして、これらのテンソルa
およびb
は、定数テンソル、可変テンソル、またはプレースホルダーにすることができます。同じデータ型と互換性のある形状(またはbroadcast
able)が達成される限り、それは問題ではありません。操作。
TensorFlowの中心的なデータ型はテンソルです。テンソルは、計算の基礎となるコンポーネントであり、TensorFlowの基本的なデータ構造です。複雑な数学的解釈を使用することなく、テンソル(TensorFlow内)は、ランク、形状、およびタイプによって決定されるゼロまたはn次元のデータコレクションを持つ多次元数値配列を記述することができます。詳細: テンソルとはTensorFlow?