Ich trainiere ein einfaches Faltungs-Neuronales Netzwerk für die Regression, wobei die Aufgabe darin besteht, die (x, y) Position einer Box in einem Bild vorherzusagen, z.
Die Ausgabe des Netzwerks hat zwei Knoten, einen für x und einen für y. Der Rest des Netzwerks ist ein Standard-Faltungsnetzwerk. Der Verlust ist ein normaler quadratischer Standardfehler zwischen der vorhergesagten Position der Box und der Grundwahrheitsposition. Ich trainiere auf 10000 dieser Bilder und validiere auf 2000.
Das Problem, das ich habe, ist, dass der Verlust selbst nach einem intensiven Training nicht wirklich abnimmt. Nachdem ich die Ausgabe des Netzwerks beobachtet habe, stelle ich fest, dass das Netzwerk dazu neigt, für beide Ausgabeknoten Werte nahe Null auszugeben. Daher ist die Vorhersage des Standorts der Box immer die Mitte des Bildes. Es gibt einige Abweichungen in den Vorhersagen, aber immer um Null. Unten zeigt der Verlust:
Ich habe dies für viel mehr Epochen ausgeführt, als in dieser Grafik gezeigt, und der Verlust nimmt immer noch nie ab. Interessanterweise steigt hier der Verlust tatsächlich an einem Punkt.
Es scheint also, dass das Netzwerk nur den Durchschnitt der Trainingsdaten vorhersagt, anstatt eine gute Passform zu lernen. Irgendwelche Ideen, warum das so sein könnte? Ich benutze Adam als Optimierer mit einer anfänglichen Lernrate von 0,01 und Relus als Aktivierungen
Wenn Sie an einem Teil meines Codes (Keras) interessiert sind, finden Sie ihn unten:
# 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)