pytorch学习笔记(3) 动态调整学习率和hook函数的使用.
动态调整学习率
def adjust_learning_rate(optimizer, epoch, params):
lr = params["LEARNING_RATE"] * (0.1 **(epoch // 20))
for param_group in optimizer.param_groups:
# print("params", param_group)
param_group['lr'] = lr
这个函数能够根据epoch动态的调整学习率,使用逻辑为:
optimizer = optim.SGD(model.parameters(), lr = params["learning_rate"], ...)
for i in range(epochs):
adjust_learning_rate(optimizer, i, params)
train(...)
如何提取CNN中间层的输出
使用场景为迁移学习. 针对不同的领域有不同的场景. 通常来说如果需要解决的问题数据集非常少,不足以训练一个大型神经网络,如果想要继续使用神经网络的特征提取能力,那么可以考虑微调一个已经训练好的模型.
- 比如说先将网络在大型的数据集ImageNet上训练, 然后再用只包含猫和狗的小型数据集进行微调. 用来识别猫狗
- 或者使用多任务的数据集来训练神经网络, 然后将这个迁移到其他与源任务相关的数据集用来做特征提取器,提取出来的特征用SVM这种高级分类器来进行分类, 这就是迁移学习.
今天笔者将在这里总结上面的第二个场景,如果使用已经训练好的网络模型进行任意卷积层的特征提取!
一共有三种方法.
- 手动实现forward函数,也就是PyTorch论坛上提到的.
- 使用hook函数勾取某一层的输出.
- 在需要提取特征的地方定义一个变量.
手动实现forward函数
代码逻辑如下:
class Extract():
def __init__(self, **params)
self.model_path = params["model_path"] # 模型保存地址
self.model = self.load_model(