在训练数据比较少的时候,我们可以使用pretrained的模型进行 fine tune,如果数据特别少的话,就算是较小的学习率进行 fine tune 也很容易过拟合,这时候,比较好的方式的固定前面层的一些参数,然后进行微调,这样子能够有效的较小过拟合,提高最终的准确率。

    1. class Net(nn.Module):
    2. def __init__(self):
    3. super(Net, self).__init__()
    4. self.conv1 = nn.Conv2d(1, 6, 5)
    5. self.conv2 = nn.Conv2d(6, 16, 5)
    6. for p in self.parameters():
    7. p.requires_grad=False
    8. self.fc1 = nn.Linear(16 * 5 * 5, 120)
    9. self.fc2 = nn.Linear(120, 84)
    10. self.fc3 = nn.Linear(84, 10)
    11. # 在定义优化器的时候,只更新那些要求梯度的参数
    12. optim_params = list(filter(lambda p: p.requires_grad, model.parameters()))
    13. optimizer = optim.Adam(optim_params, lr=lr)

    这样前面的参数就是False,而后面的不变。