概述
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.维度变换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复