Je forme un réseau neuronal convolutionnel simple pour la régression, où la tâche consiste à prédire l'emplacement (x, y) d'une boîte dans une image, par exemple:
La sortie du réseau a deux nœuds, un pour x et un pour y. Le reste du réseau est un réseau neuronal convolutif standard. La perte est une erreur quadratique moyenne standard entre la position prévue de la boîte et la position de vérité au sol. Je m'entraîne sur 10000 de ces images, et valide sur 2000.
Le problème que j'ai, c'est que même après un entraînement important, la perte ne diminue pas vraiment. Après avoir observé la sortie du réseau, je remarque que le réseau a tendance à produire des valeurs proches de zéro, pour les deux nœuds de sortie. En tant que tel, la prédiction de l'emplacement de la boîte est toujours le centre de l'image. Il y a une certaine déviation dans les prédictions, mais toujours autour de zéro. Ci-dessous montre la perte:
J'ai exécuté cela pendant beaucoup plus d'époques que ce qui est montré dans ce graphique, et la perte ne diminue toujours jamais. Fait intéressant ici, la perte augmente en fait à un moment donné.
Il semble donc que le réseau prédit simplement la moyenne des données de formation, plutôt que d'apprendre un bon ajustement. Des idées sur pourquoi cela peut être? J'utilise Adam comme optimiseur, avec un taux d'apprentissage initial de 0,01, et relus comme activations
Si vous êtes intéressé par certains de mes codes (Keras), c'est ci-dessous:
# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)