解决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网络编程实例简析
Sep 26 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
详细讲解Python中的文件I/O操作
May 24 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
python妙用之编码的转换详解
Apr 21 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
Python生成数字图片代码分享
Oct 31 Python
python支持多线程的爬虫实例
Dec 21 Python
浅析Python的命名空间与作用域
Nov 25 Python
Python基于Faker假数据构造库
Nov 30 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
php实现encode64编码类实例
2015/03/24 PHP
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python验证文件是否可读写代码分享
2017/12/11 Python
python中的变量如何开辟内存
2018/06/26 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
建筑行业的大学生自我评价
2013/12/08 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
信息技术培训感言
2014/03/06 职场文书
营销与策划专业求职信
2014/06/20 职场文书
银行员工考核评语
2014/12/31 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
小学运动会入场口号
2015/12/24 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server