解决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学习笔记(二)基础语法
Jun 06 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
Python中字典的setdefault()方法教程
Feb 07 Python
Python读写zip压缩文件的方法
Aug 29 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
Python实现微信机器人的方法
Sep 06 Python
django使用xadmin的全局配置详解
Nov 15 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
python实现梯度下降法
Mar 24 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
图解上海144收音机
2021/03/02 无线电
PHP里的中文变量说明
2011/07/23 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
python调用cmd复制文件代码分享
2013/12/27 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python中内建模块collections如何使用
2020/05/27 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
活动邀请函范文
2014/01/19 职场文书
2014年端午节活动方案
2014/03/11 职场文书
公司门卫岗位职责
2014/03/15 职场文书
学校校庆演讲稿
2014/05/22 职场文书
亮剑观后感300字
2015/06/05 职场文书
离婚协议书范文2016
2016/03/18 职场文书