Keras:如何连接输入子集

时间:2017-05-16 14:44:44

标签: python neural-network keras theano

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

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

我想训练一个模型来预测每个选项的选择频率,让模型学会如何评分每个选项,以及情况如何使分数差异更重要或更不重要。

我的模型看起来像:

option_inputs = [Input(shape=(NUM_FEATURES,), name='situation_input'),
                  Input(shape=(NUM_FEATURES,), name='option_input_0'),
                  Input(shape=(NUM_FEATURES,), name='option_input_1')]
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='softplus', name='diversity_neuron')
scoring_neuron = Dense(1, activation='linear', name='scoring_neuron')

diversity_output = diversity_neuron(situation_input_processing(journey_inputs[0]))
scoring_outputs = [scoring_neuron(option_input_processing(option_input)) for option_input in option_inputs[1:2]]

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

model = Model(inputs=option_inputs, outputs=probability_outputs)

尝试获取probability_outputs时,出现错误:

  

ValueError:Concatenate图层应在输入列表

上调用

似乎触发了错误,因为logit_outputs没有在所有3个输入要素集合中迭代构建,只有2个输入。

知道如何解决这个问题吗?

对模型进行训练后,我想观察diversity_neuronscoring_neuron的输出,以了解如何推断任意数量选项的得分,并了解驱动多样性的因素。

1 个答案:

答案 0 :(得分:1)

我已经做了这些更改来解决问题:

  1. 我在每个选项的开头都包含了情境特征 功能列表
  2. 我添加了一个可以过滤情况的图层 选项输入的功能。这是通过手动设置完成的 不可训练层的重量。
  3. 然后我可以遍历所有 在网络的任何路径中输入
  4. 最终代码如下:

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