Tensorflow实现部分参数梯度更新操作
在深度学习中,迁移学习经常被使用,在大数据集上预训练的模型迁移到特定的任务,往往需要保持模型参数不变,而微调与任务相关的模型层。
本文主要介绍,使用tensorflow部分更新模型参数的方法。
1.根据Variablescope剔除需要固定参数的变量
defget_variable_via_scope(scope_lst): vars=[] forscinscope_lst: sc_variable=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope=scope) vars.extend(sc_variable) returnvars trainable_vars=tf.trainable_variables() no_change_scope=['your_unchange_scope_name'] no_change_vars=get_variable_via_scope(no_change_scope) forvinno_change_vars: trainable_vars.remove(v) grads,_=tf.gradients(loss,trainable_vars) optimizer=tf.train.AdamOptimizer(lr) train_op=optimizer.apply_gradient(zip(grads,trainable_vars),global_step=global_step)
2.使用tf.stop_gradient()函数
在建立Graph过程中使用该函数,非常简洁地避免了使用scope获取参数
3.一个矩阵中部分行或列参数更新
如果一个矩阵,只有部分行或列需要更新参数,其它保持不变,该场景很常见,例如wordembedding中,一些预定义的领域相关词保持不变(使用领域相关wordembedding初始化),而另一些通用词变化。
importtensorflowastf importnumpyasnp defentry_stop_gradients(target,mask): mask_h=tf.abs(mask-1) returntf.stop_gradient(mask_h*target)+mask*target mask=np.array([1.,0,1,1,0,0,1,1,0,1]) mask_h=np.abs(mask-1) emb=tf.constant(np.ones([10,5])) matrix=entry_stop_gradients(emb,tf.expand_dims(mask,1)) parm=np.random.randn(5,1) t_parm=tf.constant(parm) loss=tf.reduce_sum(tf.matmul(matrix,t_parm)) grad1=tf.gradients(loss,emb) grad2=tf.gradients(loss,matrix) printmatrix withtf.Session()assess: printsess.run(loss) printsess.run([grad1,grad2])
以上这篇Tensorflow实现部分参数梯度更新操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。