TensorFlow(五)维度变换

改变视图、增删维度

  基本的维度变换操作函数包含了改变视图 reshape、 插入新维度 expand_dims,删除维度 squeeze、 交换维度 transpose、 复制数据 tile 等函数。

x=tf.reshape(x,[2,4,4,3]) # 改变 x 的视图,获得 4D 张量,存储并未改变
tf.reshape(x,[2,-1,3])
x = tf.expand_dims(x,axis=2) # axis=2 表示宽维度后面的一个维度
x = tf.expand_dims(x,axis=0) # 高维度之前插入新维度
 x = tf.squeeze(x, axis=0) # 删除图片数量维度

在这里插入图片描述
注意:改变视图、增删维度都不会改变内存存储顺序。

交换维度

  改变视图、 增删维度都不会影响张量的存储。在实现算法逻辑时, 在保持维度顺序不变的条件下, 仅仅改变张量的理解方式是不够的,有时需要直接调整的存储顺序,即交换维度(Transpose)。通过交换维度操作,改变了张量的存储顺序,同时也改变了张量的视图。
  用下面函数实现:

tf.transpose(x, perm)

其中参数 perm表示新维度的顺序 List。
维度索引号从0开始依次排序。
在这里插入图片描述
  需要注意的是, 通过 tf.transpose 完成维度交换后,张量的存储顺序已经改变, 视图也随之改变, 后续的所有操作必须基于新的存续顺序和视图进行。 相对于改变视图操作,维度交换操作的计算代价更高。

复制数据

  可以通过 tf.tile(x, multiples)函数完成数据在指定维度上的复制操作, multiples 分别指定了每个维度上面的复制倍数,对应位置为 1 表明不复制,为 2 表明新长度为原来长度的2 倍,即数据复制一份,以此类推。
在这里插入图片描述
  实际上,上述插入维度和复制数据的步骤并不需要我们手动执行, TensorFlow 会自动完成,这就是自动扩展功能。

x = tf.random.normal([2,4])
w = tf.random.normal([4,3])
b = tf.random.normal([3])
y = x@w+b # 不同 shape 的张量直接相加

  上述加法并没有发生逻辑错误,那么它是怎么实现的呢? 这是因为它自动调用 Broadcasting函数 tf.broadcast_to(x, new_shape), 将两者 shape 扩张为相同的[2,3], 即上式可以等效为:

y = x@w + tf.broadcast_to(b,[2,3]) # 手动扩展,并相加

  也就是说,操作符+在遇到 shape 不一致的 2 个张量时,会自动考虑将 2 个张量自动扩展到一致的 shape,然后再调用 tf.add 完成张量相加运算,当然,tf.broadcast_to(x, new_shape)函数是可以显式地执行自动扩展功能的。
  需要注意的是, tf.tile 会创建一个新的张量来保存复制后的张量,由于复制操作涉及大量数据的读写 IO 运算,计算代价相对较高。神经网络中不同 shape 之间的张量运算操作十分频繁,那么有没有轻量级的复制操作呢?这就是接下来要介绍的 Broadcasting 操作。

Broadcasting

  Broadcasting 称为广播机制(或自动扩展机制), 它是一种轻量级的张量复制手段,在逻辑上扩展张量数据的形状, 但是只会在需要时才会执行实际存储复制操作。对于大部分场景, Broadcasting 机制都能通过优化手段避免实际复制数据而完成逻辑运算,从而相对于tf.tile 函数,减少了大量计算代价。
  对于所有长度为 1 的维度, Broadcasting 的效果和 tf.tile 一样,都能在此维度上逻辑复制数据若干份,区别在于 tf.tile 会创建一个新的张量, 执行复制 IO 操作,并保存复制后的张量数据, 而 Broadcasting 并不会立即复制数据, 它会在逻辑上改变张量的形状,使得视图上变成了复制后的形状。 Broadcasting 会通过深度学习框架的优化手段避免实际复制数据而完成逻辑运算,至于怎么实现的用户不必关心, 对于用户来说, Broadcasting 和 tf.tile 复制的最终效果是一样的,操作对用户透明,但是 Broadcasting 机制节省了大量计算资源,建议在运算过程中尽可能地利用 Broadcasting 机制提高计算效率。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文章来源

  本文完全来源于https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book,感谢原作者的完美工作,这是tf2.0的内容,超级棒。我只是用jupter notebook学习一遍,供本文和大家参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值