解决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中的闭包总结
Sep 18 Python
python动态性强类型用法实例
May 09 Python
Python实现把json格式转换成文本或sql文件
Jul 10 Python
Python爬取三国演义的实现方法
Sep 12 Python
python实现log日志的示例代码
Apr 28 Python
Python中垃圾回收和del语句详解
Nov 15 Python
Python实现多属性排序的方法
Dec 05 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
python3 反射的四种基本方法解析
Aug 26 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
浅析python redis的连接及相关操作
Nov 07 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 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
DC动漫人物排行
2020/03/03 欧美动漫
PHP中防止SQL注入方法详解
2014/12/25 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
React-native桥接Android原生开发详解
2018/01/17 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
Python入门必须知道的11个知识点
2018/03/21 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Python网页解析器使用实例详解
2020/05/30 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
一个SQL面试题
2014/08/21 面试题
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
2015秋季新学期开学寄语
2015/05/28 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android