索引与切片
Indexing 直接索引: 采样索引..、任意维度 维度变换
.view( ) 合并维度Squeeze unsqueeze 删减 增加维度expand / repeat 维度扩展Transpose / t / permute 转置 索引与切片 Indexing 直接索引
以下方程序为例 ,首先创建的 tensor -> (4,3,28,28) 分别为batch_size ; channel ; h ; wa[0] 索引代表 batch的每张图片的 channel , h , wa[0,0] 索引代表 第一张图片第一个通道的 h和wa[0,0,2,4] 索引代表 第一张图片第一个通道第2行4列像素点的值
: 采样索引
在下例中 , a[ :2] 代表前两张图片的 channel, h ,wa[: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)