Estoy entrenando una red neuronal convolucional simple para la regresión, donde la tarea es predecir la ubicación (x, y) de un cuadro en una imagen, por ejemplo:
La salida de la red tiene dos nodos, uno para xy otro para y. El resto de la red es una red neuronal convolucional estándar. La pérdida es un error cuadrático medio estándar entre la posición predicha de la caja y la posición de verdad del suelo. Estoy entrenando en 10000 de estas imágenes y validando en 2000.
El problema que tengo es que, incluso después de un entrenamiento significativo, la pérdida realmente no disminuye. Después de observar la salida de la red, noto que la red tiende a generar valores cercanos a cero, para ambos nodos de salida. Como tal, la predicción de la ubicación del cuadro siempre es el centro de la imagen. Hay alguna desviación en las predicciones, pero siempre alrededor de cero. A continuación se muestra la pérdida:
He ejecutado esto durante muchas más épocas de las que se muestran en este gráfico, y la pérdida aún nunca disminuye. Curiosamente aquí, la pérdida en realidad aumenta en un punto.
Entonces, parece que la red solo está prediciendo el promedio de los datos de entrenamiento, en lugar de aprender un buen ajuste. ¿Alguna idea de por qué esto puede ser? Estoy usando a Adam como optimizador, con una tasa de aprendizaje inicial de 0.01, y relus como activaciones
Si está interesado en algo de mi código (Keras), está a continuación:
# 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)