加载时lambda问题的Keras激活

加载时lambda问题的Keras激活,keras,Keras,我试图使用参数“axis”执行softmax,我找到的唯一方法是通过函数lambda。这是我的代码,包含softmax的lambda激活层: from keras.models import Model from keras.layers import Input,Dense,Reshape,Activation from keras.layers.merge import Multiply,Concatenate from keras.layers.core import Lambda fro

我试图使用参数“axis”执行softmax,我找到的唯一方法是通过函数lambda。这是我的代码,包含softmax的lambda激活层:

from keras.models import Model
from keras.layers import Input,Dense,Reshape,Activation
from keras.layers.merge import Multiply,Concatenate
from keras.layers.core import Lambda
from keras.activations import softmax
from keras import backend as K
import numpy as np

N = 6
M = 6
T = 1000
H = 5

# Toy input creation
input = np.concatenate([np.random.normal(np.random.rand(1)[0],1.,(1,N,M)) for t in range(T)],axis=0)
input2 = np.random.rand(T,N,M)
input3 = np.random.rand(T,N,M)
input4 = np.random.rand(T,N,M)
a = np.mean(np.reshape(input,(T,N*M)),axis=1)
a = np.maximum(0.,np.minimum(a,0.9999))
a = np.floor(a*3).astype(int)
a = np.stack([a for i in range(M)],axis=1)
a = np.stack([a for i in range(N)],axis=2)
mix1 = np.concatenate((input2[:,:2,:],input3[:,2:4,:],input4[:,4:,:]),axis=1)
mix2 = np.concatenate((input3[:,:2,:],input4[:,2:4,:],input2[:,4:,:]),axis=1)
mix3 = np.concatenate((input4[:,:2,:],input2[:,2:4,:],input3[:,4:,:]),axis=1)
output = np.choose(a,[mix1,mix2,mix3])
images = np.stack((input2,input3,input4),axis=3)

# models definition
# one general model to be trained and
# one mask model to be used later for testing
input_layer = Input(shape=(N,M))
images_input = Input(shape=(N,M,3))
x = Reshape((N*M,))(input_layer)
x = Dense(H, kernel_initializer='uniform', activation='relu')(x)
x = Dense(N*N*3, kernel_initializer='uniform')(x)
x = Reshape((N,N,3))(x)
masks = Activation(activation=lambda y:softmax(y,axis=3))(x)
output_layer = Multiply()([masks,images_input])
output_layer = Lambda(lambda x:K.sum(x,axis=3))(output_layer)
model = Model(inputs=[input_layer,images_input],outputs=output_layer)
mask_model = Model(inputs=input_layer,outputs=masks)

# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')

# Fit the model
history = model.fit([input,images], output, epochs=200, batch_size=50)

#save models
model.save('test.h5')
mask_model.save('mask_test.h5')
它在培训期间工作正常,但当我尝试加载文件时,失败:

from keras.models import load_model
mask_model = load_model('mask_test.h5')
我得到一个错误:

回溯(最近一次呼叫最后一次):
文件“/home/kresch/general2.py”,第3行,在
屏蔽模型=负载模型(“屏蔽测试.h5”)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/models.py”,第246行,加载模式
模型=来自配置的模型(模型配置,自定义对象=自定义对象)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site-packages/keras/models.py”,第314行,模型配置中的
返回层\模块。反序列化(配置,自定义\对象=自定义\对象)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/layers/_init__.py”,第54行,反序列化
可打印\u模块\u name='layer')
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/utils/generic_utils.py”,第140行,反序列化_keras_对象
列表(自定义对象.项())
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/engine/topology.py”,第2450行,在from_config中
处理层(层数据)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/engine/topology.py”,第2419行,进程层
自定义对象=自定义对象)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/layers/_init__.py”,第54行,反序列化
可打印\u模块\u name='layer')
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/utils/generic_utils.py”,反序列化_keras_对象中的第142行
从_config(config['config'])返回cls
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/engine/topology.py”,第1242行,在from_config中
返回cls(**配置)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/layers/core.py”,第287行,在__
self.activation=activations.get(激活)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/activations.py”,get中第81行
返回反序列化(标识符)
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/activations.py”,第73行,反序列化
可打印的\u模块\u名称='激活功能')
文件“/opt/anaconda3/envs/tensorflow/lib/python3.5/site packages/keras/utils/generic_utils.py”,第160行,反序列化_keras_对象
“:”+函数(名称)
ValueError:未知的激活函数:
进程已完成,退出代码为1
同样的情况也发生在:

model = load_model('test.h5')

我是否使用了lambda函数错误?或者(更好)有没有办法避免使用lambda函数?

尝试自定义激活层,然后加载模型

load_model('test.h5',custom_objects=activation_layer)

请为您编写的代码添加更多上下文(可能是完整代码)。此外,您还可以编辑您的问题并添加您提到的堆栈跟踪。