Я тренирую простую сверточную нейронную сеть для регрессии, где задача состоит в том, чтобы предсказать (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)