J'entraîne un modèle de classification textuelle des sentiments avec plusieurs couches de sortie dans l'API fonctionnelle de Keras (en utilisant un backend TensorFlow). Le modèle prend en entrée un tableau Numpy de valeurs hachées produit par la fonction hashing_trick () de l'API de pré-traitement Keras, et utilise une list de tableaux Numpy d'étiquettes binaires un-hot comme cibles, conformément à Spécifications Keras pour la formation d'un modèle avec plusieurs sorties (voir la documentation de fit () ici: https://keras.io/models/model/ ).
Voici le modèle, sans la plupart des étapes de prétraitement:
textual_features = hashing_utility(filtered_words) # Numpy array of hashed values(training data)
label_list = [] # Will eventually contain a list of Numpy arrays of binary one-hot labels
for index in range(one_hot_labels.shape[0]):
label_list.append(one_hot_labels[index])
weighted_loss_value = (1/(len(filtered_words))) # Equal weight on each of the output layers' losses
weighted_loss_values = []
for index in range (one_hot_labels.shape[0]):
weighted_loss_values.append(weighted_loss_value)
text_input = Input(shape = (1,))
intermediate_layer = Dense(64, activation = 'relu')(text_input)
hidden_bottleneck_layer = Dense(32, activation = 'relu')(intermediate_layer)
keras.regularizers.l2(0.1)
output_layers = []
for index in range(len(filtered_words)):
output_layers.append(Dense(2, activation = 'sigmoid')(hidden_bottleneck_layer))
model = Model(inputs = text_input, outputs = output_layers)
model.compile(optimizer = 'RMSprop', loss = 'binary_crossentropy', metrics = ['accuracy'], loss_weights = weighted_loss_values)
model.fit(textual_features, label_list, epochs = 50)
Voici l'essentiel de la formation sur la trace d'erreur produite par ce modèle:
ValueError: Erreur lors de la vérification de la cible: attendue que dense_3 a la forme (2,) mais a obtenu le tableau avec la forme (1,)
Votre numpy arrays
(pour les entrées et les sorties) doit contenir une dimension de lot. Si vos étiquettes sont actuellement de forme (2,)
, vous pouvez les remodeler pour inclure une dimension de lot comme suit:
label_array = label_array.reshape(1, -1)