我在Pytorch中使用this实现SegNet,我想微调它。 我已经在线阅读了,我发现了this方法(基本上冻结了除网中最后一层之外的所有图层)。我的问题是SegNet有超过100层,我正在寻找一种更简单的方法,而不是编写100行代码。
你认为这可行吗?或者这完全是胡说八道?
import torch.optim as optim
model = SegNet()
for name, param in model.named_modules():
if name != 'conv11d': # the last layer should remain active
param.requires_grad = False
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
def train():
...
如何检查这是否按预期工作?
答案 0 :(得分:0)
此过程称为微调,将requires_grad
设置为False
是一种很好的方法。来自pytorch docs:
每个Tensor都有一个标志:
requires_grad
,允许从梯度计算中细粒度地排除子图,并可以提高效率。
...
如果对需要渐变的操作有单个输入,则其输出也需要渐变。相反,只有当所有输入都不需要梯度时,输出也不需要它。从不在子图中执行向后计算,其中所有张量都不需要渐变。
有关相关示例,请参阅this pytorch tutorial。
检查此功能的一种简单方法是查看初始错误率。假设任务类似于网络最初训练的任务,它们应该比随机初始化的网络低得多。