前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >transpose和reshape函数实现

transpose和reshape函数实现

作者头像
languageX
发布2021-01-26 22:42:25
8530
发布2021-01-26 22:42:25
举报
文章被收录于专栏:计算机视觉CV计算机视觉CV

上两篇在使用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啦~

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com