解决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 变量类型及命名规则介绍
Jun 08 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
python解析含有重复key的json方法
Jan 22 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python如何实现视频转代码视频
Jun 17 Python
opencv设置采集视频分辨率方式
Dec 10 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
pytorch 归一化与反归一化实例
Dec 31 Python
关于Django Models CharField 参数说明
Mar 31 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
详解Python中openpyxl模块基本用法
Feb 23 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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
Python中如何获取类属性的列表
2016/12/26 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
python绘制条形图方法代码详解
2017/12/19 Python
Django后台admin的使用详解
2019/07/08 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
艺术应用与设计个人的自我评价
2013/11/23 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
施工材料员岗位职责
2014/02/12 职场文书
优秀护士演讲稿
2014/04/30 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
师德承诺书
2015/01/20 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
python编程实现清理微信重复缓存文件
2021/11/01 Python