【深度学习】TensorFlow张量的变换与修改

229 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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类型修改,不会改变原始张量类型
  • 会重新返回改变类型后的新的张量

image.png

1.2 形状改变

TensorFlow的张量具有两种形状变换,动态形状和静态形状

  1. 静态形状:一开始创建张量时的形状,即初始创建张量时的形状
    • tf.set_shape(shape)
    • 只有在形状没完全固定下,才可改变/更新静态形状
    • 换句话说,1维张量只能更新成1维,2维张量只能更新成2维,不能跨维数更新
    • 形状没有完全固定下来的静态形状如下所示:

下图中带有标记的就是形状没有固定下来的静态形状
image.png

更新静态形状:具体代码演示如下所示

  • 创建三个占位符,前两个形状不固定,最后一个形状固定
  • 使用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),因此不能更新该形状

image.png

  1. 动态形状:不管在什么情况下,想改变就可以改变
    • 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)

代码运行结果如下图所示:

image.png