2016-06-16 5 views
22

私はTensorFlowを初めて使用しています。私は書類を読んでいるうちに。私は用語tensorが本当に混乱していることを発見しました。 tensorVariableとの関係はどうですか、tensorと対tf.constant、 'テンソル'対tf.placeholder?彼らはすべてのタイプのテンソルですか? glossaryからTensorFlowの用語「テンソル」を理解するには?

+0

はい、テンソルはオブジェクトのようなものですが、変数などの文字列になる可能性があります。 –

+0

TensorFlowに**データ**と**操作**が何であるか理解していると、この質問に役立ちます。 – zhy

答えて

42

TensorFlowにはファーストクラスのTensorオブジェクトがありません。つまり、実行時に実行される基になるグラフにはTensorという概念はありません。その代わりに、グラフは、オペレーションを表す相互に接続されたオペレーションノードからなる。オペレーションは、その出力にメモリを割り当てます。これはエンドポイント:0,:1などで利用でき、これらのエンドポイントはそれぞれTensorと考えることができます。 nodename:0に対応するtensorがある場合は、その値をsess.run(tensor)またはsess.run('nodename:0')として取得できます。実行粒度は操作レベルで発生するため、runメソッドはop30を実行し、:0エンドポイントだけでなく、すべてのエンドポイントを計算します。出力がないOpノード(例えば、tf.group)を持つことができます。この場合、テンソルが関連付けられていません。基礎となるOpノードなしでテンソルを持つことはできません。

あなたはtf.constantを使用すると、単一の操作ノードを取得し、あなたが同様にsess.run("Const:0")またはsess.run(value)

を使用して、それを取り出すことができますので、この

tf.reset_default_graph() 
value = tf.constant(1) 
print(tf.get_default_graph().as_graph_def()) 

ような何かを行うことで基本的なグラフで何が起こるか調べることができ、value=tf.placeholder(tf.int32)名前がPlaceholderの通常のノードが作成され、feed_dict={"Placeholder:0":2}またはfeed_dict={value:2}としてフィードできます。同一のsession.runコールでプレースホルダをフィードして取得することはできませんが、その上にtf.identityノードを付けて取得して結果を確認できます。あなたは、2つのノードVariableVariable/readを作成していることがわかります変数

tf.reset_default_graph() 
value = tf.Variable(tf.ones_initializer()(())) 
value2 = value+3 
print(tf.get_default_graph().as_graph_def()) 

については

:0エンドポイントは、これらのノードの両方にフェッチするための有効な値です。しかし、Variable:0には、refという特殊タイプがあります。これは、それが突然変異操作への入力として使用できることを意味します。 Python呼び出しtf.Variableの結果はPython Variableオブジェクトであり、突然変異が必要かどうかによって、Variable/read:0またはVariable:0を代用するPythonの魔法があります。ほとんどのオペレーションは1つのエンドポイントしか持たないので、:0は削除されます。もう1つの例はQueue-close()で、Queue opに接続する新しいCloseオペレーションノードを作成します。要約すると、VariableQueueのようなpythonオブジェクトの操作は、使用方法に応じて異なる基礎となるTensorFlowオペレーションノードにマップされます。 tf.splitまたは複数のエンドポイントとノードを作成tf.nn.top_k、Pythonのsession.runコールのようなOPSについて

が自動的tupleあるいは個別に取り出すことができるTensorオブジェクトのcollections.namedtupleに出力をラップ。

+0

「ファーストクラスのテンソルオブジェクト」はどういう意味ですか? 'tf.Tensor'というクラスがあります。可能であれば、例を使って説明することができます。 –

+0

下のグラフにテンソルはありません。他の操作に接続されているops –

+0

操作にはどのようにアクセスしますか?操作の入力と出力のみに直接アクセスできますか? –

9

テンソルは、入力した多次元配列です。たとえば、次元[バッチ、高さ、幅、チャネル]を持つイメージのミニバッチを表す浮動小数点数の4次元配列。

基本的に、すべてのデータはTensorFlowにおけるテンソル(名前)です:

  • プレースホルダを使用すると、(sess.run()feed_dict引数を指定して)値を供給することができますするテンソル
  • です変数は更新可能なテンソル(var.assign())です。
  • tf.constantしかし、グラフに、すべてのノードがあり、あなたがそれ

を作成するときに指定した固定値が含まれているだけで、最も基本的なテンソル、ですが、厳密に言えば、tf.Variabletf.Tensorのサブクラスではありませんオペレーションは、入力または出力としてテンソルを持つことができます。

+3

私は同意しません。 テンソルフローのセクション2を見ると、「TensorFlowグラフでは、各ノードに0以上の入力があります。 と0以上の出力があり、操作のインスタンス化 を表しています。変数、定数、およびプレースホルダーは、tf.mulやtf.addのようなOPERATIONSのインスタンス化というノードです。私は彼らが出力としてテンソルを生成すると思うが、彼ら自身がテンソルではない。 – ZijunLost

+0

はい、グラフは、それらの間にTensorsを渡す操作で構成されています。私はテンソルを更新して、 'tf.constant'と' tf.placeholder'に結びついた操作を説明します –

+2

ありがとうございますが、プレースホルダや定数をテンソルを生成する '演算'テンソル "と呼ばれる。ドキュメントを読むと:「TensorFlowは、実行時にデータを入力する必要があるプレースホルダ操作を提供します。詳細については、データのフィードに関する節を参照してください。 – ZijunLost

1

既に述べたように、はい、すべてテンソルです。

私がそれらを理解する方法は、下の図のように1D、2D、3D、4D、5D、および6Dのテンソルを最初に視覚化して理解することです。 (ソース:knoldus

tensor-definition

さて、TensorFlowの文脈では、あなたは以下のような計算グラフを想像することができます。ここ

computation-graph

、入力ように、2つのテンソルabをとります。 とテンソルを掛け合わせた後、はこれらの乗算の結果をと加算して結果のテンソルt3を生成します。そして、これらのの乗算の追加Opは、計算グラフのノードで発生します。

これらのテンソルは、定数テンソル、可変テンソル、またはプレースホルダにすることができます。操作を達成するのに同じデータ型と互換性のある形状(またはbroadcastが可能)であれば問題ありません。

関連する問題