Sto addestrando una semplice rete neurale convoluzionale per la regressione, in cui il compito è prevedere la posizione (x, y) di una scatola in un'immagine, ad esempio:
L'output della rete ha due nodi, uno per x e uno per y. Il resto della rete è una rete neurale convoluzionale standard. La perdita è un errore quadrato medio standard tra la posizione prevista della scatola e la posizione di verità sul terreno. Mi sto allenando su 10000 di queste immagini e sto convalidando il 2000.
Il problema che sto riscontrando è che anche dopo un allenamento significativo, la perdita non diminuisce davvero. Dopo aver osservato l'output della rete, noto che la rete tende a produrre valori vicini allo zero, per entrambi i nodi di output. Pertanto, la previsione della posizione del riquadro è sempre al centro dell'immagine. C'è qualche deviazione nelle previsioni, ma sempre intorno allo zero. Di seguito mostra la perdita:
Ho eseguito questo per molte più epoche di quelle mostrate in questo grafico e la perdita non diminuisce mai. È interessante notare che qui la perdita aumenta effettivamente ad un certo punto.
Quindi, sembra che la rete stia solo prevedendo la media dei dati di allenamento, piuttosto che apprendere in modo adeguato. Qualche idea sul perché questo potrebbe essere? Sto usando Adam come ottimizzatore, con un tasso di apprendimento iniziale di 0,01, e relus come attivazioni
Se sei interessato ad alcuni dei miei codici (Keras), è di seguito:
# 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)