切片的英文是 slice,是将整体进行切分,成为切片之后我们就可以从中任意取数据。使用 slice 技术我们可以多维度空间内随意获取想要的数据块。今天我们来看一看如何通过 pytorch 提供 api 来对数据进行自由获取数据。
a = torch.rand(4,3,28,28)
使用 torch 随机生产一个数据,模拟图片数据集 4 张图片,3 表示通道数据,在图片数据集最后两个维度通常是图片宽度和高度。怎么理解高纬度数据结构,通常将最后两个维度看成一个平面,然后倒数 3 维度形成一个立方体,最后 4 维度可以理解为多个立方体罗列而得到。如何在多出一个维度就可以将其后面维度看成一个整理,这个维度就是装载这些集合容器。
container.jpega[0,0].shape
输出torch.Size([28, 28])
表示图片大小是,如何理解这次查找,0 表示第一张图片,第二个 0 表示 1 通道,所得就得到第 1 张图片的第 1 个通道的数据。
a[0,0,2,4]
表示第 1 张图片第 1 通道的 2 列 4 行处像素值。
tensor(0.3626)
a[:2].shape
这里拿的前两张图片数据数据,这里冒号表示取值范围,在此例冒号前省略表示从 0 开始到1 结束,在计算机中通常是左闭右开表示一个区间。所以0 和 1 两张图片的数据集,没有限制范围表示全部都取
torch.Size([2, 3, 28, 28])
a[:2,:1].shape
这里在上面基础对通道也进行限制,仅取第 1 通道,这里:1
表示取 0 通道这个应该不难理解
torch.Size([2, 1, 28, 28])
如果在某一个维度上使用冒号,而且冒号两边不给任何值表示没有任何限制,这种情也可以省略不写。
a[:2,1:,:,:].shape
这里在第 2 维度使用 -1 作为起始值,在数值前面加符号表示从后面计算位数向前1 位
a[:2,-1:,:,:].shape
torch.Size([2, 1, 28, 28])
这里重点说一下,0:28:2
表示从 0 取到 28 然后紧接着冒号后的 2 表示步进就是 2 作为步进进行取值。
a[:,:,0:28:2,0:28:2].shape
torch.Size([4, 3, 14, 14])
网友评论