transpose和reshape函数实现

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

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

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

数据打印

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,并且运行看下结果

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进行对比。

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啦~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值