Trenuję prostą sieć neuronową splotową do regresji, której zadaniem jest przewidzenie (x, y) położenia ramki na obrazie, np .:
Dane wyjściowe sieci mają dwa węzły, jeden dla x i jeden dla y. Reszta sieci jest standardową splotową siecią neuronową. Strata jest standardowym średnim kwadratowym błędem między przewidywaną pozycją pudełka a pozycją prawdziwej ziemi. Trenuję na 10000 tych obrazów i sprawdzam poprawność na 2000 roku.
Problem, który mam, polega na tym, że nawet po znacznym treningu strata tak naprawdę nie maleje. Po zaobserwowaniu wyników sieci zauważam, że sieć ma tendencję do generowania wartości bliskich zeru, dla obu węzłów wyjściowych. W związku z tym przewidywanie położenia skrzynki jest zawsze środkiem obrazu. Istnieje pewne odchylenie w przewidywaniach, ale zawsze około zera. Poniżej pokazano stratę:
Uruchomiłem to przez wiele więcej epok, niż pokazano na tym wykresie, a strata wciąż nie maleje. Co ciekawe, strata faktycznie wzrasta w pewnym momencie.
Wygląda więc na to, że sieć po prostu przewiduje średnią danych szkoleniowych, a nie uczy się dobrego dopasowania. Wszelkie pomysły na to, dlaczego tak jest? Używam Adama jako optymalizatora, z początkową szybkością uczenia 0,01, a relus jako aktywacje
Jeśli interesuje Cię mój kod (Keras), poniżej:
# 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)