如何在keras中正确投射布尔层?

时间:2018-11-22 12:32:42

标签: python tensorflow lambda casting keras

我正在使用一些自定义图层,但是它们的形状存在问题,当我单独使用它时,它可以工作,但是当我加载模型以在另一个图层中使用时,它就不再起作用了。这是我的图层定义:

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_0y_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吗?

0 个答案:

没有答案