首页 > 解决方案 > 使用 Keras 进行 OR-Lambda-Layer 操作

问题描述

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

我已经用一个小例子进行了测试,它工作正常,一切都是手动添加的,权重和偏差。现在我已经更新了我的脚本,它给了我一个 JSON,其中包含要添加到 Keras 的所有权重(工作到现在)。

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

例如:

第 1 层:NEURON1、NEURON2、NEURON3

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

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

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

简单网络的可视化:缓冲区只是转发值,OR 正在对输入进行 OR 操作。

图层的可视化

如何在 Keras 中创建一个 Lambda 层,它接受一些输出、处理逻辑 OR 并连接到其中一个输出?

我找到了Backend功能: tf.keras.backend.any,但是我到现在都无法使用它,我应该如何使用它?可能在 Lambda 层中,但是如何?

例如,我需要连接

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

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

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

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

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

标签: pythontensorflowkeraskeras-layer

解决方案


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


推荐阅读