我一直在使用TensorFlow中矩阵乘法的介绍性示例。
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
当我打印乘积时,它显示为一个张量对象:
<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>
但是我怎么知道产品的价值呢?
下面的方法不起作用:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
我知道图在会话上运行,但是没有任何方法可以检查张量对象的输出而不在会话中运行图吗?
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。
基本上,在tensorflow中,当你创建任何类型的张量时,它们都会被创建并存储在里面,只有当你运行tensorflow会话时才能访问。假设你已经创建了一个常数张量
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([[1st, 2nd, 3rd],
[4th, 5th, 6th]], dtype=float32)
你应该认为TensorFlow核心程序由两个独立的部分组成:
构建计算图。
运行计算图。
因此,对于下面的代码,您只需构建计算图。
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]))
使用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)
请注意,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