1. 程式人生 > >(原)tensorflow中finetune某些層

(原)tensorflow中finetune某些層

master oba 參考 -a ads tro ids .html class

轉載請註明處處:

http://www.cnblogs.com/darkknightzh/p/7608709.html

參考網址:

https://kratzert.github.io/2017/02/24/finetuning-alexnet-with-tensorflow.html

https://github.com/kratzert/finetune_alexnet_with_tensorflow/blob/master/finetune.py#L109

https://github.com/davidsandberg/facenet

得到正常訓練時的train_op時,使用tf.trainable_variables(),想要finetune,使用下面這句話(參考網址1,其實網址1和2都是同一個人的。。。):

fine_tune_var_list = [v for v in tf.trainable_variables() if v.name.split(/)[0] in train_layers]

或者

fine_tune_var_list = [i for i in tf.trainable_variables() if fc1/weights in i.name]

可以得到需要finetune的參數。如果不知道參數名字,可以先print出來:

for var in tf.trainable_variables():
    print(var)

然後找到需要finetune的層。也可以通過其他方法,只要能找到就行。。。

將fine_tune_var_list傳給train_op,之後正常訓練,便可以對網絡進行finetune了,如下(見參考網址2):

with tf.name_scope("train"):
    # Get gradients of all trainable variables
    gradients = tf.gradients(loss, var_list)
    gradients = list(zip(gradients, var_list))

    # Create optimizer and apply gradient descent to the trainable variables
optimizer = tf.train.GradientDescentOptimizer(learning_rate) train_op = optimizer.apply_gradients(grads_and_vars=gradients)

當然,也可以使用自己其他的代碼。但是,我這邊直接使用上面代碼,保存模型時,後綴都是0,把train_op 那句改成train_op = optimizer.apply_gradients(grads_and_vars=gradients , global_step=global_step)就可以了。當然,我出現的問題,和自己的代碼有關系。

也可以用下面的代碼(從參考網址3中提取):

opt = tf.train.GradientDescentOptimizer(learning_rate)
train_op = get_train_op(grad, opt, global_step, args.moving_average_decay, finetune_params)

其中,

def get_train_op(grads, opt, global_step, moving_average_decay, train_var):
        
    # Apply gradients.
    apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)
  
    # Track the moving averages of trainable variables.
    variable_averages = tf.train.ExponentialMovingAverage(moving_average_decay, global_step)
    variables_averages_op = variable_averages.apply(train_var)
  
    with tf.control_dependencies([apply_gradient_op, variables_averages_op]):
        train_op = tf.no_op(name=train)
  
    return train_op

註意的是,參考網址2中的代碼,再對參數更新的時候,沒有使用滑動平均。上面的代碼,使用了滑動平均。

(原)tensorflow中finetune某些層