私は回帰のための単純な畳み込みニューラルネットワークをトレーニングしています。ここでのタスクは、画像内のボックスの(x、y)位置を予測することです。例:
ネットワークの出力には、x用とy用の2つのノードがあります。ネットワークの残りの部分は、標準の畳み込みニューラルネットワークです。損失は、ボックスの予測位置とグラウンドトゥルースの位置との間の標準的な平均二乗誤差です。私はこれらの画像の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)