python - 使用 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)
但是我仍然遇到问题,我无法将它们合并在一起,我已经基于这个新主题提出了一个新问题。
解决方案
我找到了一种方法,我需要对我的 Neurules 层进行排序,拆分它们,然后,每个拆分使用一个 Lambda 层,进行一些处理,如问题的已编辑部分所示:规范化输入,使用backend.any
然后将True
orFalse
返回浮动。
推荐阅读
- regex - 作为搜索 2 个单词的结果的子字符串
- postgresql - 如何在 psql 查询中连接 jsonb 数组中的字符串?
- dataweave - 从 XML 映射到 CSV 循环遍历由下划线分隔的值
- jquery - 添加“返回顶部按钮”
- javascript - 代码更改时服务工作者缓存存储未更新
- java - 如何在JavaFX中的窗口中心制作左对齐的TextFlow
- procedure - 尝试查询字符串有单引号的数据
- spring - 继续调用第 3 方,直到它返回 Hystrix 的预期响应
- pandas - TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“函数”
- sql - 为指定日期选择不同的值