解决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实现带声音的摩斯码翻译实现方法
May 20 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python取代netcat过程分析
Feb 10 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 Python
Django与数据库交互的实现
Jun 03 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、Python和Javascript的装饰器模式对比
2015/02/03 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
javascript Base类 包含基本的方法
2009/07/22 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
2013/06/25 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python列表生成器的循环技巧分享
2015/03/06 Python
用Python实现一个简单的线程池
2015/04/07 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
python名片管理系统开发
2020/06/18 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
eBay德国站:eBay.de
2017/09/14 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
超市端午节活动方案
2014/01/23 职场文书
钳工实训报告总结
2014/11/04 职场文书
七一活动主持词
2015/06/29 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书