我正在使用Pytorch中的这个SegNet实现,并希望对其进行微调。我在网上查阅了一些资料,发现了这种方法(基本思想是冻结网络中除了最后一层之外的所有层)。我的问题是SegNet有超过100层,我希望找到一种更简单的方法来实现,而不想编写100行代码。
你认为这个方法可行吗?还是完全行不通?
import torch.optim as optimmodel = SegNet()for name, param in model.named_modules(): if name != 'conv11d': # 最后一层应该保持活跃 param.requires_grad = Falseoptimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)def train(): ...
我如何检查这个方法是否按预期工作?
回答:
这个过程称为微调,将requires_grad
设置为False
是实现微调的好方法。根据pytorch文档:
每个Tensor都有一个标志:
requires_grad
,它允许对子图进行细粒度的排除,以提高计算效率。
…
如果一个操作有一个需要梯度的输入,那么它的输出也将需要梯度。相反,只有当所有输入都不需要梯度时,输出才不需要梯度。在所有Tensor都不需要梯度的情况下,子图中永远不会执行反向计算。
请参阅这个pytorch教程以获取相关示例。
检查这种方法是否工作的一个简单方法是查看初始错误率。假设任务与网络最初训练的任务相似,那么错误率应该远低于随机初始化的网络。