0%

深度学习笔记

梯度检验

对于一个函数来说,通常有两种计算梯度的方式:

  • 数值梯度(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. 先建立一个字典,保存三个参数:
1
state = {'net': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epoch}
  1. 调用torch.save():
1
torch.save(state, dir)

其中dir表示保存文件的路径+保存文件名,如’/home/modelpara.pth’

二、

当你想恢复某一阶段的训练(或者进行测试)时,那么就可以读取之前保存的网络模型参数等。

1
2
3
4
checkpoint = torch.load(dir)
model.load_state_dict(checkpoint['net'])
optimizer.load_state_dict(checkpoint['optimizer'])
start_epoch = checkpoint['epoch'] + 1



-------------------本文结束 感谢您的阅读-------------------