我正在使用一些自定义图层,但是它们的形状存在问题,当我单独使用它时,它可以工作,但是当我加载模型以在另一个图层中使用时,它就不再起作用了。这是我的图层定义:
def signumTransform(x):
"""
SIGNUM function
if positive 1
if negative -1
"""
import keras.backend
return keras.backend.sign(x)
def logical_or_layer(x):
"""Processing an OR operation"""
import keras.backend
#normalized to 0,1
aux_array = keras.backend.sign(x)
aux_array = keras.backend.relu(aux_array)
# OR operation
aux_array = keras.backend.any(aux_array)
# casting back the True/False to 1,0
aux_array = keras.backend.cast(aux_array, dtype='float32')
return aux_array
#this is the input tensor
inputs = Input(shape=(inputSize,), name='input')
#this is the Neurule layer
x = Dense(neurulesQt, activation='softsign', name='neurules')(inputs)
#after each neuron layer, the outputs need to be put into SIGNUM (-1 or 1)
x = Lambda(signumTransform, output_shape=lambda x:x, name='signumAfterNeurules')(x)
#separating into 2 (2 possible outputs)
layer_split0 = Lambda( lambda x: x[:, :11], output_shape=[11], name='layer_split0')(x)
layer_split1 = Lambda( lambda x: x[:, 11:20], output_shape=[9], name='layer_split1')(x)
#this is the OR layer
y_0 = Lambda(logical_or_layer, output_shape=[1], name='or0')(layer_split0)
y_1 = Lambda(logical_or_layer, output_shape=[1], name='or1')(layer_split1)
y = Lambda(lambda x: K.stack([x[0], x[1]]),output_shape=[2], name="output")([y_0, y_1])
直到layer_split
一切正常为止,但是在我的y_0
和y_1
中,我需要对keras.backend.any()
进行或运算,作为回报,我收到一个布尔值,因此我用keras.backend.cast()
丢掉了。
如果我使用这里描述的模型,它可以工作...可以编译,可以验证等等,但是如果我尝试保存并加载它,它只会丢失一个维度,即批处理维度( None
)。摘要中的输出显示为(None, 2)
,但是当用作图层并与另一个图层连接时,它显示(2,)
并引发错误:
InvalidArgumentError: Shape must be rank 2 but is rank 1 for 'merging_layer_10/concat' (op: 'ConcatV2') with input shapes: [?,16], [2], [].
我应该如何在logical_or_layer
函数中正确地投射它?我应该在Lambda层中更改output_shape
吗?