2017-05-16 1 views
3

Je suis la formation d'un réseau de neurones en utilisant Keras et Théano, où les entrées ont un format semblable:Keras: Comment concaténer sur un sous-ensemble d'entrées

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

Je veux former un modèle pour prédire la fréquence de chaque l'option sera choisie, en faisant en sorte que le modèle apprenne à noter chaque option, et comment la situation rend les différences de score plus ou moins importantes.

Mon modèle ressemble:

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) 

Lorsque vous essayez d'obtenir probability_outputs, je reçois l'erreur:

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

L'erreur semble être déclenchée parce que logit_outputs n'est pas construit itérer toutes les 3 entrées collections de fonctionnalités, seulement sur 2 d'entre eux.

Une idée de comment contourner ce problème? Une fois le modèle formé, je souhaite observer les sorties diversity_neuron et scoring_neuron pour apprendre comment extrapoler la notation pour un nombre arbitraire d'options et comprendre ce qui motive la diversité.

+0

Essayez: 'logit_outputs = [Multiplier ([diversity_output, scoring_output]) pour scoring_output dans scoring_outputs] ' –

Répondre

1

J'ai fait ces changements pour contourner le problème:

  1. Je compris la situation comporte au début de chaque option liste des fonctionnalités
  2. J'ai ajouté une couche qui peut filtrer la situation caractéristiques des entrées d'option. Ceci est effectué en définissant manuellement les poids d'une couche non entraînable.
  3. Je peux ensuite parcourir tous les entrées dans un chemin du réseau

Le code final ressemble à:

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