Я треную просту конвертну нейронну мережу для регресії, де завдання передбачити (x, y) розташування коробки на зображенні, наприклад:
На виході мережі є два вузли, один для x і один для y. Решта мережі - це стандартна звивиста нейронна мережа. Втрата - це стандартна середня квадратична помилка між передбачуваною позицією коробки та основним положенням істини. Я тренуюсь на 10000 таких зображень, а валідую 2000 року.
Проблема, яку я маю, полягає в тому, що навіть після значних тренувань втрати насправді не зменшуються. Після спостереження за виходом мережі я помічаю, що мережа має тенденцію до виведення значень, близьких до нуля, для обох вихідних вузлів. Таким чином, передбачення розташування поля завжди в центрі зображення. У прогнозах є деякі відхилення, але завжди навколо нуля. Нижче показані збитки:
Я запускав це ще багато епох, ніж показано на цьому графіку, і втрата все ще ніколи не зменшується. Цікаво, що тут втрати фактично збільшуються в один момент.
Таким чином, здається, що мережа просто прогнозує середнє значення навчальних даних, а не навчається добре. Будь-які ідеї, чому це може бути? Я використовую Адама в якості оптимізатора, з початковою швидкістю навчання 0,01, а реліз - як активація
Якщо вас цікавить якийсь мій код (Keras), це нижче:
# 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)