关于python 在神经网络训练图像数据预处理时使用的transpose

这个源于本科同学一起讨论的问题。直接正文吧。

先附上一个博主对该问题的总结:

转置(transpose)和轴对换

转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。

转置有三种方式,transpose方法、T属性以及swapaxes方法。

1 .T,适用于一、二维数组

In [1]: import numpy as np

In [2]: arr = np.arange(20).reshape(4,5)#生成一个4行5列的数组

In [3]: arr
Out[3]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [4]: arr.T #求转置
Out[4]:
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

2. 高维数组

对于高维数组,transpose需要用到一个由轴编号组成的元组,才能进行转置。

这里,着实好好理解了一下。开始的时候怎么都想不明白。因为他跟矩阵转置理解起来不太一样。

主要参考:
AbstractSky的博客
Albert Chen
经管之家

对多维数组来说,确定最底层的一个基本元素位置需要用到的索引个数即是维度。这句话的理解可以结合我索引和切片的那篇文章理解。

我是这样的理解的,比如说三维的数组,那就对维度进行编号,也就是0,1,2。这样说可能比较抽象。这里的0,1,2可以理解为对shape返回元组的索引。
比如:

In [59]: arr1 = np.arange(12).reshape(2,2,3)

In [60]: arr1
Out[60]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

In [61]: arr1.shape #看形状
Out[61]: (2, 2, 3) #说明这是一个2*2*3的数组(矩阵),返回的是一个元组,可以对元组进行索引,也就是0,1,2
形状 索引
2 0
2 1
3 2

所以说,transpose参数的真正意义在于这个shape元组的索引。

那么它的转置就应该是


In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0,  1,  2],
        [ 6,  7,  8]],

       [[ 3,  4,  5],
        [ 9, 10, 11]]])

比如,数值6开始的索引是[1,0,0],变换后变成了[0,1,0]
这也说明了,transpose依赖于shape

但是,对于为什么转置最后一个索引是不动的,颇为不解。数组或者说矩阵的这块有点太抽象了。虽然我线代成绩不错,但是这玩意不太一样啊。

3.swapaxes

虽然还有点不解的地方,但是,理解了上方那部分之后,swapaxes方法也就很好理解了。它接受一对轴编号。进行轴对换。其实也就是shape参数。

In [67]: arr2 = np.arange(16).reshape(2,2,4)           
                                                       
In [68]: arr2                                          
Out[68]:                                               
array([[[ 0,  1,  2,  3],                              
        [ 4,  5,  6,  7]],                             
                                                       
       [[ 8,  9, 10, 11],                              
        [12, 13, 14, 15]]])                            
                                                       
In [69]: arr2.shape                                    
Out[69]: (2, 2, 4)                                     
                                                       
In [70]: arr2.swapaxes(1,2)                            
Out[70]:                                               
array([[[ 0,  4],                                      
        [ 1,  5],                                      
        [ 2,  6],                                      
        [ 3,  7]],                                     
                                                       
       [[ 8, 12],                                      
        [ 9, 13],                                      
        [10, 14],                                      
        [11, 15]]])   

In [4]: arr2.swapaxes(1,0)#转置,对比transpose(1,0,2)
Out[4]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])                                 
以上为该博主的总结,这里我同学在transpose(2,0,1)也验证了这一点:

那么神经网络处理图像python做预处理时脚本中经常出现的transpose(2,0,1)是什么意思呢?

按照上面引文中的处理方式,我推了一下,的确和程序运行吻合。为了验证这样的预处理发生了什么,我做了下验证:

1)首先生成一张三通道的图像如下图(有规律的数据方便查看)


2)进行transpose(2,0,1):


查看转置后的结果,变成了4通道的图了。这里需要注意三通道的图像在内存中存储的形式--rgb,rgb,rgb,rgb,rgb,.....,其中每个rgb代表每个像素的三个通道(但这样送到存储中的数据形式并不是以每张通道(特征图)进行的,而神经网络是对每张特征图进行操作的,为此transpose(2,0,1)可以使图像在内存(显存)的存储按照逐张特征图进行),transpose(2,0,1)后,我们可以发现数据的存储刚好是rrr...(一张图像像素数个r)ggg...bbb...,这样就解决了使神经网络逐通道处理的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值