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

Python Keras:如何在输入子集上连接,python,neural-network,keras,theano,Python,Neural Network,Keras,Theano,我正在使用Keras和Theano训练神经网络,其中输入的格式如下: [ [Situation features], [Option 1 features], [Option 2 features], ] 我想训练一个模型来预测每个选项的选择频率,让模型学习如何对每个选项进行评分,以及情况如何使评分差异变得更重要或更不重要 我的模型看起来像: option_inputs = [Input(shape=(NUM_FEATURES,), name='situation_input

我正在使用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)
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)])
当尝试获取概率输出时,我得到错误:

ValueError:
应在输入列表上调用连接层

触发此错误的原因似乎是,
logit\u输出
不是通过所有3个输入功能集合(其中只有2个)迭代生成的

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


一旦对模型进行了训练,我想观察
多样性\神经元
评分\神经元
的输出,以了解如何推断任意数量选项的评分,并了解驱动多样性的因素

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

  • 我在每个选项的开头都包含了情境特征 功能列表
  • 我已经添加了一层,可以过滤的情况 来自选项输入的功能。这是通过手动设置来实现的 不可训练层的重量
  • 然后我可以遍历所有 网络任何路径中的输入
  • 最后的代码如下所示:

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

    尝试:
    logit\u outputs=[Multiply([diversity\u output,scoring\u output])在scoring\u outputs中为scoring\u outputs输入分数]