tensorflow冻结部分层,只训练某一层

原创 2018年04月16日 16:45:11
其实fine tune就是这样子的,如何把某些层冻结,然后训练最后一层。




那么在tensorflow里如何实现呢?




优化的时候,只选择优化特定层的参数即可。




如下:




-Python 代码
1
#定义优化算子
2
optimizer = tf.train.AdamOptimizer(1e-3)
3
#选择待优化的参数
4
output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope='outpt')
5
train_step = optimizer.minimize(loss_score,var_list = output_vars)




在这里,碰到了一个问题,关于adam的问题,如下:
Failed precondition: Attempting to use uninitialized value beta1_power
查了一下,这个参数应该是Adam优化算子里的参数。问题出在定义优化算子的时候,晚于参数初始化的时间,导致beta1——power没有初始化


即如下的顺序:
-Python 代码
1
sess.run(init)
2
train_step = optimizer.minimize(loss_score,var_list=output_vars)


改变下顺序即可
-Python 代码
1
train_step = optimizer.minimize(loss_score,var_list=output_vars)
2
sess.run(init)


参考链接:
https://stackoverflow.com/questions/38749120/fine-tuning-a-deep-neural-network-in-tensorflow
https://stackoverflow.com/questions/45093499/how-to-fine-tune-weights-in-specific-layers-in-tensorflow


在用finetune的时候,发现速度并没有比retrain的速度快太多。分析原因在于finetune的时候,冻结了其它层,那么反向传播不会进入到这些层中,但是前向计算是会有的。如果想进一步加速finetune的速度,可以考虑先把所有数据执行一次前向操作,保存最后一层的中间的结果,然后以此中间结果为输入,训练整个网络。可以节省前向计算的一些时间。但如果finetune的epoch较少,那么感觉读写消耗的时间可能就已经很多了,不划算,加速效果也不明显。
版权声明: https://blog.csdn.net/b876144622/article/details/79962759

Tensorflow一些常用基本概念与函数(4)

摘要:本系列主要对tf的一些常用概念与方法进行描述。本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解。为‘Tensorflow一些常用基本概念与函数’系...
  • lenbow
  • lenbow
  • 2016年08月16日 11:22
  • 57368

Tensorflow查看网络(inspect)、冻结变量(freeze)和迁移训练(finetune)

Tensorflow查看网络、冻结变量和迁移训练 (Inspect network structure, freeze graph variables, and finetune/transfer ...
  • BobAuditore
  • BobAuditore
  • 2018年01月05日 14:59
  • 154

tensorflow 恢复指定层与不同层指定不同学习率

#tensorflow 中从ckpt文件中恢复指定的层或将指定的层不进行恢复: #tensorflow 中不同的layer指定不同的学习率 with tf.Graph().as_default():...
  • LIYUAN123ZHOUHUI
  • LIYUAN123ZHOUHUI
  • 2017年04月07日 17:13
  • 3578

tensorflow官方教程:重新训练模型的最后一层,以应对新分类

tensorflow官方教程:重新训练模型的最后一层,以应对新分类 本文主要包含如下内容: tensorflow官方教程重新训练模型的最后一层以应对新分类 针对Flowers数据集重新训练...
  • u010579901
  • u010579901
  • 2018年01月16日 13:55
  • 340

在caffe中固定某些网络参数,只训练某些层

实现的关键变量是:propagate_down 含义:表示当前层的梯度是否向前传播 比如有4个全连接层A->B->C->D     a. 你希望C层的参数不会改变,C前面的AB层的参数也不会改变,这种...
  • leibaojiangjun1
  • leibaojiangjun1
  • 2016年12月14日 10:37
  • 2589

提取深度网络某一层特征

1.利用框架:     TensorFlow+keras 2.提取深度网络某一层特征的核心函数:     import keras.backend as K     def get_activ...
  • a327915304
  • a327915304
  • 2017年10月12日 15:24
  • 278

PyTorch学习系列(十)——如何在训练时固定一些层?

有时我们会用其他任务(如分类)预训练好网络,然后固定卷积层作为图像特征提取器,然后用当前任务的数据只训练全连接层。那么PyTorch如何在训练时固定底层只更新上层呢?这意味着我们希望反向传播计算梯度时...
  • VictoriaW
  • VictoriaW
  • 2017年05月27日 10:52
  • 5734

Tensorflow-slim 学习笔记(二)第一层目录代码解读

http://www.cnblogs.com/bmsl/p/dongbin_bmsl_02.html通过阅读代码来学习,一向时最直接快速的。本章将讲解slim的第一层目录tensorflow/tens...
  • yang9649
  • yang9649
  • 2018年03月01日 11:43
  • 77

keras文档快速问答(翻译自Keras FAQ: Frequently Asked Keras Questions)

本文主要介绍keras的一些常见问题,翻译自keras文档。
  • zhuangshuohao
  • zhuangshuohao
  • 2017年06月30日 11:51
  • 404

caffe微调网络时的注意事项(持续更新中)

最近在微调遇到了一些困难,在此做一个记录,与大家分享!      第一个,微调数据的准备      微调的目的是使别人训练好的模型更适合自己的数据,因此,微调的数据一般都是适合自己应用的数据。但是,大...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2016年05月04日 11:04
  • 8051
收藏助手
不良信息举报
您举报文章:tensorflow冻结部分层,只训练某一层
举报原因:
原因补充:

(最多只允许输入30个字)