使用 Keras 的 OR-Lambda-Layer 操作

OR-Lambda-Layer operation with Keras

我正在使用 Keras 创建一个不同的项目,它是基于预定义知识(描述为 IF-THEN 规则)的神经网络的开发,称为 Neurules。我创建了一个 Python 模块来从给定的 IF-THEN 逻辑表达式中训练我的每个 Neurons/Neurules,毕竟我需要使用 Keras 将其创建为网络并重用该模型。

我已经用一个小例子进行了测试并且它有效,所有内容都是手动添加的,包括权重和偏差。现在我已经更新了我的脚本,它为我提供了一个 JSON,其中包含要添加到 Keras 的所有权重(工作到现在)。

我的问题来了,我有一个第一层有 20 个神经元(从 IF-THEN 创建的神经元)但我只有 2 个可能的输出,一些 Neurules/Neurons 给我 output[0] 一些其中 output[1],我想在中间添加一个层来表示 OR 连接。

例如:

第 1 层: 神经元 1、神经元 2、神经元 3

Output[0] 由以下组成:NEURON1 or NEURON2

Output[1] 由以下组成:NEURON2 or NEURON3

我在我的第一个小例子中所做的是:我用我预先开发的 python 模块创建并训练了一个 OR 神经元,然后用它添加了第二层。然后,我将条目手动连接到 ORs 神经元(将权重置于正确的连接中,并在它们不应影响 OR 时将其置为 0)。现在我有了更大的东西,我正在自动化整个过程。

简单网络的可视化: Buffer 只是转发值,OR 正在对输入进行 OR 运算。

Visualization of the layers

我如何在 Keras 中创建一个 Lambda 层来获取一些输出、处理逻辑或并连接到输出之一?

我找到了后端函数: tf.keras.backend.any,但是我到现在还不能用,请问怎么用呢?可能在 Lambda 层中,但如何?

我需要连接,例如

(NEURON1 or NEURON4 or NEURON5) -> output[0]

(NEURON3 or NEURON6 or NEURON7) -> output[1]

在我的系统中-1代表False,1代表True。 到现在为止,我已经保存了哪些神经元正在使用数组中的 2 个输出中的每一个 JSON,例如:

"secondLayerDescription": [
    [0, 1, 4, 5, 6, 8, 12, 13, 14, 16, 18], 
    [2, 3, 7, 9, 10, 11, 15, 17, 19]
]

希望有人能帮助我:)

编辑:提供更新,几天后我找到了解决方案,我将我的层分成 2 层并使用 lambda 层操作它们如下:

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,))

#this is the Neurule layer
x = Dense(neurulesQt, activation='softsign')(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[:, :end_output0], output_shape=(11, ), name='layer_split0')(x)
layer_split1 = Lambda( lambda x: x[:, start_output1:end_output1], 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)

但是我仍然有问题,我无法将它们合并在一起,我已经根据这个新主题提出了一个新问题。

我找到了一种方法,我需要对我的 Neurules 层进行排序,拆分它们,然后对每个拆分使用一个 Lambda 层,进行一些处理,如问题的已编辑部分所示:规范化输入,使用 backend.any 然后将 TrueFalse 转换回浮动。