私は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
上で実行されることを知っていますが、Tensor
内でグラフを実行せずにsession
オブジェクトの出力を確認する方法はありませんか。
最も簡単[A] Tensor
オブジェクトの実際の値を評価する方法は、それをSession.run()
メソッドに渡すか、デフォルトのセッションがあるときにTensor.eval()
を呼び出します(つまり、with tf.Session():
ブロックで、または以下を参照)。一般に[B]、セッションでコードを実行せずにテンソルの値を出力することはできません。
プログラミングモデルを実験しており、テンソルを簡単に評価する方法が必要な場合は、 tf.InteractiveSession
を使用すると、プログラムの開始時にセッションを開き、そのセッションをすべてのTensor.eval()
(およびOperation.run()
)呼び出します。これは、ShellやIPythonノートブックなどのインタラクティブな設定では、Session
オブジェクトをどこにでも渡すのが面倒な場合に簡単です。
これは、このような小さな式では愚かに見えるかもしれませんが、Tensorflowの重要なアイデアの1つは遅延実行です。大きく複雑な式を作成するのは非常に安価ですそして、あなたがそれを評価したいとき、バックエンド(Session
で接続する)は、その実行をより効率的にスケジュールすることができます(例えば、独立した部分を並列に実行し、GPUを使用します)。
[A]:テンソルの値をPythonプログラムに返さずに出力するには、 tf.Print()
演算子を使用できます。これは Andrzejが別の回答で提案しています 。標準出力に出力されるこのopの出力を表示するには、グラフの一部を実行する必要があることに注意してください。分散TensorFlowを実行している場合、tf.Print()
は、そのopが実行されるタスクの標準出力に出力を出力します。つまり、たとえば https://colab.research.google.com または他のJupyterノートブックを使用すると、表示されませんノートブックの tf.Print()
の出力。その場合、まだ印刷する方法については this answer を参照してください。
[B]:あなたはmight実験的な tf.contrib.util.constant_value()
関数を使用して定数テンソルの値を取得できますが、一般的な使用を目的としておらず、多くの演算子に対して定義されていません。
グラフを評価するまで値を印刷できないという答えは他にもありますが、評価した後でグラフ内に値を実際に印刷する簡単な方法については説明しません。
グラフが評価されるたびに(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]
他の人が言ったことを繰り返しますが、グラフを実行せずに値を確認することは不可能です。
値を印刷する簡単な例を探している人のための簡単なスニペットは以下の通りです。 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]]
いいえ、グラフを実行しないとテンソルの内容を見ることはできません(session.run()
を実行)。あなたが見ることができる唯一のものは以下のとおりです。
transpose_1:0
、random_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)
で実行されることに注意してください)
P.S ドキュメンテーション で説明されていることがわかりました。
Tensorオブジェクトは操作の結果へのシンボリックハンドルですが、実際には操作の出力の値を保持しません。
私はあなたがいくつかの基礎を正しくする必要があると思います。上記の例でテンソル(多次元配列)を作成しました。しかし、テンソル流が実際にうまくいくためには、 " session "を開始してセッションで " operation "を実行する必要があります。 「セッション」と「操作」という単語に注目してください。テンソル流を扱うには、4つのことを知っておく必要があります。
今あなたが書いたものからあなたはテンソルと操作を与えました、しかしあなたは走っているセッションもグラフも持っていません。テンソル(グラフの端)はグラフを通って流れ、操作(グラフのノード)によって操作されます。デフォルトのグラフがありますが、あなたはセッションであなたのものを始めることができます。
あなたがprintと言うとき、あなたはあなたが定義した変数または定数の形にアクセスするだけです。
それで、あなたはあなたが逃しているものを見ることができます:
with tf.Session() as sess:
print(sess.run(product))
print (product.eval())
それが役に立てば幸い!
上記の答えに基づいて、あなたの特定のコードスニペットであなたはこのように製品を印刷することができます:
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()
eager execution を有効にすると、セッションでグラフを実行せずに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ナイトリービルドをインストールする必要があります。作り付けの車輪が見つかります ここ 。
最近のTensorflow 1.13.1では
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.0では、eagerモードはデフォルトで有効になっています。そのため、上記のコードはそのまま機能しますが、tf.enable_eager_execution()をコメントアウトするだけです。
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
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]))
この単純なコードを試してください。 (自明です)
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)
tf.keras.backend.eval
は、小さな式の評価に役立ちます。
tf.keras.backends.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
を明示的に作成する必要がないため便利です。
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())
基本的に、テンソルフローでは、どんな種類のテンソルを作成したときにもテンソルフローが作成されて内部に格納され、テンソルフローセッションを実行したときにのみアクセスできます。定数テンソルを作成したとしましょう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()
出力は次のようになります。
配列([[1、2.、3.]、[4.、5.、6.]]、dtype = float32)
私がこれを実行するまで私はすべての答えを読んだ後でさえも何が必要であるか理解するのが容易であるとは思いませんでした。 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()
Kerasを使用できます。1行の答えは、次のようなeval
メソッドを使用することです。
import keras.backend as K
print(K.eval(your_tensor))
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()
バージョン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)
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)
質問:Tensorオブジェクトの値をTensorFlowに出力する方法は?
回答:
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)