说明:pytorch(1-3),TensorFlow(4)
fine tune就是冻结网络前面的层,然后训练最后一层
- 给优化器传入所有参数,但将要冻结层的参数的
requires_grad
置为False:
optimizer = optim.SGD(model.parameters(), lr=1e-2) # 传入的是所有的参数 for name, param in model.named_parameters(): if 要冻结的网络层的名字(即name的值): param.requires_grad = False
- 优化器传入不冻结的网络层的参数:
optimizer = optim.SGD(model.不冻结的网络层的name.parameters(), lr=1e-2) # 优化器只传入fc2的参数
- 最优做法是:优化器只传入requires_grad=True的参数,占用的内存会更小一点,效率也会更高。代码及结合1和2
-
节省显存:不将不更新的参数传入
optimizer
-
提升速度:将不更新的参数的
requires_grad
设置为False
,节省了计算这部分参数梯度的时间
-
- 代码如下:
#定义优化算子 optimizer = tf.train.AdamOptimizer( 1e-3) #选择待优化的参数 output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope= 'outpt') train_step = optimizer.minimize(loss_score,var_list = output_vars)
把需要更新梯度的层放在tf.get_collection这个函数里面,不需要更新的不放进去。