在深度学习中,迁移学习经常被使用,在大数据集上预训练的模型迁移到特定的任务,往往需要保持模型参数不变,而微调与任务相关的模型层。
本文主要介绍,使用tensorflow部分更新模型参数的方法。
<强> 1。根据变量作用域剔除需要固定参数的变量强>
def get_variable_via_scope (scope_lst): var=[] 在scope_lst sc: sc_variable=tf.get_collection (tf.GraphKeys.TRAINABLE_VARIABLES范围=范围) vars.extend (sc_variable) 返回var trainable_vars=tf.trainable_variables () no_change_scope=(“your_unchange_scope_name”) no_change_vars=get_variable_via_scope (no_change_scope) 在no_change_vars v的: trainable_vars.remove (v) 毕业生,_=特遣部队。trainable_vars梯度(损失) 优化器=tf.train.AdamOptimizer (lr) train_op=优化器。trainable_vars apply_gradient (zip(毕业生),global_step=global_step)
<强> 2。使用tf.stop_gradient()函数强>
在建立图过程中使用该函数,非常简洁地避免了使用范围获取参数
<强> 3。一个矩阵中部分行或列参数更新强>
如果一个矩阵,只有部分行或列需要更新参数,其它保持不变,该场景很常见,例如字嵌入中,一些预定义的领域相关词保持不变(使用领域相关字嵌入初始化),而另一些通用词变化。
进口tensorflow特遣部队 进口numpy np 面具def entry_stop_gradients(目标): mask_h=tf.abs (mask-1) 返回特遣部队。stop_gradient (mask_h *目标)+面具*目标 掩码=np.array ([1。0 1 1 0 0,1,1,0,1]) mask_h=np.abs (mask-1) emb=tf.constant (np。的((10、5))) 矩阵=entry_stop_gradients (emb tf.expand_dims(面具,1)) 改=np.random。randn (5、1) t_parm=tf.constant(改) 损失=tf.reduce_sum (tf。matmul(矩阵,t_parm)) grad1=特遣部队。梯度(损失、emb) grad2=特遣部队。梯度(损失矩阵) 打印矩阵 与tf.Session税(): 打印sess.run(损失) 打印sess.run ([grad1 grad2])
以上这篇Tensorflow实现部分参数梯度更新操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。