TensorFlowでTensorオブジェクトの値を出力する方法は?


259

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

回答:


250

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

プログラミングモデルを試していて、テンソルを簡単に評価する方法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プログラムに返さずにテンソルの値を出力するにtf.print()は、Andrzejが別の回答で提案しているように、演算子を使用できます。公式ドキュメントによると:

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

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

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

[B]:あなたがあります使用することができtf.get_static_value()、その値が効率的に計算可能である場合に与えられたテンソルの一定の値を取得する関数を。


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

5
以下のtf.Print opに関するAndの回答も参照してください。「tensorflow print」を探している間、私はこのstackoverflowの答えを見つけ続けます。このトップの答えは、tf.Print opがないように聞こえます。
Ian Goodfellow

2
答えにいくつかの警告を追加したので、今はもっと明確になるはずです。(元の質問者がテンソルの形状を取得することに興味があったとは思いません。値だけです。)
mrry

1
(tf.Print経由で)コンソールに出力する代わりにファイルに保存する方法はありますか?
タン

tf.Session()Tensorflow 2では機能しませんtf.compat.v1.Session()。代わりに使用できます。
マイク

158

他の答えは正しいですが、グラフを評価するまで値を印刷することはできませんが、一度評価すると、グラフ内の値を実際に印刷する簡単な方法については説明されていません。

グラフが評価されるたびに(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]

37
a = tf.printのaを他の何かに使用することは非常に重要です!tf.print([])は、そうでない場合は何もしません
ファビオ・ディアス

5
そのまま使えますa.eval()
Udayraj Deshmukh 2017

1
@FabioDias私はあなたのポイントを得たと思いませんか?時間があれば親切に説明してください...
yuqli

7
tf.Print()は廃止され、(現在)削除されていることに注意してください。代わりにを使用してくださいtf.print()。docs:tensorflow.org/api_docs/python/tf/Printおよびtensorflow.org/api_docs/python/tf/printを参照してください。
Hephaestus 2018

1
うわー、1年後の@yuqliで自分のコメントを見て驚いただけですが、今は彼の意見を理解しています。この投稿を参照してください。これはまだ非推奨のAPIに関するものですが、アイデアはおそらく似ています。
yuqli

27

他の人が言ったことを繰り返しますが、グラフを実行せずに値をチェックすることは不可能です。

値を出力する簡単な例を探している人のための簡単なスニペットは以下のとおりです。コードは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
参考までに:WARNING:tensorflow:From <ipython-input-25-8583e1c5b3d6>:1: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Instructions for updating: Use 'tf.global_variables_initializer' instead.
Mark Cramer 2017年

20

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

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

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


この例を見てください:

import tensorflow as tf
from datetime import datetime
dim = 7000

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

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

私が見つけたPSはそれがドキュメントで説明されている場合

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


15

いくつかの基本を正しくする必要があると思います。上記の例では、テンソル(多次元配列)を作成しました。しかし、テンソルフローが実際に機能するには、「セッション」を開始し、セッションで操作」を実行する必要があります。「セッション」と「操作」という言葉に注目してください。tensorflowを使用するには、4つのことを知っておく必要があります。

  1. テンソル
  2. 操作
  3. セッション
  4. グラフ

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

printと言うと、定義した変数または定数の形状にのみアクセスします。

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

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

それが役に立てば幸い!


13

Tensorflow 1.x

import tensorflow as tf
tf.enable_eager_execution()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

Tensorflow 2.xでは、eagerモードがデフォルトで有効になっています。したがって、次のコードはTF2.0で動作します。

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

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

1
TensorFlowバージョン1.13.2をインストールして熱心な実行を有効にし(tf.executing_eagerly()で実行しているかどうかを確認し)、カスタム損失関数内のテンソル値を評価しようとすると、エラー「Tensor」オブジェクトに属性「numpy」がありません。私は問題を解決するための助けを本当にいただければ幸いです。
Niko Gamulin、

1
@NikoGamulinは、スクリプトの先頭にtf.compat.v1.enable_eager_execution()を配置していることを確認してください。私はバージョン1.14.0を持っています。私はPyCharmでスクリプトを実行しており、tensor.numpy()は動作します
Tommaso Di Noto

1
@NikoGamulinというエラーは、グラフモードでテンソルにアクセスしようとしたときにのみ表示されます。熱心な実行が適切に有効化されなかったのではないかと思います。熱心な実行をチェックするには、aa = tf.constant(2.0)、b = tf.constant(3.0)、print(tf.add(a、b))を定義するだけです。回答が5.0である場合、eagerは適切に有効化されています。
Vishnuvardhan Janapati

9

