解决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中方法链的使用方法
Feb 23 Python
CentOS6.5设置Django开发环境
Oct 13 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
python实现定时提取实时日志程序
Jun 22 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
python使用matplotlib绘制雷达图
Oct 18 Python
使用pandas的box_plot去除异常值
Dec 10 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
Python调用JavaScript代码的方法
Oct 27 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
Python 数据可视化之Bokeh详解
Nov 02 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
正则表达式语法
2006/10/09 Javascript
Docker配置PHP开发环境教程
2016/12/21 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
python的unittest测试类代码实例
2017/12/07 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
大专应届毕业生求职信
2014/07/15 职场文书
商场父亲节活动方案
2014/08/27 职场文书
大学生简短的自我评价
2014/09/12 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
护士心得体会范文
2016/01/25 职场文书
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL