持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
注意:本文使用tensorflow1.x版本进行演示
使用本地Jupyter Notebook搭载TensorFlow相关库进行操作
1. 张量的变换
1.1 类型改变
tf.cast(x, dtype, name=None)
- x:想要修改的张量
- dype:想要修改的类型
代码演示:
- 首先,我们创建一个int32张量
- 然后,使用tf.cast进行类型转换
- 将其转换为float32类型的张量
- 分别输出原张量与修改后的张量
tensor3 = tf.constant([[1],[2],[3]])
tensor3_float = tf.cast(tensor3, dtype=tf.float32)
tensor3_float
运行结果如下图所示:
- 由此可以看出tf.cast类型修改,不会改变原始张量类型
- 会重新返回改变类型后的新的张量
1.2 形状改变
TensorFlow的张量具有两种形状变换,动态形状和静态形状
- 静态形状:一开始创建张量时的形状,即初始创建张量时的形状
tf.set_shape(shape)- 只有在形状没完全固定下,才可改变/更新静态形状
- 换句话说,1维张量只能更新成1维,2维张量只能更新成2维,不能跨维数更新
- 形状没有完全固定下来的静态形状如下所示:
下图中带有
?标记的就是形状没有固定下来的静态形状
更新静态形状:具体代码演示如下所示
- 创建三个占位符,前两个形状不固定,最后一个形状固定
- 使用set_shape更新未固定的静态形状
- 输出更新前与更新后的形状
a_ph1 = tf.placeholder(dtype=tf.float32, shape=[None, None])
b_ph1 = tf.placeholder(dtype=tf.float32, shape=[None, 10])
c_ph1 = tf.placeholder(dtype=tf.float32, shape=[3,2])
print("a_ph1:\n", a_ph1)
print("b_ph1:\n", b_ph1)
print("c_ph1:\n", c_ph1)
# 更新形状未确定的部分
a_ph1.set_shape([2,3])
b_ph1.set_shape([2,10])
print("a_ph1:\n", a_ph1)
print("b_ph1:\n", b_ph1)
运行结果如下图所示:
- 注意:c_ph的形状已经固定shape=(2,3),因此不能更新该形状
- 动态形状:不管在什么情况下,想改变就可以改变
- tf.reshape(tensor, shape)
修改动态形状代码演示如下所示:
- tf.reshape同样不会破坏原张量
- 会生成一个新的修改后的张量
- 若想修改维度固定的张量,如shape=[3,2],需要保证数组内元素个数不变的情况下,进行reshape。
- 例如shape=[3,2],可以将其reshape成[2,3],[1,6],[6,1],总元素个数不变,都为6。
a_ph1 = tf.placeholder(dtype=tf.float32, shape=[None, None])
a_p_reshape = tf.reshape(a_ph1, shape=[6,6,6])
print("a_p_reshape:\n", a_p_reshape)
代码运行结果如下图所示: