pytorch 安装
pytorch 为什么好呢,我个人感觉可能是它比较清晰的model,dataset,以及一套平白的训练流程,还有他的比较丰富论坛,扩展库例如说pytorch Lighting这样的库比较有意思(有点类似于简化训练流程,就像tensorflow的keras)。
安装
个人比较喜欢用专业版的pycahrm(IDE颜粉),anaconda过于臃肿了(miniconda还不错)
##安装python后下载pytorch
pip install torch
pytorch 一些前置知识(个人认为要注意的点)
-
共享内存
import torch x = torch.rand(4,3) # 取第二列 print(x[:, 1]) y = x[0,:] y += 1 print(y) print(x[0, :]) # 源tensor也被改了了
结果会像下面这样
tensor([-0.0720, 0.0666, 1.0336, -0.6965]) tensor([3.7311, 0.9280, 1.2497]) tensor([3.7311, 0.9280, 1.2497])
再就是torch.view 方法改变张量的的形状,但是依旧共享内存
torch.reshape则不会出现这种情况
-
Autograd
torch.tensor 非常强大,每个tensor都有.grad_fn属性,记录了完整的计算历史
当你计算定义x时 就像这样
x = torch.randn(3,3,requires_grad=True)##默认requires_grad属性为False y = x**2 z = y*y*5 out = z.mean() ##此后经过计算的任意一个变量都将携带.grad_fn 属性
计算梯度
out.backward()##求导过程 x.grad##计算梯度
梯度就是雅可比矩阵,再就是涉及到链式法则
注意:grad是累加的,所以当我们更新参数时需要计算一次梯度就将梯度清0,在反向传播之前
x.grad.data.zero_() out.backward() x.grad
example:
out2 = x.sum() out2.backward() print(x.grad) out3 = x.sum() x.grad.data.zero_() out3.backward() print(x.grad) ##ouput tensor([[ 5.7165, -0.0604, 1.0144], [-1.1827, -9.2717, 0.9914], [ 1.0796, 1.0057, 0.9915]]) tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
如果想要只有单单x的值,而将此算进grad图这样
x.data
就OK了
计算时,不想要梯度参与(valid时)
with torch.no_grad(): print((x ** 2).requires_grad)
计算时,不想要梯度参与(valid时)
with torch.no_grad(): print((x ** 2).requires_grad)