解决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实现过滤单个Android程序日志脚本分享
Jan 16 Python
python实现简单的计时器功能函数
Mar 14 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
django 解决manage.py migrate无效的问题
May 27 Python
Python列表list排列组合操作示例
Dec 18 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
python实现复制文件到指定目录
Oct 16 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
python多进程下的生产者和消费者模型
May 07 Python
python实现学生成绩测评系统
Jun 22 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 更新数据库中断的解决方法
2009/06/05 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
js取得url地址参数实例
2013/02/22 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python操作mysql代码总结
2018/06/01 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
请假条的格式
2014/04/11 职场文书
军训口号
2014/06/13 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
教师节感想
2015/08/11 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server