梯度检验
对于一个函数来说,通常有两种计算梯度的方式:
- 数值梯度(numerical gradient);
- 解析梯度(analytic gradient);
数值梯度的优点是容易编程实现,不要求函数可微。然而,数值梯度缺点很明显,通常是近似解,同时求解速度很慢,因此在设计机器学习目标函数时,通常设计成可微的函数,可以快速地求解其解析梯度,同时这个梯度是确切解。
神经网络算法使用反向传播计算目标函数关于每个参数的梯度,可以看做解析梯度。由于计算过程中涉及到的参数很多,反向传播计算的梯度很容易出现误差,导致最后迭代得到效果很差的参数值。
为了确认代码中反向传播计算的梯度是否正确,可以采用梯度检验(gradient check)的方法。通过计算数值梯度,得到梯度的近似值,然后和反向传播得到的梯度进行比较,若两者相差很小的话则证明反向传播的代码是正确无误的。
误差在10^-7说明正确;误差在10^-3说明很可能有问题。
梯度检验通常在调试代码时用,训练时不用(因为太慢)。
不要和Dropout一起用,因为后者没有确定的代价函数。
torch保存和读取模型
假设网络为model = Net()
, optimizer = optim.Adam(model.parameters(), lr=args.lr)
。假设在某个epoch,我们要保存模型参数,优化器参数以及epoch。
一、
- 先建立一个字典,保存三个参数:
1 | state = {'net': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epoch} |
- 调用torch.save():
1 | torch.save(state, dir) |
其中dir
表示保存文件的路径+保存文件名,如’/home/modelpara.pth’
二、
当你想恢复某一阶段的训练(或者进行测试)时,那么就可以读取之前保存的网络模型参数等。
1 | checkpoint = torch.load(dir) |