2015-11-10 16 views
131

私は、TensorFlowでの行列乗算の導入例を使用しています。私は、製品を印刷するときTensorFlowでTensorオブジェクトの値をプリントする方法は?

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

、それはTensorオブジェクトとして表示されます。

<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0> 

しかし、どのように私はproductの価値を知っていますか?次

は役立ちません:

print product 
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

を私はグラフがSessions上で実行することを知っているが、そこに私はsessionでグラフを実行せずにTensorオブジェクトの出力を確認することができますどのような方法ではないでしょうか?

答えて

134

Tensorオブジェクトの実際の価値を評価する最も簡単な方法は、* Session.run()メソッドに渡し、またはデフォルトのセッションがある場合Tensor.eval()を呼び出す(with tf.Session():ブロックで、すなわち、または下記参照)することです。一般的に、**セッションでいくつかのコードを実行することなくテンソルの値を出力することはできません。

あなたはプログラミングモデルで実験し、テンソルを評価するための簡単な方法をしたいしている場合は、tf.InteractiveSessionはあなたのプログラムの開始時にセッションを開き、すべてのTensor.eval()(およびOperation.run())コールのためにそのセッションを使用することができます。 Sessionオブジェクトをどこかに渡すのが面倒なときに、シェルやIPythonノートブックなどのインタラクティブな設定で簡単にすることができます。

Tensorflowの重要なアイデアの1つは、遅延実行です。大規模で複雑な表現を作成するのには非常に安価です。評価する場合は、 (Sessionで接続している)エンドは、実行をより効率的にスケジュールすることができます(例えば、独立したパーツを並行して実行し、GPUを使用するなど)。


*  あなたのPythonプログラムに戻さずテンソルの値を印刷するには、Andrzej suggests in another answerとして、tf.Print()演算子を使用することができます。このオペレーションの出力を見るにはグラフの一部を実行する必要があります。これは標準出力に出力されます。分散型のTensorFlowを実行している場合、tf.Print()は、その出力を、そのopが実行されているタスクの標準出力に出力します。

**  あなた定数テンソルの値を取得するために、実験tf.contrib.util.constant_value()機能を使用することができるかもしれないが、それは一般的な使用のために意図されていない、そしてそれは多くのオペレータのために定義されていません。

+8

Session.run()を呼び出さずにTensorの属性を取得することは可能です。たとえば、tensor.get_shape()を呼び出すことができます。多くの場合、デバッグに十分な情報が得られます。 –

+3

下記のtf.PrintについてのAndの答え。私は "tensorflow print"のためのグーグルでこのstackoverflow答えを見つけ出しています。そして、このトップの答えはtf.Print opがないように聞こえます。 –

+1

私は答えにいくつかの警告を追加したので、今はっきりしているはずです。 (元の質問者がテンソルの形を得ることに興味があったとは思えません。値はちょうど) – mrry

15

