使用 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
然后将 True
或 False
转换回浮动。
我正在使用 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
然后将 True
或 False
转换回浮动。