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)#继续前向传播