이미지에서 상자의 (x, y) 위치를 예측하는 작업 인 회귀를위한 간단한 회선 신경 네트워크를 훈련하고 있습니다.
네트워크의 출력에는 x와 y에 각각 하나씩 두 개의 노드가 있습니다. 나머지 네트워크는 표준 컨볼 루션 신경망입니다. 손실은 상자의 예측 위치와 실제 위치 사이의 표준 평균 제곱 오차입니다. 이 이미지 중 10000 개를 교육하고 2000 년에 유효성을 검사하고 있습니다.
내가 겪고있는 문제는 상당한 훈련 후에도 손실이 실제로 감소하지 않는다는 것입니다. 네트워크의 출력을 관찰 한 후 두 출력 노드 모두에서 네트워크가 0에 가까운 값을 출력하는 경향이 있음을 알았습니다. 따라서 상자 위치의 예측은 항상 이미지의 중심입니다. 예측에는 약간의 편차가 있지만 항상 0 정도입니다. 아래는 손실을 보여줍니다.
나는이 그래프에 표시된 것보다 더 많은 시대를 위해 이것을 실행했으며 손실은 여전히 감소하지 않습니다. 흥미롭게도 여기서 손실은 실제로 한 지점에서 증가합니다.
따라서 네트워크는 적절한 학습을 배우기보다는 훈련 데이터의 평균을 예측하는 것 같습니다. 왜 그런지에 대한 아이디어가 있습니까? 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)