1、placeholder的一个注解
在有些时候,需要使用tensor里面的数据作为placeholder的输入,但是直接如下使用会报出错误:
import tensorflow as tf
# 定义一个placeholder,用于输入数据
x = tf.placeholder(dtype=tf.float32, shape=[3,4], name="x")
# 定义另外一个变量
y = tf.Variable(tf.truncated_normal(shape=[4,5], mean=0.0, stddev=1.0, dtype=tf.float32, name="y"))
# 二者相乘
ans = tf.matmul(x, y)
# Tensorflow会话
with tf.Session() as sess:
# 随机生成一个变量tensor,作为输入数据
data = tf.Variable(tf.truncated_normal([3,4],mean=0.0, stddev=1.0))
# 初始化全局变量
tf.global_variables_initializer().run()
# feed数据并输出结果
print(sess.run(ans, feed_dict={x:data}))
运行结果:
ValueError: setting an array element with a sequence.
因此,我们不能在传递数据的时候直接将一个tensor传入。
因为需要使用的是tensor里面的数据,而并不需要使用整个tensor,所以我们在传递数据的时候将tensor的数据传入即可。
测试代码如下:在tensor的后面加上.eval()即可。
import tensorflow as tf
# 定义一个placeholder,用于输入数据
x = tf.placeholder(dtype=tf.float32, shape=[3,4], name="x")
# 定义另外一个变量
y = tf.Variable(tf.truncated_normal(shape=[4,5], mean=0.0, stddev=1.0, dtype=tf.float32, name="y"))
# 二者相乘
ans = tf.matmul(x, y)
# Tensorflow会话
with tf.Session() as sess:
# 随机生成一个变量tensor,作为输入数据
data = tf.Variable(tf.truncated_normal([3,4],mean=0.0, stddev=1.0))
# 初始化全局变量
tf.global_variables_initializer().run()
# feed数据并输出结果
print(sess.run(ans, feed_dict={x:data.eval()}))
程序运行结果如下(因为使用了随机数,运行的结果或有不同):
[[ 0.83549279 -0.72565985 1.86152267 -0.95736873 -0.62865239]
[-0.35539457 0.32657176 -1.05708313 0.09340502 0.12008899]
[-0.90110421 1.14147317 -1.79898572 -2.76322627 2.47306728]]
2、reshape函数
顾名思义,该函数用于将一个矩阵重新规划形状,即变形。
reshape函数要求变形前后数据的数目相同,即4x4不可以变形为3x5,也不可以变形为3x3x2。
如下的代码会报错:
import tensorflow as tf
# 随机生成一个变量,大小为4x4
a = tf.Variable(tf.truncated_normal(shape=[4,4],mean=0.0, stddev=1.0,dtype=tf.float32))
# reshape
# 第一个参数:需要变形的矩阵
# 第二个参数:reshape之后的形状
# 第三个参数:名称
b = tf.reshape(a,shape=[3,5], name="reshape")
# Tensorflow会话
with tf.Session() as sess:
# 初始化全局变量
tf.global_variables_initializer().run()
# 输出b的相关信息
print(b)
结果如下:
ValueError: Cannot reshape a tensor with 16 elements to shape [3,5] (15 elements) for 'reshape' (op: 'Reshape') with input shapes: [4,4], [2] and with input tensors computed as partial shapes: input[1] = [3,5].
改变矩阵的大小,可以使代码运行正确:
import tensorflow as tf
# 随机生成一个变量,大小为4x4
a = tf.Variable(tf.truncated_normal(shape=[4,4],mean=0.0, stddev=1.0,dtype=tf.float32))
# reshape
# 第一个参数:需要变形的矩阵
# 第二个参数:reshape之后的形状
# 第三个参数:名称
b = tf.reshape(a,shape=[2,8], name="reshape")
# Tensorflow会话
with tf.Session() as sess:
# 初始化全局变量
tf.global_variables_initializer().run()
# 输出b的相关信息
print(b)
结果如下所示:
Tensor("reshape:0", shape=(2, 8), dtype=float32)
在变形过程中,有时候对矩阵的维度计算较为困难,这个时候可以使用-1作为维度输入。
-1表示根据已知的信息,自动计算所需要的维度。
import tensorflow as tf
# 随机生成一个变量,大小为4x4
a = tf.Variable(tf.truncated_normal(shape=[4,4],mean=0.0, stddev=1.0,dtype=tf.float32))
# reshape
# 第一个参数:需要变形的矩阵
# 第二个参数:reshape之后的形状
# 第三个参数:名称
# 这里使用了-1作为维度的输入,由于总共有4x4=16个元素,因此计算可知,-1代表的数字为4(2x2x4=16)。
b = tf.reshape(a,shape=[2,2,-1], name="reshape")
# Tensorflow会话
with tf.Session() as sess:
# 初始化全局变量
tf.global_variables_initializer().run()
# 输出b的相关信息
print(b)
程序运行结果如下:
Tensor("reshape:0", shape=(2, 2, 4), dtype=float32)
因此,在输入维度信息的时候,最多只能存在一个值为-1。
以下的代码会报错:
import tensorflow as tf
# 随机生成一个变量,大小为4x4
a = tf.Variable(tf.truncated_normal(shape=[4,4],mean=0.0, stddev=1.0,dtype=tf.float32))
# reshape
# 第一个参数:需要变形的矩阵
# 第二个参数:reshape之后的形状
# 第三个参数:名称
# 这里使用了-1作为维度的输入,由于总共有4x4=16个元素,却存在两个-1,相当于含有多个未知数。
b = tf.reshape(a,shape=[-1,2,-1], name="reshape")
# Tensorflow会话
with tf.Session() as sess:
# 初始化全局变量
tf.global_variables_initializer().run()
# 输出b的相关信息
print(b)
print(b.eval())
结果如下(省略了部分结果输出):
Tensor("reshape:0", shape=(?, 2, ?), dtype=float32)
tensorflow.python.framework.errors_impl.InvalidArgumentError: only one input size may be -1, not both 0 and 2
[[Node: reshape = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](Variable/read, reshape/shape)]]
[[Node: reshape/_1 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_9_reshape", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
……
tensorflow.python.framework.errors_impl.InvalidArgumentError: only one input size may be -1, not both 0 and 2
……