tensorflow 恢复指定层与不同层指定不同学习率的方法
如下所示:
#tensorflow中从ckpt文件中恢复指定的层或将指定的层不进行恢复: #tensorflow中不同的layer指定不同的学习率 withtf.Graph().as_default(): #存放的是需要恢复的层参数 variables_to_restore=[] #存放的是需要训练的层参数名,这里是没恢复的需要进行重新训练,实际上恢复了的参数也可以训练 variables_to_train=[] forvarinslim.get_model_variables(): excluded=False forexclusioninfine_tune_layers: #比如finetunelayer中包含logits,bottleneck ifvar.op.name.startswith(exclusion): excluded=True break ifnotexcluded: variables_to_restore.append(var) #print('vartorestore:',var) else: variables_to_train.append(var) #print('vartotrain:',var) #这里省略掉一些步骤,进入训练步骤: #将variables_to_train,需要训练的参数给optimizer的compute_gradients函数 grads=opt.compute_gradients(total_loss,variables_to_train) #这个函数将只计算variables_to_train中的梯度 #然后将梯度进行应用: apply_gradient_op=opt.apply_gradients(grads,global_step=global_step) #也可以直接调用opt.minimize(total_loss,variables_to_train) #minimize只是将compute_gradients与apply_gradients封装成了一个函数,实际上还是调用的这两个函数 #如果在梯度里面不同的参数需要不同的学习率,那么可以: capped_grads_and_vars=[]#[(MyCapper(gv[0]),gv[1])forgvingrads_and_vars] #update_gradient_vars是需要更新的参数,使用的是全局学习率 #对于不是update_gradient_vars的参数,将其梯度更新乘以0.0001,使用基本上不动 forgradingrads: forupdate_varsinupdate_gradient_vars: ifgrad[1]==update_vars: capped_grads_and_vars.append((grad[0],grad[1])) else: capped_grads_and_vars.append((0.0001*grad[0],grad[1])) apply_gradient_op=opt.apply_gradients(capped_grads_and_vars,global_step=global_step) #在恢复模型时: withsess.as_default(): ifpretrained_model: print('Restoringpretrainedmodel:%s'%pretrained_model) init_fn=slim.assign_from_checkpoint_fn( pretrained_model, variables_to_restore) init_fn(sess) #这样就将指定的层参数没有恢复
以上这篇tensorflow恢复指定层与不同层指定不同学习率的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。