Keras:如何在输入子集上连接

2024-04-23 18:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Keras和Theano训练一个神经网络,输入格式如下:

[
   [Situation features],
   [Option 1 features],
   [Option 2 features],
]

如何在每一个模型中选择一个比较重要的选项或是如何预测每一个选项,我都想知道如何在不同的情况下进行评分。在

我的模型看起来像:

^{pr2}$

当尝试获取probability_outputs时,我得到错误:

ValueError: Concatenate layer should be called on a list of inputs

这个错误似乎是因为logit_outputs不是遍历所有3个输入特性集合而构建的,只有其中2个是其中的一个。在

你知道怎么解决这个问题吗?在

一旦模型得到训练,我想观察diversity_neuron和{}的输出,以学习如何推断任意数量选项的得分,并了解是什么驱动了多样性。在


Tags: 模型格式选项错误情况神经网络theano评分
1条回答
网友
1楼 · 发布于 2024-04-23 18:24:46

为了解决这个问题,我做了以下更改:

  1. 我在每个选项的开头都包含了情景特征 功能列表
  2. 我添加了一个可以过滤情况的层 选项输入的功能。这是通过手动设置实现的 不可训练层的重量。在
  3. 然后我可以遍历所有 网络任何路径的输入

最终代码如下:

option_inputs = [Input(shape=(NUM_FEATURES,), name='option_input_0'),
                  Input(shape=(NUM_FEATURES,), name='option_input_1')]
situation_input_filtering = Dense(NUM_SITUATION_FEATURES, activation='linear', name='situation_input_filtering')
situation_input_filtering.trainable = False
situation_input_processing = Dense(5, activation='relu', name='situation_input_processing')
option_input_processing = Dense(20, activation='relu', name='option_input_processing')
diversity_neuron = Dense(1, activation='sigmoid', name='diversity_neuron')
scoring_neuron = Dense(1, activation='linear', name='scoring_neuron')

diversity_outputs = [diversity_neuron(situation_input_processing(situation_input_filtering(option_input))) for
                     option_input in option_inputs]
scoring_outputs = [scoring_neuron(option_input_processing(option_input)) for option_input in option_inputs]

logit_outputs = [Multiply()([diversity_output, scoring_output]) for diversity_output, scoring_output in
                 zip(diversity_outputs, scoring_outputs)]
combined = keras.layers.concatenate(logit_outputs, axis=-1)
probability_outputs = Activation('softmax')(combined)

model = Model(inputs=option_inputs, outputs=probability_outputs)
model.compile(optimizer='adadelta', loss='categorical_crossentropy', metrics=['accuracy'])

mask_weights = np.zeros([NUM_FEATURES, NUM_SITUATION_FEATURES])
for i in xrange(NUM_situation_FEATURES):
    mask_weights[i, i] = 1.0

for layer in model.layers:
    if layer.name == 'situation_input_filtering':
        layer.set_weights([mask_weights, np.zeros(NUM_SITUATION_FEATURES)])

相关问题 更多 >