解决Keras 中加入lambda层无法正常载入模型问题

刚刚解决了这个问题,现在记录下来

问题描述

当使用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层无法正常载入模型问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 完美解决keras保存好的model不能成功加载问题

    前两天调用之前用keras(tensorflow做后端)训练好model,却意外发现报错了!!之前从来没有过报错!!错误内容粘贴如下: File "h5py_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (C:\Minonda\conda-bld\h5py_1496885653697\work\h5py_objects.c:2867) File "h5py_objects.pyx", line 5

  • Keras 使用 Lambda层详解

    我就废话不多说了,大家还是直接看代码吧! from tensorflow.python.keras.models import Sequential, Model from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, MaxPool2D, Dropout, Conv2DTranspose, Lambda, Input, Reshape, Add, Multiply from tensorflow.python.ker

  • Keras load_model 导入错误的解决方式

    在使用Keras load_model时,会出现以下报错: ImportError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work. 解决办法: $ pip install pydot $ sudo apt-get install graphviz 补充知识:Keras 保存model到指定文件夹和加载load_model指定文件夹中的文件(踩坑) 我们一般保存模型和加载模

  • 解决Keras 中加入lambda层无法正常载入模型问题

    刚刚解决了这个问题,现在记录下来 问题描述 当使用lambda层加入自定义的函数后,训练没有bug,载入保存模型则显示Nonetype has no attribute 'get' 问题解决方法: 这个问题是由于缺少config信息导致的.lambda层在载入的时候需要一个函数,当使用自定义函数时,模型无法找到这个函数,也就构建不了. m = load_model(path,custom_objects={"reduce_mean":self.reduce_mean,"sli

  • 解决Keras的自定义lambda层去reshape张量时model保存出错问题

    前几天忙着参加一个AI Challenger比赛,一直没有更新博客,忙了将近一个月的时间,也没有取得很好的成绩,不过这这段时间内的确学到了很多,就在决赛结束的前一天晚上,准备复现使用一个新的网络UPerNet的时候出现了一个很匪夷所思,莫名其妙的一个问题.谷歌很久都没有解决,最后在一个日语网站上看到了解决方法. 事后想想,这个问题在后面搭建网络的时候会很常见,但是网上却没有人提出解决办法,So, I think that's very necessary for me to note this.

  • 解决Keras中Embedding层masking与Concatenate层不可调和的问题

    问题描述 我在用Keras的Embedding层做nlp相关的实现时,发现了一个神奇的问题,先上代码: a = Input(shape=[15]) # None*15 b = Input(shape=[30]) # None*30 emb_a = Embedding(10, 5, mask_zero=True)(a) # None*15*5 emb_b = Embedding(20, 5, mask_zero=False)(b) # None*30*5 cat = Concatenate(axi

  • 浅谈keras中的Merge层(实现层的相加、相减、相乘实例)

    [题目]keras中的Merge层(实现层的相加.相减.相乘) 详情请参考: Merge层 一.层相加 keras.layers.Add() 添加输入列表的图层. 该层接收一个相同shape列表张量,并返回它们的和,shape不变. Example import keras input1 = keras.layers.Input(shape=(16,)) x1 = keras.layers.Dense(8, activation='relu')(input1) input2 = keras.la

  • 解决Keras中循环使用K.ctc_decode内存不释放的问题

    如下一段代码,在多次调用了K.ctc_decode时,会发现程序占用的内存会越来越高,执行速度越来越慢. data = generator(...) model = init_model(...) for i in range(NUM): x, y = next(data) _y = model.predict(x) shape = _y.shape input_length = np.ones(shape[0]) * shape[1] ctc_decode = K.ctc_decode(_y,

  • 解决Keras中CNN输入维度报错问题

    想要写分类器对图片进行分类,用到了CNN.然而,在运行程序时,一直报错: ValueError: Negative dimension size caused by subtracting 5 from 1 for 'conv2d_1/convolution' (op: 'Conv2D') with input shapes: [?,1,28,28], [5,5,28,30]. 这部分提到的代码是这样的,这是我的分类器的输入层: model.add(Conv2D(30,(5, 5), input

  • keras中的卷积层&池化层的用法

    卷积层 创建卷积层 首先导入keras中的模块 from keras.layers import Conv2D 卷积层的格式及参数: Conv2D(filters, kernel_size, strides, padding, activation='relu', input_shape) filters: 过滤器数量 kernel_size:指定卷积窗口的高和宽的数字 strides: 卷积stride,如果不指定任何值,则strides设为1 padding: 选项包括'valid'和'sa

  • 在Keras中实现保存和加载权重及模型结构

    1. 保存和加载模型结构 (1)保存为JSON字串 json_string = model.to_json() (2)从JSON字串重构模型 from keras.models import model_from_json model = model_from_json(json_string) (3)保存为YAML字串 yaml_string = model.to_yaml() (4)从YAML字串重构模型 model = model_from_yaml(yaml_string) 2. 保存和

  • 解决keras加入lambda层时shape的问题

    使用keras时,加入keras的lambda层以实现自己定义的操作.但是,发现操作结果的shape信息有问题. 我的后端是theano,使用了sum操作. 比如输入时,shape为(32,28,28),其中32为batch大小. 此时对应的ndim应该等于3. 但是,lambda处理后结果显示_keras_shape为(32,28,28),而ndim却是2. 这导致后边各项操作都会出现问题. 此处sum函数加入参数keepdims=True即可. 此注意keras中的各种层几乎都不用去理会ba

  • 浅谈Keras中shuffle和validation_split的顺序

    模型的fit函数有两个参数,shuffle用于将数据打乱,validation_split用于在没有提供验证集的时候,按一定比例从训练集中取出一部分作为验证集 这里有个陷阱是,程序是先执行validation_split,再执行shuffle的,所以会出现这种情况: 假如你的训练集是有序的,比方说正样本在前负样本在后,又设置了validation_split,那么你的验证集中很可能将全部是负样本 同样的,这个东西不会有任何错误报出来,因为Keras不可能知道你的数据有没有经过shuffle,保险

随机推荐