解决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开发之str.format()用法实例分析
Feb 22 Python
关于Django外键赋值问题详解
Aug 13 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 Python
Python找出最小的K个数实例代码
Jan 04 Python
使用python3+xlrd解析Excel的实例
May 04 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
opencv+python实现均值滤波
Feb 19 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 Python
python用字节处理文件实例讲解
Apr 13 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
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
php创建session的方法实例详解
2015/01/27 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jQuery事件用法详解
2016/10/06 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
python杀死一个线程的方法
2015/09/06 Python
Random 在 Python 中的使用方法
2018/08/09 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
Python用input输入列表的实例代码
2020/02/07 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
求职自荐书范文
2013/12/04 职场文书
大学生实习自我鉴定
2013/12/11 职场文书
全国道德模范事迹
2014/02/01 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
期末自我鉴定
2014/02/02 职场文书
七年级地理教学计划
2015/01/22 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers