一个tensor有shape和ndim的概念,shape也就是[b,28,28,1],每个代表一个轴,我们把第一个轴理解为batch,第二个轴理解为height,第三个轴理解为width,第四个轴理解为channel。我们把这个原始的数据成为content
维度变化也就是reshape,可以增加一个维度、减少一个维度以及对维度先后顺序进行变化
常见的View(对数据的理解方式)有几种
- [b, 28, 28] b张图片,每张28行 每行28列
- [b, 28 * 28] b张图片,把每张图片看成一个整体,而不去关注图片二维信息而是只将其作为数据
- [b, 2, 14*28] b张图片,把图片分为上下两个图片的理解方式
- [b, 28, 28, 1] b张图片,每张28行 每行28列 并增加了一个channel
所以Reshape的理解就是不改变数据的内容,但是改变数据的理解方式,即对矩阵进行相应的变换
Reshpe
- 如果不想去计算的话可以使用-1进行自动计算来替代28*28,会自动进行合并,注意只能有一个-1,否则无法计算
- 要保证现在的size等于原来的size就可以了,理论上可以产生很多种组合方式,我们根据自己的理解方式来赋予reshape后的矩阵有具体的含义
如果reshape之后需要恢复,那么就需要保留reshape之前的信息才能够[4, 784, 3] => [4, 28 28, 3],但是w和h有可能是反的,或者记错了之后变成了[4, 14, 46, 3],这一点要注意
tf.transpose
原本是矩阵的转置,在tensorflow中会理解成一个轴的交换,很多的时候我们会先交换再reshape
- 如果直接传入矩阵,那么就和转置一致
- 如果传入perm=[num1,num2,num3],那么这里的num就是之前的维度,这样维度之间就可以进行交换了
减少或增加expand_dim维度
应用:增加一个学校的维度
- 如果设置的轴是负数的话就是从后往前增加维度,-1就是最后的一个轴
减少的时候只能是shape=1的维度,因为只有一个的时候才可以去掉