2.2.1创建tensor的函数
torch.empty(5, 3)
torch.rand(5, 3)
torch.zeros(5, 3, dtype=torch.long)
torch.tensor([5.5, 3]) # 根据数组创建
# 获取形状
print(x.size())
print(x.shape)
还有很多函数可以创建Tensor,去翻翻官方API就知道了,下表给了一些常用的作参考。
normal(mean,std)/uniform(from,to)
这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)。
三种加法:
改变形状:
转换python数据
线性代数
另外,PyTorch还支持一些线性函数,这里提一下,免得用起来的时候自己造轮子,具体用法参考官方文档。如下表所示:
addmm/addbmm/addmv/addr/baddbmm..
PyTorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,可参考官方文档。
当对两个形状不同的Tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。
2.2.5 Tensor和NumPy相互转换
所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换。
2.3 自动求梯度
在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。
Tensor是这个包的核心类,如果将其属性.requires_grad设置为True,它将开始追踪(track)在其上的所有操作(这样就可以利用链式法则进行梯度传播了)。完成计算后,可以调用.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad属性中。
注意在y.backward()时,如果y是标量,则不需要为backward()传入任何参数;否则,需要传入一个与y同形的Tensor。解释见 2.3.2 节。
如果不想要被继续追踪,可以调用.detach()将其从追踪记录中分离出来,这样就可以防止将来的计算被追踪,这样梯度就传不过去了。
可以用with torch.no_grad()将不想被追踪的操作代码块包裹起来,这种方法在评估模型的时候很常用,因为在评估模型时,我们并不需要计算可训练参数(requires_grad=True)的梯度。
Function是另外一个很重要的类。Tensor和Function互相结合就可以构建一个记录有整个计算过程的有向无环图(DAG)。
每个Tensor都有一个.grad_fn属性,该属性即创建该Tensor的Function, 就是说该Tensor是不是通过某些运算得到的,若是,则grad_fn返回一个与这些运算相关的对象,否则是None。
tensor.requires_grad 用于说明当前量是否需要在计算中保留对应的梯度信息
标量out,直接调用out.backward();不允许使用张量对张量求导,需要加权平均,例如out.backward(w);
如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么我么可以对tensor.data进行操作。