解决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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python简单猜数游戏实例
Jul 09 Python
Python+django实现文件上传
Jan 17 Python
matplotlib设置legend图例代码示例
Dec 19 Python
python3+selenium自动化测试框架详解
Mar 17 Python
python的sorted用法详解
Jun 25 Python
python怎么对数字进行过滤
Jul 05 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
python 基于opencv操作摄像头
Dec 24 Python
Python+tkinter实现高清图片保存
Mar 13 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
php 获得汉字拼音首字母的函数
2009/08/01 PHP
深入php数据采集的详解
2013/06/02 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
详解webpack-dev-server使用方法
2018/09/14 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
python单例模式实例分析
2015/04/08 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
python 实现绘制整齐的表格
2019/11/18 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
django 模型中的计算字段实例
2020/05/19 Python
基于Python实现天天酷跑功能
2021/01/06 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
市场营销管理制度
2014/01/29 职场文书
六一节目主持词
2014/04/01 职场文书
《画风》教学反思
2014/04/16 职场文书
大学新生入学教育方案
2014/05/16 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android