当前位置: 代码迷 >> 综合 >> tensorflow的reshape操作tf.reshape()
  详细解决方案

tensorflow的reshape操作tf.reshape()

热度:34   发布时间:2023-12-15 19:00:42.0

原文链接:https://blog.csdn.net/m0_37592397/article/details/78695318

在处理图像数据的时候总会遇到输入图像的维数不符合的情况,此时tensorflow中reshape()就很好的解决了这个问题。

更为详细的可以参考官方文档说明:

numpy.reshape


reshape()的括号中所包含的参数有哪些呢?常见的写法有tf.reshape((28,28)):

tf.reshape(tensor,shape,name=None)
  
  • 1

函数的作用是将tensor变换为参数shape形式,其中的shape为一个列表形式,特殊的是列表可以实现逆序的遍历,即list(-1).-1所代表的含义是我们不用亲自去指定这一维的大小,函数会自动进行计算,但是列表中只能存在一个-1。(如果存在多个-1,就是一个存在多解的方程)
下面就说一下reshape是如何进行矩阵的变换的,其简单的流程就是:
将矩阵t变换为一维矩阵,然后再对矩阵的形式进行更改就好了,具体的流程如下:

reshape(t,shape) =>reshape(t,[-1]) =>reshape(t,shape)
  
  • 1

实际操作中,有如下效果:我创建了一个一维的数组

>>>import numpy as np
>>>a= np.array([1,2,3,4,5,6,7,8])
>>>a
array([1,2,3,4,5,6,7,8])
>>>
  
  • 1
  • 2
  • 3
  • 4
  • 5

使用reshape()方法来更改数组的形状,使得数组成为一个二维的数组:(数组中元素的个数是2×4=8)

>>>d = a.reshape((2,4))
>>>d
array([[1, 2, 3, 4],[5, 6, 7, 8]])
  
  • 1
  • 2
  • 3
  • 4

进一步提升,可以得到一个三维的数组f:(注意数组中元素的个数时2×2×2=8)

>>>f = a.reshape((2,2,2))
>>>f
array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]])
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意:形状发生变化的原则时数组元素的个数是不能发生改变的,比如像下面这样的写法就会报错:
(元素的个数是2×2=4,所以会报错)

>>> e = a.shape((2,2))
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
  
  • 1
  • 2
  • 3
  • 4

-1 的应用:-1 表示不知道该填什么数字合适的情况下,可以选择,由python通过a和其他的值3推测出来,比如,这里的a 是二维的数组,数组中共有6个元素,当使用reshape()时,6/3=2,所以形成的是3行2列的二维数组,可以看出,利用reshape进行数组形状的转换时,一定要满足(x,y)中x×y=数组的个数。

>>>a = np.array([[1,2,3],[4,5,6]])
>>>np.reshape(a,(3,-1)) 
array([[1, 2],[3, 4],[5, 6]])
>>> np.reshape(a,(1,-1))
array([[1, 2, 3, 4, 5, 6]])
>>> np.reshape(a,(6,-1))
array([[1],[2],[3],[4],[5],[6]])
>>> np.reshape(a,(-1,1))
array([[1],[2],[3],[4],[5],[6]])
  
  • 1

最后再给大家呈现一下官方给出的例子:

# tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]
# tensor 't' has shape [9]
reshape(t, [3, 3]) ==> [[1, 2, 3],[4, 5, 6],[7, 8, 9]]# tensor 't' is [[[1, 1], [2, 2]],
#                [[3, 3], [4, 4]]]
# tensor 't' has shape [2, 2, 2]
reshape(t, [2, 4]) ==> [[1, 1, 2, 2],[3, 3, 4, 4]]# tensor 't' is [[[1, 1, 1], # [2, 2, 2]],
#                [[3, 3, 3], # [4, 4, 4]],
#                [[5, 5, 5], # [6, 6, 6]]]
# tensor 't' has shape [3, 2, 3]
# pass '[-1]' to flatten 't'
reshape(t, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]# -1 can also be used to infer the shape# -1 is inferred to be 9:
reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],[4, 4, 4, 5, 5, 5, 6, 6, 6]]
# -1 is inferred to be 2:
reshape(t, [-1, 9]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],[4, 4, 4, 5, 5, 5, 6, 6, 6]]
# -1 is inferred to be 3:
reshape(t, [ 2, -1, 3]) ==> [[[1, 1, 1],[2, 2, 2],[3, 3, 3]],[[4, 4, 4],[5, 5, 5],[6, 6, 6]]]# tensor 't' is [7]
# shape `[]` reshapes to a scalar
  相关解决方案