tensor的含义
在DL中,tensor指的是多维向量,例如 [ [ [1, 2], [3, 4], [5, 6] ] ]。该tensor的大小为[1, 3, 2]。与list,tuple这些数据结构不同的是,系统会给tensor分配一块连续的内存,而不是分散分配。
创建一个tensor
通过list创建:
points = torch.tensor([[4.0,1.0],[2.0,1.0],[5.0,3.0]])
通过torch.zeros创建,初始化全为0,后续可以自己赋值:
points = torch.zeros(3,2)
out:tensor([[0., 0.],
[0., 0.],
[0., 0.]])
tensor的切片操作
与pthon内置的list操作类似,记录一下之前比较容易出错的和新出现的操作。
somelist[:-1] #取出从第一个元素到倒数第二个元素的所有元素,不包括最后一个
somelist[1:,:] #取出第二行(下标为1)到最后一行的所有列的元素
somelist[1:,0] #取出第二行(下标为1)到最后一行的第0列元素
somelist[1:,1] #取出第二行(下标为1)到最后一行的第1列元素
增加一个维度,也就是增加一个方括号。
points[None]
out:tensor([[[4., 1.],
[2., 1.],
[5., 3.]]])
tensor的broadcast(升维?)和降维操作
img为(3,5,5),weights为(3),batch_t为(2,3,5,5)
img = torch.randn(3,5,5)
weights = torch.tensor([0.2126, 0.7152, 0.0722])
batch_t = torch.randn(2,3,5,5)
使用mean,sum方法降维,-3代表倒数第三个数字。
img_gray_naive = img.mean(-3)
batch_gray_naive = batch_t.mean(-3)
img_gray_naive,batch_gray_naive
out: (torch.Size([5, 5]), torch.Size([2, 5, 5]))
将weights升维为(3,1,1),方便与img相乘,img为(3,5,5),理论上来说只有行数和列数相等的tensor才能相乘(此处为对应元素相乘,并不是矩阵相乘),pytorch中有自动扩充的功能,详情见
broadcast高级应用
unsqueezed_weights = weights.unsqueeze(-1).unsqueeze_(-1)
img_weights = (img * unsqueezed_weights)
使用align_as对齐扩充维度,与img对齐:
weights_aligned = weights.align_as(img)
weights_aligned.shape, weights_aligned.name
out:torch.Size([3, 1, 1]), None
书里面给了一个例子,没怎么看懂:batch_t 的大小为(2, 3, 5, 5) 乘以 大小为(3, 1, 1)unsqueezed_weights, 得到了一个形状为 (2, 3, 5, 5)的tensor,。不清楚第一个数字2是否有扩维。
tensor命名
在创建的时候命名:
weights_named = torch.tensor([0.2126, 0.7152, 0.0722], names = ['channels'])
创建之后使用refine_names:
img_name = img.refine_names(...,'channels','rows','columns')
print('img named:',img_name.shape,img_name.names)
out: img named: torch.Size([3, 5, 5]) ('channels', 'rows', 'columns')
结语
主要是对于降维和扩维的理解不是很清楚,后续用到的话再慢慢理解吧。