掌握Pytorch
路漫漫其修远兮,吾将上下而求索。
学习内容:
索引:
pytorch,默认从左往右开始索引,-1表示从右往左。
:表示都取
x:表示从x取到最后
:x 表示从开始取到x
x:y 表示从x取到y
#生成一个随机tensor,表示类似一个CNN的图片的输入数据,4表示这个batch一共有4张照片,而3表示图片的通道数为3(RGB),(28,28)表示图片的大小 a = torch.randn(4,3,28,28)
#基本索引 #第0张图片的shape a[0].shape #torch.Size([3, 28, 28]) #第0张图片的第0个通道的size a[0,0].shape #torch.Size([28, 28]) #第0张图片的第0个通道的第2行第4列的像素点的值 a[0,0,2,4] #tensor(-0.9859)
#连续索引 #连续取两张图片(取第0张以及第1张图片,不包括第2张) a[:2].shape #torch.Size([2, 3, 28, 28]) #前两张图片上第1个通道的数据(所以通道数变为1) a[:2,:1,:,:].shape a[:2,:1].shape #torch.Size([2, 1, 28, 28]) #从后面取(-1表示最后一个,从最后一个取到最后,也就是一个通道) a[:2,-1:,:,:].shape #torch.Size([2, 1, 28, 28])
#规则间隔索引 #在图片的矩阵进行隔行与隔列索引 0:28:2表示从0到28(不包括28),间隔数为2 a[:,:,0:28:2,0:28:2].shape a[:,:,::2,::2].shape #torch.Size([4, 3, 14, 14])
note: index_select()函数:
第一个参数表示对哪个维度进行操作;第二个参数是index(必须是tensor类型)
#不规则间隔索引 #对第0张与第2张图片进行操作 a.index_select(0,torch.tensor([0,2])).shape #torch.Size([2, 3, 28, 28]) #选择两个通道 a.index_select(1,torch.tensor([1,2])).shape #torch.Size([4, 2, 28, 28]) #只取8行 a.index_select(2,torch.arange(8)).shape #torch.Size([4, 3, 8, 28])
#任意多维度索引 #全部 a[...].shape #torch.Size([4, 3, 28, 28]) #第0张图片 a[0,...].shape #torch.Size([3, 28, 28]) #第0张图片第1个通道 a[0,1,...].shape #torch.Size([28, 28]) a[...,2].shape #torch.Size([4, 3, 28])
note: .masked_select()会将筛选出来的元素打平(因为无法维护原来的shape),可以获取满足一些条件的值的位置索引,然后用这个索引去取出这些位置的元素。
#使用掩码索引 x = torch.randn(2,3) # tensor([[ 1.0514, -0.3103, 0.9764], # [ 0.2071, -2.1070, -0.8053]]) mask = x.ge(0.5)#大于等于0.5的元素 # tensor([[ True, False, True], # [False, False, False]]) z = torch.masked_select(x,mask) #tensor([1.0514, 0.9764])
#take索引,基于目标Tensor的flatten形式下的,即摊平后的Tensor的索引。 a = torch.tensor([[4,3,5],[6,7,8]]) #把a打平编程torch.tensor([4,3,5,6,7,8]),再取出下表为0,2,5的值 torch.take(a,torch.tensor([0,2,5])) #tensor([4, 5, 8])
总结:
继续加油。