いいえ、グラフを実行しないで(session.run())テンソルの内容が表示されません。

  • テンソルの次元(私はTFがありlist of the operationsのためにそれを計算することは難しいことではありませんと仮定)を生成するために使用される操作の
  • タイプ:あなたが見ることができる唯一のものがありますテンソル(transpose_1:0random_uniform:0
  • テンソルの要素の種類(float32

私は、マニュアルでこれを見つけていないが、私は、変数の値(と定数の一部と考えてい割り当て時には計算されません)。


この例を見てみましょう:

import tensorflow as tf 
from datetime import datetime 
dim = 7000 

は、私はちょうど乱数の定数テンソルを開始する最初の例は、約irrespectibly DIM(0:00:00.003261)の同じ時間を実行

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
print datetime.now() - startTime 

2番目のケースでは、定数が実際に評価され、値が割り当てられる場合、時間は明らかにdim(0:00:01.244642

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
sess = tf.Session() 
sess.run(m1) 
print datetime.now() - startTime 

そして、あなたは時間がO(dim^2.8)に実行されることを念頭に置いて、何か(d = tf.matrix_determinant(m1)を計算することによって、それがより明確にすることができます)

P.S.

テンソルオブジェクトは、操作の結果、 へのシンボリックハンドルですが、実際に操作の出力の値を保持していない:私は、それがdocumentationで説明されていた発見しました。

101

グラフを評価するまで値を印刷できないという正しい回答はありますが、実際にグラフ内の値を実際に印刷する簡単な方法はありません。

# Initialize session 
import tensorflow as tf 
sess = tf.InteractiveSession() 

# Some tensor we want to print the value of 
a = tf.constant([1.0, 3.0]) 

# Add print operation 
a = tf.Print(a, [a], message="This is a: ") 

# Add more elements of the graph using a 
b = tf.add(a, a) 

を今、私たちは全体を評価するたび:(runまたはevalを使用して)

グラフが評価されるたびにテンソルの値を参照する最も簡単な方法は、この例のようにPrint操作を使用することですグラフ、例えばb.eval()を使用して、我々が得る:

他の人が言ったことを改めて表明
I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 
+18

a = tf.printのaを他のものに使用することは非常に重要です! tf.print(a、[a])はそれ以外は何もしません –

+1

'a.eval()'を使うことができます! –

17

、そのことはできませんが、グラフを実行せずに値をチェックします。

値を簡単に印刷する方法を探している人のための簡単なスニペットは次のとおりです。コードはipythonノートブック内の任意の変更を加えることなく実行することができ

import tensorflow as tf 

#define a variable to hold normal random values 
normal_rv = tf.Variable(tf.truncated_normal([2,3],stddev = 0.1)) 

#initialize the variable 
init_op = tf.initialize_all_variables() 

#run the graph 
with tf.Session() as sess: 
    sess.run(init_op) #execute init_op 
    #print the random values that we sample 
    print (sess.run(normal_rv)) 

出力:あなたの特定のコードで上記の回答に基づいて

[[-0.16702934 0.07173464 -0.04512421] 
[-0.02265321 0.06509651 -0.01419079]] 
+2

FYI: '警告:テンソルフロー:から:1:initialize_all_variables(tensorflow.python.ops.variablesから)は廃止され、2017-03-02の後に削除されます。 更新手順: 代わりに 'tf.global_variables_initializer'を使用してください.' –

6

は、あなたがこのような製品を印刷することができスニペット:

import tensorflow as tf 
#Initialize the session 
sess = tf.InteractiveSession() 

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

#print the product 
print(product.eval()) 

#close the session to release resources 
sess.close() 
3

この簡単なコードを試してみてください! (それは自明です)

import tensorflow as tf 
sess = tf.InteractiveSession() # see the answers above :) 
x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax 
y = tf.nn.softmax(x)   # this is the softmax function 
           # you can have anything you like here 
u = y.eval() 
print(u) 
7

私はあなたがいくつかの基本的な権利を得る必要があると思います。上の例では、テンソル(多次元配列)を作成しています。しかし、テンソルフローが実際に動作するには、 "セッション"を起動し、セッションで "操作"を実行する必要があります。 「セッション」と「操作」という単語に注目してください。 あなたがtensorflowで動作するように4つの事を知っておく必要があります。

  1. テンソル
  2. 操作
  3. セッションを
  4. グラフ
  5. あなたはテンソルを与えているうちに書いたものとは今

、および操作は実行されていますが、実行中のセッションもグラフもありません。テンソル(グラフのエッジ)はグラフを流れ、操作(グラフのノード)によって操作されます。デフォルトのグラフはありますが、セッション内でグラフを開始することができます。

印刷すると、定義した変数または定数の形状にしかアクセスできません。

だからあなたはあなたが欠落しているものを見ることができます。

with tf.Session() as sess:  
      print(sess.run(product)) 
      print (product.eval()) 

はそれが役に立てば幸い!

2

tf.Print()がテンソル名を変更することに注意してください。 印刷しようとしているテンソルがプレースホルダーの場合は、フィード中に元の名前が見つからないため、データをフィードすることはできません。 例えば:

import tensorflow as tf 
tens = tf.placeholder(tf.float32,[None,2],name="placeholder") 
print(eval("tens")) 
tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") 
print(eval("tens")) 
res = tens + tens 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print(sess.run(res)) 

出力は次のとおりです。

python test.py 
Tensor("placeholder:0", shape=(?, 2), dtype=float32) 
Tensor("Print:0", shape=(?, 2), dtype=float32) 
Traceback (most recent call last): 
[...] 
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 
4

あなたは2つの個別のセクションからなるものとしてTensorFlowコアプログラムを考える必要があります。

  • 計算グラフを構築します。
  • 計算グラフを実行しています。

以下のコードでは、計算グラフを作成します。

あなたは次のように明示的に特別な操作を呼び出す必要があり、TensorFlowプログラム内のすべての変数を初期化するためにも必要
matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

init = tf.global_variables_initializer() 

今、あなたはグラフを構築し、すべての変数を初期化し、次のステップはありますノードを評価するには、セッション内で計算グラフを実行する必要があります。セッションは、TensorFlowランタイムのコントロールと状態をカプセル化します。

次のコードは、Sessionオブジェクトを作成し、productを評価するために、計算、グラフを十分に実行するための実行メソッドを呼び出します:

sess = tf.Session() 
// run variables initializer 
sess.run(init) 

print(sess.run([product])) 
2

あなたは、セッション中に、グラフを実行せずにTensorObjectの出力を確認することができますeager executionを有効にしてください。右あなたimport tensorflow import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

単純に次の2つのコード行を追加します。

あなたの例ではprint productの出力は、今のようになります。 tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

ノート(2017年11月)今のところ、あなたが熱心な実行を可能にするために構築毎晩Tensorflowをインストールする必要がありますということ。中古ホイールはhereです。