我已经开始学习张量流,并且很难理解占位符/变量问题。
我正在尝试编写一个矩阵乘法函数。它在使用 tf.constant 时有效,但我很难理解如何使用变量
这是我的代码
import tensorflow as tf
import numpy as np
mat_1 = np.array([[0,1,1,0], [1,0,1,0], [1,0,0,1], [0,1,1,0]]).astype('int32')
mat_2 = np.array([[0,1,1,0], [1,0,1,0], [1,0,0,1], [0,1,1,0]]).astype('int32')
def my_matmult1(mat_1, mat_2):
#define session
x_sess = tf.Session()
with x_sess:
xmat_1 = tf.constant(mat_1)
xmat_2 = tf.constant(mat_2)
r1 = tf.matmul(xmat_1, xmat_2)
qq1 = x_sess.run(r1)
return qq1
def my_matmult2(mat_1, mat_2):
#define session
x_sess1 = tf.Session()
with x_sess1:
#initialize placeholders
xmat_1_plh = tf.placeholder(dtype=mat_1.dtype, shape=mat_1.shape)
xmat_2_plh = tf.placeholder(dtype=mat_2.dtype, shape=mat_2.shape)
#create variables
x_mat_1 = tf.Variable(xmat_1_plh, trainable = False)
x_mat_2 = tf.Variable(xmat_2_plh, trainable = False)
x_sess1.run(tf.initialize_all_variables())
#
r1 = tf.matmul(xmat_1, xmat_2)
qq1 = x_sess1.run(r1, feed_dic={mat_1, mat_2})
return qq1
Run Code Online (Sandbox Code Playgroud)
这按预期工作:
my_matmult1(mat_1, mat_1)
Run Code Online (Sandbox Code Playgroud)
但是,以下情况会失败:
my_matmult2(mat_1, mat_1)
Run Code Online (Sandbox Code Playgroud)
出现以下错误
无效参数错误
您必须为占位符张量“Placeholder”提供一个值,其数据类型为 int32,形状为 [4,4]
即使更改了最后一行
qq1 = x_sess1.run(r1, feed_dic={tf.convert_to_tensor(mat_1), tf.convert_to_tensor(mat_2)})
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
为了有意义地回答这个问题,我必须回到张量流的设计原理
图
Tensorflow 中的图只是计算所采用的地图/路径。它不保存任何值,也不执行任何操作。
另一方面,会话需要图形、数据和运行时来执行。图和会话的概念让 TensorFollow 将流定义或模型与实际计算运行时分开。
将运行时与流程图分离
这很可能是为了将图形定义与运行时配置和数据的实际执行分开。例如,运行时可以在集群上。因此集群中的每个执行运行时都需要具有相同的图定义。但每个运行时在执行过程中可能本地有一组不同的数据。因此,在集群中分布式执行期间能够提供输入和输出数据非常重要。
为什么使用占位符而不是变量
占位符充当图形的输入/输出管道。如果将图表可视化为多个节点 - 占位符就是输入或输出节点。
真正的问题是为什么 TensorFlow 不为 I/O 节点使用普通变量?为什么要有另一种类型?
在训练过程中(当程序在会话中执行时),需要确保使用实际值来训练模型。基本上 feed_dict在训练过程中只接受实际值,例如 Numpy ndarry。这些实际值无法由 TensorFlow 变量提供,因为除非使用 eval() 或 session.run(),否则 Tensorflow 变量没有数据。然而,训练语句本身是 session.run() 函数的一部分 - 因此它不能在其中使用另一个 session.run() 来将张量变量解析为数据。此时,session.run() 已经必须绑定到特定的运行时配置和数据。
| 归档时间: |
|
| 查看次数: |
6641 次 |
| 最近记录: |