Keras: model实现固定部分layer,训练部分layer操作


Posted in Python onJune 28, 2020

需求:Resnet50做调优训练,将最后分类数目由1000改为500。

问题:网上下载了resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5,更改了Resnet50后,由于所有层均参加训练,导致训练速度慢。实际上只需要训练最后3层,前面的层都不需要训练。

解决办法:

①将模型拆分为两个模型,一个为前面的notop部分,一个为最后三层,然后利用model的trainable属性设置只有后一个model训练,最后将两个模型合并起来。

②不用拆分,遍历模型的所有层,将前面层的trainable设置为False即可。代码如下:

for layer in model.layers[:-3]:
 print(layer.trainable)
 layer.trainable = False

注意事项:

①尽量不要这样:

layers.Conv2D(filters1, (1, 1), trainable=False)(input_tensor)

因为容易出错。。。

②加载notop参数时注意by_name=True.

补充知识:Keras关于训练冻结部分层

设置冻结层有两种方式。

(不推荐)是在搭建网络时,直接将某层的trainable设置为false,例如:

layers.Conv2D(filters1, (1, 1), trainable=False)(input_tensor)

在网络搭建完成时,遍历model.layer,然后将layer.trainable设置为False:

# 冻结网络倒数的3层
for layer in model.layers[:-3]:
 print(layer.trainable)
 layer.trainable = False

也可以根据layer.name来确定哪些层需要冻结,例如冻结最后一层和RNN层:

for layer in model.layers:
 layerName=str(layer.name)
 if layerName.startswith("RNN_") or layerName.startswith("Final_"):
 layer.trainable=False

可以在实例化之后将网络层的 trainable 属性设置为 True 或 False。为了使之生效,在修改 trainable 属性之后,需要在模型上调用 compile()。

这是一个例子

x = Input(shape=(32,))
layer = Dense(32)
layer.trainable = False
y = layer(x)
 
frozen_model = Model(x, y)
# 在下面的模型中,训练期间不会更新层的权重
frozen_model.compile(optimizer='rmsprop', loss='mse')
 
layer.trainable = True
trainable_model = Model(x, y)
# 使用这个模型,训练期间 `layer` 的权重将被更新
# (这也会影响上面的模型,因为它使用了同一个网络层实例)
trainable_model.compile(optimizer='rmsprop', loss='mse')
 
frozen_model.fit(data, labels) # 这不会更新 `layer` 的权重
trainable_model.fit(data, labels) # 这会更新 `layer` 的权重

在网络搭建时,可以考虑最后一个分类层命名和分类数量关联,这样当费雷数量方式变化时,model.load_weight(“weight.h5”,by_name=True)不会加载最后一层

以上这篇Keras: model实现固定部分layer,训练部分layer操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
由Python运算π的值深入Python中科学计算的实现
Apr 17 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
使用tensorflow实现线性回归
Sep 08 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
Python制作词云图代码实例
Sep 09 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 Python
python scipy 稀疏矩阵的使用说明
May 26 Python
sklearn的predict_proba使用说明
Jun 28 #Python
基于python实现ROC曲线绘制广场解析
Jun 28 #Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 #Python
浅谈sklearn中predict与predict_proba区别
Jun 28 #Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 #Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 #Python
PyTorch的torch.cat用法
Jun 28 #Python
You might like
PHP原理之异常机制深入分析
2010/08/08 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
学习YUI.Ext第七日-View&JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
Python实现远程调用MetaSploit的方法
2014/08/22 Python
Python实现字典的遍历与排序功能示例
2017/12/23 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
python实现视频读取和转化图片
2019/12/10 Python
python属于跨平台语言码
2020/06/09 Python
python识别验证码的思路及解决方案
2020/09/13 Python
导游词格式
2015/02/13 职场文书
消防安全月活动总结
2015/05/08 职场文书
python pygame入门教程
2021/06/01 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers