解决Keras的自定义lambda层去reshape张量时model保存出错问题


Posted in Python onJuly 01, 2020

前几天忙着参加一个AI Challenger比赛,一直没有更新博客,忙了将近一个月的时间,也没有取得很好的成绩,不过这这段时间内的确学到了很多,就在决赛结束的前一天晚上,准备复现使用一个新的网络UPerNet的时候出现了一个很匪夷所思,莫名其妙的一个问题。谷歌很久都没有解决,最后在一个日语网站上看到了解决方法。

事后想想,这个问题在后面搭建网络的时候会很常见,但是网上却没有人提出解决办法,So, I think that's very necessary for me to note this.

背景

分割网络在进行上采样的时候我用的是双线性插值上采样的,而Keras里面并没有实现双线性插值的函数,所以要自己调用tensorflow里面的tf.image.resize_bilinear()函数来进行resize,如果直接用tf.image.resize_bilinear()函数对Keras张量进行resize的话,会报出异常,大概意思是tenorflow张量不能转换为Keras张量,要想将Kears Tensor转换为 Tensorflow Tensor需要进行自定义层,Keras自定义层的时候需要用到Lambda层来包装。

大概源码(只是大概意思)如下:

from keras.layers import Lambda
import tensorflow as tf
 
first_layer=Input(batch_shape=(None, 64, 32, 3))
f=Conv2D(filters, 3, activation = None, padding = 'same', kernel_initializer = 'glorot_normal',name='last_conv_3')(x)
upsample_bilinear = Lambda(lambda x: tf.image.resize_bilinear(x,size=first_layer.get_shape().as_list()[1:3]))
f=upsample_bilinear(f)

然后编译 这个源码:

optimizer = SGD(lr=0.01, momentum=0.9)
model.compile(optimizer = optimizer, loss = model_dice, metrics = ['accuracy'])
model.save('model.hdf5')

其中要注意到这个tf.image.resize_bilinear()里面的size,我用的是根据张量(first_layer)的形状来做为reshape后的形状,保存模型用的是model.save().然后就会出现以下错误!

异常描述:

在一个epoch完成后保存model时出现下面错误,五个错误提示随机出现:

TypeError: cannot serialize ‘_io.TextIOWrapper' object

TypeError: object.new(PyCapsule) is not safe, use PyCapsule.new()

AttributeError: ‘NoneType' object has no attribute ‘update'

TypeError: cannot deepcopy this pattern object

TypeError: can't pickle module objects

问题分析:

这个有两方面原因:

tf.image.resize_bilinear()中的size不应该用另一个张量的size去指定。

如果用了另一个张量去指定size,用model.save()来保存model是不能序列化的。那么保存model的时候只能保存权重——model.save_weights('mode_weights.hdf5')

解决办法(两种):

1.tf.image.resize_bilinear()的size用常数去指定

upsample_bilinear = Lambda(lambda x: tf.image.resize_bilinear(x,size=[64,32]))

2.如果用了另一个张量去指定size,那么就修改保存模型的函数,变成只保存权重

model.save_weights('model_weights.hdf5')

总结:

​​​​我想使用keras的Lambda层去reshape一个张量

如果为重塑形状指定了张量,则保存模型(保存)将失败

您可以使用save_weights而不是save进行保存

补充知识:Keras 添加一个自定义的loss层(output及compile中,输出及loss的表示方法)

例如:

计算两个层之间的距离,作为一个loss

distance=keras.layers.Lambda(lambda x: tf.norm(x, axis=0))(keras.layers.Subtract(Dense1-Dense2))

这是添加的一个loss层,这个distance就直接作为loss

model=Model(input=[,,,], output=[distance])

model.compile(....., loss=lambda y_true, y_pred: ypred)

以上这篇解决Keras的自定义lambda层去reshape张量时model保存出错问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python列表(list)常用操作方法小结
Feb 02 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
Python实现的下载网页源码功能示例
Jun 13 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
python实现按行分割文件
Jul 22 Python
Python函数参数类型及排序原理总结
Dec 19 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
pycharm sciview的图片另存为操作
Jun 01 Python
python如何操作mysql
Aug 17 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 #Python
学python需要去培训机构吗
Jul 01 #Python
详解python logging日志传输
Jul 01 #Python
python怎么调用自己的函数
Jul 01 #Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 #Python
如何解决安装python3.6.1失败
Jul 01 #Python
python如何求圆的面积
Jul 01 #Python
You might like
PHP新手上路(十)
2006/10/09 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
Python入门篇之条件、循环
2014/10/17 Python
python爬虫 正则表达式解析
2019/09/28 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
护理毕业生自荐信范文
2013/12/22 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
使用Apache Camel表达REST服务的方法
2022/06/10 Servers