300

TensorFlow での行列乗算の入門的な例を使用してきました。

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の出力を確認する方法はありませんか?Tensorsession

4

24 に答える 24

271

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

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

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

これは、このような小さな式にはばかげているように思えるかもしれませんが、Tensorflow 1.x の重要なアイデアの 1 つは遅延実行です。大きくて複雑な式を構築するのは非常に安価であり、それを評価したい場合は、バックエンド ( )に接続すると、Sessionその実行をより効率的にスケジュールできます (たとえば、独立した部分を並行して実行し、GPU を使用します)。


[A]: Python プログラムに返さずにテンソルの値を出力するには、 Andrzej が別の回答で示唆しているようにtf.print()、演算子を使用できます。公式ドキュメントによると:

オペレーターが確実に実行されるようにするには、生成された op をtf.compat.v1.Sessionの run メソッドに渡すか、または ) で指定して、実行された op の制御依存関係として op を使用する必要tf.compat.v1.control_dependencies([print_op]があります。これは標準出力に出力されます。

また、次の点にも注意してください。

Jupyter ノートブックと colab ではtf.print、ノートブック セル出力に出力します。ノートブック カーネルのコンソール ログには書き込まれません。

[B]:値効率的に計算できる場合、この関数を使用してtf.get_static_value()、指定されたテンソルの定数値を取得できる場合があります。

于 2015-11-10T15:41:24.600 に答える
163

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

グラフが評価されるたびに (runまたはを使用して) テンソルの値を確認する最も簡単な方法は、次の例のように操作evalを使用することです。Print

# 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)

ここで、たとえば を使用してグラフ全体を評価すると、次のb.eval()ようになります。

I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3]
于 2016-03-29T23:13:22.653 に答える
28

他の人が言ったことを繰り返しますが、グラフを実行せずに値を確認することはできません。

値を印刷する簡単な例を探している人のための簡単なスニペットは以下のとおりです。コードは 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]]
于 2016-05-31T10:28:56.297 に答える
20

いいえ、グラフを実行 (実行session.run()) しなければ、テンソルの内容を見ることはできません。あなたが見ることができる唯一のものは次のとおりです。

  • テンソルの次元 (ただし、TF が持つ操作のリストを計算するのは難しくないと思います)
  • テンソルの生成に使用される操作のタイプ ( transpose_1:0, random_uniform:0)
  • テンソルの要素の型 ( float32)

これはドキュメントでは見つかりませんでしたが、変数の値 (および一部の定数は割り当て時に計算されない) だと思います。


次の例を見てください。

import tensorflow as tf
from datetime import datetime
dim = 7000

乱数の定数テンソルを開始する最初の例は、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

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

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

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

私が見つけたPSは、ドキュメントで説明されています:

Tensor オブジェクトは操作の結果へのシンボリック ハンドルですが、実際には操作の出力の値を保持しません。

于 2015-11-10T22:20:06.370 に答える
5

TensorFlow Core プログラムは、次の 2 つの個別のセクションで構成されていると考える必要があります。

  • 計算グラフの構築。
  • 計算グラフの実行。

したがって、以下のコードでは、計算グラフを作成するだけです。

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

また、TensorFlow プログラムですべての変数を初期化するには、次のように特別な操作を明示的に呼び出す必要があります。

init = tf.global_variables_initializer()

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

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

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

print(sess.run([product]))
于 2017-07-01T11:49:59.460 に答える
5

Keras を使用できます。1 行の答えは、次のevalような方法を使用することです。

import keras.backend as K
print(K.eval(your_tensor))
于 2019-07-27T15:04:31.997 に答える
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)
于 2017-02-12T14:11:34.543 に答える
2

次のように、セッションでテンソル値を出力できます。

import tensorflow as tf

a = tf.constant([1, 1.5, 2.5], dtype=tf.float32)
b = tf.constant([1, -2, 3], dtype=tf.float32)
c = a * b

with tf.Session() as sess:
    result = c.eval()
   
print(result)
于 2021-02-13T00:40:41.407 に答える
1

バージョン 1.10 以降の tensorflow で導入された熱心な実行を有効にします。使い方はとても簡単です。

# Initialize session
import tensorflow as tf
tf.enable_eager_execution()


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

print(a)
于 2019-05-09T19:33:08.427 に答える
1

https://www.tensorflow.org/api_docs/python/tf/printで提供されているヒントを使用して、log_d関数を使用して書式設定された文字列を出力します。

import tensorflow as tf

def log_d(fmt, *args):
    op = tf.py_func(func=lambda fmt_, *args_: print(fmt%(*args_,)),
                    inp=[fmt]+[*args], Tout=[])
    return tf.control_dependencies([op])


# actual code starts now...

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

with log_d('MAT1: %s, MAT2: %s', matrix1, matrix2): # this will print the log line
    product = tf.matmul(matrix1, matrix2)

with tf.Session() as sess:
    sess.run(product)
于 2019-08-09T16:12:23.053 に答える