我正在训练一个简单的卷积神经网络进行回归,其中的任务是预测图像中盒子的(x,y)位置,例如:
网络的输出有两个节点,一个用于x,一个用于y。网络的其余部分是标准的卷积神经网络。损失是盒子的预测位置和地面真实位置之间的标准均方误差。我正在训练10000张这些图像,并在2000年进行验证。
我的问题是,即使经过大量培训,损失也不会真正减少。观察网络的输出后,我注意到对于两个输出节点,网络都倾向于输出接近零的值。这样,盒子位置的预测始终是图像的中心。预测中存在一些偏差,但始终在零附近。下面显示了损失:
我已经运行了比此图所示更多的时期,并且损失仍然从未减少。有趣的是,损失实际上增加了一点。
因此,似乎网络只是在预测训练数据的平均值,而不是学习合适的数据。关于这可能是什么的任何想法?我使用Adam作为优化器,初始学习率为0.01,并将relus作为激活
如果您对我的某些代码(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)