transpose和reshape函数实现

2021-01-26 22:42:25 浏览数 (1)

上两篇在使用numpy实现卷积和tensorflow实现卷积进行结果对比时,对数据有个转换处理。 因为在numpy构造数据的shape是[B,C,H,W],在tensorflow中输入默认要求shpae是[B,H,W,C],所以我们必须把维度进行转换。 在numpy里面有两个方法都可以让shape进行改变,reshapetranspose。下面我们就来看下两者对区别,以及我们应该使用哪一个才是正确的。

先构造一个[3,5,5]的数据,代表3个5*5大小的矩阵。

代码语言:javascript复制
if __name__ == '__main__':

    inputs = np.zeros([3,5,5])
    for i in range(3):
        for j in range(5):
            for z in range(5):
                inputs[i][j][z] = i j z

数据打印

代码语言:javascript复制
inputs 
[[[ 0.  1.  2.  3.  4.]
  [ 1.  2.  3.  4.  5.]
  [ 2.  3.  4.  5.  6.]
  [ 3.  4.  5.  6.  7.]
  [ 4.  5.  6.  7.  8.]]

 [[ 1.  2.  3.  4.  5.]
  [ 2.  3.  4.  5.  6.]
  [ 3.  4.  5.  6.  7.]
  [ 4.  5.  6.  7.  8.]
  [ 5.  6.  7.  8.  9.]]

 [[ 2.  3.  4.  5.  6.]
  [ 3.  4.  5.  6.  7.]
  [ 4.  5.  6.  7.  8.]
  [ 5.  6.  7.  8.  9.]
  [ 6.  7.  8.  9. 10.]]]

然后我们执行分别执行下transpose和reshape,并且运行看下结果

代码语言:javascript复制
def numpy_transpose(data):
    #把维度进行转换,[3,5,5]转换为[5,5,3]
    result = data.transpose((1,2,0))
    print("numpy_transpose n",result,"n")

def numpy_reshape(data):
    C,H,W=data.shape
    #[3,5,5]变形为[5,5,3]
    r_data=data.reshape((H,W,C))
    print("numpy_reshape n",r_data,"n")



numpy_reshape 
 [[[ 0.  1.  2.]
  [ 3.  4.  1.]
  [ 2.  3.  4.]
  [ 5.  2.  3.]
  [ 4.  5.  6.]]

 [[ 3.  4.  5.]
  [ 6.  7.  4.]
  [ 5.  6.  7.]
  [ 8.  1.  2.]
  [ 3.  4.  5.]]

 [[ 2.  3.  4.]
  [ 5.  6.  3.]
  [ 4.  5.  6.]
  [ 7.  4.  5.]
  [ 6.  7.  8.]]

 [[ 5.  6.  7.]
  [ 8.  9.  2.]
  [ 3.  4.  5.]
  [ 6.  3.  4.]
  [ 5.  6.  7.]]

 [[ 4.  5.  6.]
  [ 7.  8.  5.]
  [ 6.  7.  8.]
  [ 9.  6.  7.]
  [ 8.  9. 10.]]] 

numpy_transpose 
 [[[ 0.  1.  2.]
  [ 1.  2.  3.]
  [ 2.  3.  4.]
  [ 3.  4.  5.]
  [ 4.  5.  6.]]

 [[ 1.  2.  3.]
  [ 2.  3.  4.]
  [ 3.  4.  5.]
  [ 4.  5.  6.]
  [ 5.  6.  7.]]

 [[ 2.  3.  4.]
  [ 3.  4.  5.]
  [ 4.  5.  6.]
  [ 5.  6.  7.]
  [ 6.  7.  8.]]

 [[ 3.  4.  5.]
  [ 4.  5.  6.]
  [ 5.  6.  7.]
  [ 6.  7.  8.]
  [ 7.  8.  9.]]

 [[ 4.  5.  6.]
  [ 5.  6.  7.]
  [ 6.  7.  8.]
  [ 7.  8.  9.]
  [ 8.  9. 10.]]] 

可以看到最终结果都是变成5个5*3的矩阵,reshape呢是按顺序开始排,看结果比较好理解。transpose是转置,只是维度进行来交换但是内部结构没有变。比如二维图像,转置就是进行来旋转,宽高进行来转置。对于三维就是想象为立放体从不同角度去观察它。

按理解自己实现transpose,可以运行和np.transpose进行对比。

代码语言:javascript复制
def my_transpose(data):
    C,H,W = data.shape
    result = np.zeros((H,W,C))
    for i in range(C):
        result[:,:,i] = data[i,:,:]
    print("my_transpose n ",result,"n")

因为在深度学习中,很多对多维矩阵对操作,而且被框架封装对很好, 如果不理解去使用,可能可以跑通算法不报错,但是最后结果是完全错误对,而且不好排查。 理解了原理后,后面在很多应用中就不会错误使用reshape和transpose啦~

0 人点赞