解决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解析json实例方法
Nov 19 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
深入理解Django的自定义过滤器
Oct 17 Python
Python多线程扫描端口代码示例
Feb 09 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
Python版中国省市经纬度
Feb 11 Python
python序列类型种类详解
Feb 26 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
Pytest单元测试框架如何实现参数化
Sep 05 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 编写的日历
2006/10/09 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php定时执行任务设置详解
2015/02/06 PHP
php eval函数一句话木马代码
2015/05/21 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
浅谈js闭包理解
2019/03/28 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
Python for i in range ()用法详解
2020/09/18 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
Otel.com:折扣酒店预订
2017/08/24 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
协议书范本
2014/04/23 职场文书
计算机实训报告范文
2014/11/05 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
乱世佳人观后感
2015/06/08 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
Python基于百度API识别并提取图片中文字
2021/06/27 Python