我是靠谱客的博主 深情面包,最近开发中收集的这篇文章主要介绍3.维度变换3.维度变换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

3.维度变换

View视图
[ b, 28, 28 ]
[ b, 28 * 28 ]
[ b, 2, 14 * 28 ]
[ b, 28, 28, 1 ]
这4个View不同,但是原来的content不变

In [4]: a =tf.random.normal([4,28,28,3])
In [8]: a.shape,a.ndim
Out[8]: (TensorShape([4, 28, 28, 3]), 4)

I. tf.reshape(tensor, shape )

将tensor变换为参数shape的形式
-1 表示自动计算此维度,shape里最多有一个维度的值可以填写-1
返回一个shape形状的新tensor

In [9]: tf.reshape(a,[4,784,3]).shape #改变维度,其原先的内容都要利用
Out[9]: TensorShape([4, 784, 3])

In [10]: tf.reshape(a,[4,-1,3]).shape #简写,-1是系统自己给的,只能出现一个
Out[10]: TensorShape([4, 784, 3])

In [11]: tf.reshape(a,[4,28*28*3]).shape
Out[11]: TensorShape([4, 2352])

In [12]: tf.reshape(a,[4,-1]).shape
Out[12]: TensorShape([4, 2352])
Reshape is flexible 灵活重塑

可以多次塑造

In [13]: a.shape
Out[13]: TensorShape([4, 28, 28, 3])

In [15]: tf.reshape(tf.reshape(a,[4,-1]),[4,28,28,3]).shape
#先变成[ 4, 784 ] 再变成[ 4, 28, 28, 3]
Out[15]: TensorShape([4, 28, 28, 3])

In [16]: tf.reshape(tf.reshape(a,[4,-1]),[4,14,56,3]).shape
Out[16]: TensorShape([4, 14, 56, 3])

In [17]: tf.reshape(tf.reshape(a,[4,-1]),[4,1,784,3]).shape
Out[17]: TensorShape([4, 1, 784, 3])
Reshape could lead to potential bugs 重塑可能导致潜在的缺陷

重塑可能会改变content的结果,可能不是您想要的结果

II. tf.transpose(a,perm=None) 转置

将a进行转置,并且根据perm参数重新排列输出维度,这是对数据的维度进行操作的形式
应用场景:
1,图像处理时数据集中存储的形式为[ channel, image_height, image_width ],在tensorflow中使用CNN时我们需要将其转化为[ image_height, image_width, channel ]的形式,自需要使用tf.transpose(input_data ,[1 ,2 0 ])
2, 输出数据tensor的第i维将根据perm[i]指定。例如,如果perm没有给定,那么默认是perm=[n-1, n-2, … ,0 ],其中rank(a) = n
3, 默认情况下,对于二维输入数据,其实就是常规的矩阵转置操作

In [18]: e =tf.random.normal([4,3,2,1])

In [19]: e.shape
Out[19]: TensorShape([4, 3, 2, 1])

In [20]: tf.transpose(e).shape #轴交换,交换的是content
Out[20]: TensorShape([1, 2, 3, 4])

In [21]: tf.transpose(e,perm=[0,1,3,2]).shape #perm指定轴索引的改变
Out[21]: TensorShape([4, 3, 1, 2])

III. Squeeze VS expand_dims 挤压VS扩张

tf.expand_dims(input,axis=None,dim=None)

在给定的一个input时,在axis轴处给input增加一个维度
input是输入的张量
axis是指定扩大输入张量形状的维度索引值
dim等同于轴,一般不推荐使用

In [22]: f=tf.random.normal([4,35,8])

In [23]: tf.expand_dims(f,axis=0).shape # axis=0,矩阵维度变成1*4*35*8
Out[23]: TensorShape([1, 4, 35, 8])

In [24]: tf.expand_dims(f,axis=3).shape # axis=3,矩阵维度变成4*35*8*1
Out[24]: TensorShape([4, 35, 8, 1])
tf.squeeze(input,axis=None)

减少维度,只能减少shape为1的维度
该函数返回一个张量,这个张量是将原始的input中所有维度为1的哪些维全部删掉的结果
axis可以用来指定要删除的为1的维度,注意指定的维度必须确保其是1,否则会报错

In [25]: tf.squeeze(tf.zeros([1,2,1,1,3])).shape #全部减少shape为1的轴
Out[25]: TensorShape([2, 3])

In [26]: tf.squeeze(tf.zeros([1,2,1,3]),axis=0).shape #只减少0维度的
Out[26]: TensorShape([2, 1, 3])

In [27]: tf.squeeze(tf.zeros([1,2,1,3]),axis=2).shape
Out[27]: TensorShape([1, 2, 3])

In [28]: tf.squeeze(tf.zeros([1,2,1,3]),axis=-2).shape #维度倒序
Out[28]: TensorShape([1, 2, 3])

In [29]: tf.squeeze(tf.zeros([1,2,1,3]),axis=-4).shape
Out[29]: TensorShape([2, 1, 3])

In [30]: tf.squeeze(tf.zeros([1,2,1,3]),axis=[0,2]).shape #维度可指定一个,也可指定多个
Out[30]: TensorShape([2, 3])

最后

以上就是深情面包为你收集整理的3.维度变换3.维度变换的全部内容,希望文章能够帮你解决3.维度变换3.维度变换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部