上記の回答に基づいて、特定のコードスニペットを使用して、次のように製品を印刷できます。

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

8

Tensorflow 2.0以降(またはEagerモード環境)では、次の.numpy()メソッドを呼び出すことができます。

import tensorflow as tf

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

print(product.numpy()) 

tf.print(product)またprint(product.numpy())、TF 2.0と同じ出力が得られます。
HUSMEN

8

tf.keras.backend.eval 小さな式の評価に役立ちます。

tf.keras.backend.eval(op)

TF 1.xおよびTF 2.0互換。


最小限の検証可能な例

from tensorflow.keras.backend import eval

m1 = tf.constant([[3., 3.]])
m2 = tf.constant([[2.],[2.]])

eval(tf.matmul(m1, m2))
# array([[12.]], dtype=float32)

Sessionまたはを明示的に作成する必要がないため、これは便利ですInteractiveSession


7

積極的実行を有効にすることで、セッションでグラフを実行せずにTensorObjectの出力を確認できます。

次の2行のコードを追加するだけです。 import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

あなたの直後import tensorflow

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

現在(2017年11月)、熱心な実行を可能にするには、Tensorflowナイトリービルドをインストールする必要があることに注意してください。組み立て済みのホイールはここにあります


5

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

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

4

あなたはKerasを使うことができます、一行の答えはevalそのような方法を使うことです:

import keras.backend as K
print(K.eval(your_tensor))

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)

2

これを実行するまでは、すべての回答を読んだ後でも、何が必要なのかわかりませんでした。TensofFlowは私にとっても新しいものです。

def printtest():
x = tf.constant([1.0, 3.0])
x = tf.Print(x,[x],message="Test")
init = (tf.global_variables_initializer(), tf.local_variables_initializer())
b = tf.add(x, x)
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(b))
    sess.close()

ただし、セッションの実行によって返される値が必要になる場合があります。

def printtest():
    x = tf.constant([100.0])
    x = tf.Print(x,[x],message="Test")
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    b = tf.add(x, x)
    with tf.Session() as sess:
        sess.run(init)
        c = sess.run(b)
        print(c)
        sess.close()

1

基本的に、テンソルフローでは、あらゆる種類のテンソルを作成すると、テンソルフローセッションを実行するときにのみアクセスできる内部に作成および格納されます。定数テンソルを作成した
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
としましょう。セッションを実行しなくても、
- op:オペレーションを取得できます。このテンソルを計算する演算。
- value_index:int。このテンソルを生成する操作のエンドポイントのインデックス。
- dtype:DType。このテンソルに格納される要素のタイプ。

値を取得するには、必要なテンソルを使用してセッションを実行します。

with tf.Session() as sess:
    print(sess.run(c))
    sess.close()

出力は次のようになります。

array([[1。、2.、3.]、[4.、5.、6.]]、dtype = float32)


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)

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)

0
import tensorflow as tf
sess = tf.InteractiveSession()
x = [[1.,2.,1.],[1.,1.,1.]]    
y = tf.nn.softmax(x)           

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

print(product.eval())
tf.reset_default_graph()
sess.close()

0

tf.Printは非推奨になりました。代わりにtf.print(小文字のp)を使用する方法を次に示します。

セッションを実行することは良いオプションですが、常に実行できるとは限りません。たとえば、特定のセッションでテンソルを出力したい場合があります。

新しいprintメソッドは、出力テンソルのない印刷操作を返します。

print_op = tf.print(tensor_to_print)

出力がないため、tf.Printの場合と同じようにグラフに挿入することはできません。代わりに、それを追加して、セッションの依存関係を制御し、印刷させることができます。

sess = tf.compat.v1.Session()
with sess.as_default():
  tensor_to_print = tf.range(10)
  print_op = tf.print(tensor_to_print)
with tf.control_dependencies([print_op]):
  tripled_tensor = tensor_to_print * 3
sess.run(tripled_tensor)

場合によっては、より大きなグラフで、サブ関数で部分的に作成されることもあり、print_opをセッション呼び出しに伝達するのは面倒です。次に、tf.tupleを使用して、印刷操作を別の操作と結合し、どのセッションがコードを実行しても、その操作で実行できます。これがどのように行われるかです:

print_op = tf.print(tensor_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.

-2

質問:TensorFlowでTensorオブジェクトの値を出力する方法は?

回答:

import tensorflow as tf

# Variable
x = tf.Variable([[1,2,3]])

# initialize
init = (tf.global_variables_initializer(), tf.local_variables_initializer())

# Create a session
sess = tf.Session()

# run the session
sess.run(init)

# print the value
sess.run(x)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.