2016-09-15 5 views
10

以下の4つのバリエーションの実用的な違いについては分かりません(すべて同じ値に評価されています)。私が理解しているのは、tfに電話すると、となり、グラフ上で操作が作成されます。そうでなければ、となります。最初にtf.constant()を作成しないと、追加を行うときに定数が暗黙的に作成されると考えられます。 tf.add(a,b)a + bの場合、abの両方がテンソル(#1と#3)の場合、デフォルトのネーミング(前者はAdd、後者はadd)と違いはありません。誰もがそれらの違いについていくつかの光を当てることができます、そして、いつそれぞれを使用する必要がありますか?TensorFlow簡単操作:テンソルとPythonの変数

## 1 
a = tf.constant(1) 
b = tf.constant(1) 
x = tf.add(a, b) 
with tf.Session() as sess: 
    x.eval() 

## 2 
a = 1 
b = 1 
x = tf.add(a, b) 
with tf.Session() as sess: 
    x.eval() 

## 3 
a = tf.constant(1) 
b = tf.constant(1) 
x = a + b 
with tf.Session() as sess: 
    x.eval() 

## 4 
a = 1 
b = tf.constant(1) 
x = a + b 
with tf.Session() as sess: 
    x.eval() 

答えて

11

与えられた4つの例は、同じ結果を与え、同じグラフを生成します(グラフの操作名の一部が異なる場合は無視します)。 TensorFlowは、多くの異なるPythonオブジェクトをtf.add()などのTensorFlow演算子に引数として渡すと、tf.Tensorオブジェクトに変換します。 +演算子は、tf.add()の単なるラッパーであり、左辺または右辺のいずれかの引数がtf.Tensor(またはtf.Variable)の場合にオーバーロードが使用されます。

多くのPythonオブジェクトをTensorFlow演算子に渡すことができるとすれば、なぜtf.constant()を使用するのですか?いくつかの理由があります:あなたは、複数の異なる操作への引数と同じPythonオブジェクトを使用する場合は

  • は、TensorFlowはテンソル複数回に変換し、グラフのものテンソルのそれぞれを表すことになります。したがって、Pythonオブジェクトが大きなNumPy配列である場合、その配列のデータのコピーが多すぎるとメモリが不足する可能性があります。その場合は、明示的にあなたがTensorBoardのデバッグやグラフの視覚化のために役立つことができ、そのnameプロパティを設定することができますtf.constant()を作成tf.Tensor一度

  • に配列を変換したいことがあります。ただし、デフォルトのTensorFlow操作では、opの引数の名前に基づいて、自動的に変換されたテンソルに意味のある名前を付けることになります)。tf.constant()を明示的に作成すると、テンソル。 TensorFlowは、Python intオブジェクトをtf.int32に、floatオブジェクトをtf.float32に変換します。 tf.int64またはtf.float64が必要な場合は、同じ値をtf.constant()に渡して明示的にdtype引数を渡して、これを取得できます。

  • 繰り返し値を有する大きなテンソルを作成する場合tf.constant()機能も便利な機能を提供しています:

    c = tf.constant(17.0, shape=[1024, 1024], dtype=tf.float32) 
    

    テンソル上記cは、データの4×1024×1024バイトを表すが、TensorFlowはでコンパクトに表現しますグラフは単一の浮動小数点として17.0に加えて、どのように解釈されるべきかを示す形状情報を含む。グラフに大量の充てんされた定数が多数ある場合は、このように作成する方が効率的です。

2

これらはすべて同じです。

a + bの中の '+'はテンソルフローによって捕捉され、実際にはtf.add(a、b)と同じopを生成します。

tf.conctantは、作成されたテンソルの形状、タイプ、名前の定義など、より詳細な情報を提供します。しかし、やはりテンソルフローはあなたの例ではa = 1であり、tf.constant(1)と同等です(この場合は定数をint値として扱います)

2

結果は同じです(addまたは__add__、それは+のオーバーロードです)、オペランドにtf.convert_to_tensorを呼び出します。

tf.add(a + b)a + bの違いは、前者がnameパラメータで操作に名前を付けることができるということです。後者は、代わりに、あなたにこの能力を与えないし、計算がPythonインタプリタによって行われ、Tensorflow環境の外部ではなく可能になるようにします。

これは、abの両方がオブジェクトではなく、Tensorではないため、Tensorflowが計算に関与しない場合に発生します。

関連する問題