Estou treinando uma rede neural convolucional simples para regressão, onde a tarefa é prever a localização (x, y) de uma caixa em uma imagem, por exemplo:
A saída da rede possui dois nós, um para x e um para y. O restante da rede é uma rede neural convolucional padrão. A perda é um erro quadrático médio padrão entre a posição prevista da caixa e a posição de verdade do solo. Estou treinando em 10000 dessas imagens e validando em 2000.
O problema que estou tendo é que, mesmo após um treinamento significativo, a perda não diminui realmente. Depois de observar a saída da rede, percebo que a rede tende a emitir valores próximos a zero, para os dois nós de saída. Como tal, a previsão da localização da caixa é sempre o centro da imagem. Há algum desvio nas previsões, mas sempre em torno de zero. Abaixo mostra a perda:
Eu executei isso por muito mais épocas do que as mostradas neste gráfico, e a perda ainda nunca diminui. Curiosamente aqui, a perda realmente aumenta em um ponto.
Portanto, parece que a rede está apenas prevendo a média dos dados de treinamento, em vez de aprender um bom ajuste. Alguma idéia de por que isso pode ser? Estou usando Adam como otimizador, com uma taxa de aprendizado inicial de 0,01 e relus como ativações
Se você está interessado em alguns dos meus códigos (Keras), está abaixo:
# 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)