分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

(原)tensorflow中finetune某些层

发布时间:2023-09-06 01:14责任编辑:顾先生关键词:暂无标签

转载请注明处处:

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某些层

原文地址:http://www.cnblogs.com/darkknightzh/p/7608709.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved