解决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 16 Python
详解Python中的正则表达式
Jul 08 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
python和opencv实现抠图
Jul 18 Python
Python适配器模式代码实现解析
Aug 02 Python
mac使用python识别图形验证码功能
Jan 10 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
python 发送邮件的四种方法汇总
Dec 02 Python
python状态机transitions库详解
Jun 02 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中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
angularJS开发注意事项
2018/05/26 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
在Django的上下文中设置变量的方法
2015/07/20 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
python redis 删除key脚本的实例
2019/02/19 Python
python实现机器人卡牌
2019/10/06 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
简历自荐信
2013/12/02 职场文书
冬季安全检查方案
2014/05/23 职场文书
十佳党员事迹材料
2014/08/28 职场文书
公务员培的训心得体会
2014/09/01 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
公司董事任命书
2015/09/21 职场文书
大学学生会竞选稿
2015/11/19 职场文书