Tensorflow深度学习之十六:placeholder的注解和reshape函数

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
……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值