Autograd
pytorch最重要的机制。
Tensor
torch.Tensor是最核心的class,将其.requires_grad设为True后,会开始追踪这个Tensor受到的所有操作。完成计算以后再call .backward(),所有梯度都会自动计算,并累加在.grad里。
停止tracking,call .detach()
Function也是一个很重要的class。每个tensor有个.grad_fn说明它从哪个Function得来。举例子:
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
print(y.grad_fn)
Out:
<AddBackward0 object at 0x7fe98e797f60>
说明y是通过Add得到的
Gradients
先用.backward()计算梯度,然后用.grad可以得到梯度的值。
停止计算梯度,可以用torch.no_grad()把代码包起来,也可以用.detach()。
指定gpu id
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
训练和测试
当网络中有 dropout,bn 的时候。训练的要记得 net.train(), 测试 要记得 net.eval()(https://blog.csdn.net/u012436149/article/details/78623576)
这是因为eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大https://blog.csdn.net/jinxin521125/article/details/78435899