解决Keras 中加入lambda层无法正常载入模型问题


Posted in Python onJune 16, 2020

刚刚解决了这个问题,现在记录下来

问题描述

当使用lambda层加入自定义的函数后,训练没有bug,载入保存模型则显示Nonetype has no attribute 'get'

问题解决方法:

这个问题是由于缺少config信息导致的。lambda层在载入的时候需要一个函数,当使用自定义函数时,模型无法找到这个函数,也就构建不了。

m = load_model(path,custom_objects={"reduce_mean":self.reduce_mean,"slice":self.slice})

其中,reduce_mean 和slice定义如下

def slice(self,x, turn):
    """ Define a tensor slice function
    """
    return x[:, turn, :, :]
  def reduce_mean(self, X):
    return K.mean(X, axis=-1)

补充知识:含有Lambda自定义层keras模型,保存遇到的问题及解决方案

一,许多应用,keras含有的层已经不能满足要求,需要透过Lambda自定义层来实现一些layer,这个情况下,只能保存模型的权重,无法使用model.save来保存模型。

保存时会报

TypeError: can't pickle _thread.RLock objects

二,解决方案,为了便于后续的部署,可以转成tensorflow的PB进行部署。

from keras.models import load_model
import tensorflow as tf
import os, sys
from keras import backend as K
from tensorflow.python.framework import graph_util, graph_io

def h5_to_pb(h5_weight_path, output_dir, out_prefix="output_", log_tensorboard=True):
  if not os.path.exists(output_dir):
    os.mkdir(output_dir)
  h5_model = build_model()
  h5_model.load_weights(h5_weight_path)
  out_nodes = []
  for i in range(len(h5_model.outputs)):
    out_nodes.append(out_prefix + str(i + 1))
    tf.identity(h5_model.output[i], out_prefix + str(i + 1))
  model_name = os.path.splitext(os.path.split(h5_weight_path)[-1])[0] + '.pb'
  sess = K.get_session()
  init_graph = sess.graph.as_graph_def()
  main_graph = graph_util.convert_variables_to_constants(sess, init_graph, out_nodes)
  graph_io.write_graph(main_graph, output_dir, name=model_name, as_text=False)
  if log_tensorboard:
    from tensorflow.python.tools import import_pb_to_tensorboard
    import_pb_to_tensorboard.import_to_tensorboard(os.path.join(output_dir, model_name), output_dir)

def build_model():
  inputs = Input(shape=(784,), name='input_img')
  x = Dense(64, activation='relu')(inputs)
  x = Dense(64, activation='relu')(x)
  y = Dense(10, activation='softmax')(x)
  h5_model = Model(inputs=inputs, outputs=y)
  return h5_model

if __name__ == '__main__':
  if len(sys.argv) == 3:
    # usage: python3 h5_to_pb.py h5_weight_path output_dir
    h5_to_pb(h5_weight_path=sys.argv[1], output_dir=sys.argv[2])

以上这篇解决Keras 中加入lambda层无法正常载入模型问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python抓取Discuz!用户名脚本代码
Dec 30 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
python输入错误后删除的方法
Oct 12 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
Python如何使用input函数获取输入
Aug 06 Python
python如何爬取动态网站
Sep 09 Python
Django自定义YamlField实现过程解析
Nov 11 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 Python
结束运行python的方法
Jun 16 #Python
深入理解Python 多线程
Jun 16 #Python
keras.layer.input()用法说明
Jun 16 #Python
python适合做数据挖掘吗
Jun 16 #Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 #Python
Python实现SMTP邮件发送
Jun 16 #Python
python语言中有算法吗
Jun 16 #Python
You might like
phpmail类发送邮件函数代码
2012/02/20 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
JavaScript函数详解
2015/02/27 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
利用Python破解斗地主残局详解
2017/06/30 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
酒店行政人事部经理职务说明书
2014/02/26 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
代理人委托书
2014/09/16 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android