pytorch基础二
索引与切片
Indexing 直接索引
- 以下方程序为例 ,首先创建的 tensor -> (4,3,28,28) 分别为batch_size ; channel ; h ; w
- a[0] 索引代表 batch的每张图片的 channel , h , w
- a[0,0] 索引代表 第一张图片第一个通道的 h和w
- a[0,0,2,4] 索引代表 第一张图片第一个通道第2行4列像素点的值
: 采样索引
- 在下例中 , a[ :2] 代表前两张图片的 channel, h ,w
- a[:2 , 1: , :, :] 代表前两张图片中最后一个通道的 h,w
- 注: 如有两个冒号,第二个冒号后的数字代表隔位采样
… 任意维度
- … 代表取任意维度
- 在下例中, a[…] 代表取所有维度 ; a[0,…] 代表取第一个图片的channel , h, w
维度变换
.view( ) 合并维度
- 采用 .view() 操作可以合并维度,但总size不变,也就是说只改变其意义,不改变其值
- 如下例所示,a.view(4,28*28) 即是将 (1,28,28)的信息合并处理,在实际意义中就是将通道信息、图片的具体长、宽信息整和为一个特征,结果得到(4,784)的size ,常用于全连接层
- 而 a.view(4*1,28,28) 则是只关注图片的特征信息,而忽略是是哪张图片、哪个通道的信息
Squeeze \ unsqueeze 删减 \ 增加维度
- .unsqueeze( a ) -> 在a的前一个位置上增加一个维度(注,若a是负数,从后往前算,且是在其之后增加维度)
- squeeze(a) 删除维度的格式与 .unsqueeze( a ) 一样,但若不输入参数a,则会把所有为1的维度删除(挤压)掉
expand / repeat 维度扩展
- expand / repeat 两种方法效果差不多,但一般使用expand而不使用 repeat
- 两种方法只可以将原来为1的维度转化为新的维度大小 (复制原来为1的内容,填充新的size)
- expand 参数中的 -1 代表原来的维度,若写为 -1 ,代表是原来的维度大小不变
- 注意,下例中的 -4为bug,虽然有输出,但无实际意义
- repeat 中的参数表示 该维度大小重复的次数,为 1 即为重复1 次
Transpose / t / permute 转置
- 可以直接使用 .t () 来求转置,但其只能运用于2D矩阵,对于3,4D数据不支持操作
- .transpose(a,b) 可以直接交换 a,b 维度的值,但会使数据不连续,所以常使用 .transpose(a,b).contiguous(),即通过 .contiguous() 函数将数据重新变得连续
- .permute(a,b,c,d) 函数可以转换每个维度的size,如下例所示,b.permute(0,2,3,1) 是将原来第二位的维度和最后一维的做了交换,初始的位置应为(0,1,2,3)