解决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实现自动更换ip的方法
May 05 Python
python 文件操作api(文件操作函数)
Aug 28 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
学习python需要有编程基础吗
Jun 02 Python
python删除csv文件的行列
Apr 06 Python
解决Python字典查找报Keyerror的问题
May 26 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
php模板中出现空行解决方法
2011/03/08 PHP
PHP flock 文件锁详细介绍
2012/12/29 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
django 类视图的使用方法详解
2019/07/24 Python
django解决订单并发问题【推荐】
2019/07/31 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
陈胜吴广起义口号
2014/06/20 职场文书
综合素质评价自我评价
2015/03/06 职场文书
研究生导师推荐信
2015/03/25 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android