1.为什么使用张量(Tensor)?
1)GPU很好地支持加速计算,而Numpy仅支持CPU计算;
2) 张量类支持自动微分。
2.一些简单的张量操作
import torch
x = torch.arange(12)
print(x)
print(x.shape) # 访问张量的形状
print(x.numel()) # 张量中元素的总数
print(x.reshape(3, 4))
print(torch.zeros(2, 3, 4))
print(torch.ones(2, 3, 4))
print(torch.randn(3, 4)) # 每个元素都从均值为0,标准差为1的正态分布中随机采样
print(torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]))
执行窗口:
3.按元素运算:多个张量之间的数学运算是按元素运算
x = torch.tensor([1, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(x**y)
print(torch.exp(x))
执行窗口:
4.张量连接
shape的第一个元素:shape[0]指张量的行数,shape的第二个元素:shape[1]指张量的列数。
所以torch.cat((X,Y), dim=0)是在扩行,torch.cat((X,Y), dim=1)是在扩列。
torch.cat()的使用要求是,必须在连接维度以外的维度上匹配。
x = torch.tensor([[1, 2, 4, 8], [4, 3, 2, 1]])
y = torch.tensor([[2, 2, 2, 2],[1, 1, 1, 1]])
print(torch.cat((x, y), dim=0))
print(torch.cat((x, y), dim=1))
如果y=torch.tensor[2, 2, 2, 2],那么程序会默认报错,因为这是一个(4,1)的张量,而x是(2,4),dim=0时,列数应当相同。dim=1时,行数应当相同,都不相同当然会报错。
5.按元素比较,记住就行
x = torch.tensor([[1, 2, 4, 8], [4, 3, 2, 1]])
y = torch.tensor([[2, 2, 2, 2], [1, 1, 1, 1]])
print(x == y)
print(x.sum())
6.tensor的切片运算
x = torch.tensor([[1, 2, 4, 8], [4, 3, 2, 1]])
print(x[:, 0:1])
print(x[-1])
7.节省内存
提出问题Y=X+Y,所得到的Y不会保存在原来的内存处,而是指向新分配的内存处的张量。
print(id(y))
y = x+y
print(id(y))
观察到前后两个内存地址是不同的。
解决方法:用切片表示就行。
y[:] = x+y
8.广播机制
形状不同的张量按元素操作:
1.通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
2.对生成的数组按元素操作
x = torch.tensor([[1, 2, 4, 8], [4, 3, 2, 1]])
y = torch.tensor([2, 2, 2, 2])
print(x+y)
9.课后题
1)在比较环节将X==Y修改成X<Y一样可以比较;
2)即使是三维张量,广播机制依旧是有效的。
总结:张量就是数组。