finetune

本文介绍了深度学习中的Finetune技术,包括如何恢复预训练网络、避免名称冲突和设置不同层的学习率。提供两种恢复预训练网络的方法,讨论了slim.get_variables_to_restore()在解决变量名称匹配问题上的应用。同时,文章讲解了PB文件的保存与恢复,指出PB文件中的权重被固化,不适合进一步训练。
摘要由CSDN通过智能技术生成

finetune的含义是获取预训练好的网络的部分结构和权重,与自己新增的网络部分一起训练。下面介绍几种finetune的方法。

完整代码:https://github.com/toyow/learn_tensorflow/tree/master/finetune

一,如何恢复预训练的网络

方法一:

思路:恢复原图所有的网络结构(op)以及权重,获取中间层的tensor,自己只需要编写新的网络结构,然后把中间层的tensor作为新网络结构的输入。

存在的问题:

1.这种方法是把原图所有结构载入到新图中,也就是说不需要的那部分也被载入了,浪费资源。

2.在执行优化器操作的时候,如果不锁定共有的结构(layer2=tf.stop_gradient(layer2,name='layer2_stop')),会导致重名提示报错,因为原结构已经有一个优化器操作了,你再优化一下就重名了。

核心代码:
1.把原网络加载到新图里
def train():
#恢复原网络的op tensor
    with tf.Graph().as_default() as g:
        saver=tf.train.import_meta_graph('./my_ckpt_save_dir/wdy_model-15.meta')#把原网络载入到图g中
2.获取原图中间层tensor作为新网络的输入
        x_input=g.get_tensor_by_name('input/x:0')#恢复原op的tensor
        y_input = g.get_tensor_by_name('input/y:0')
        layer2=g.get_tensor_by_name('layer2/layer2:0')
        #layer2=tf.stop_gradient(layer2,name='layer2_stop')#layer2及其以前的op均不进行反向传播

        softmax_linear=inference(layer2)#继续前向传播
    
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值