Я пытаюсь приспособить модель FCN для сегментации городских пейзажей.
Я использую базовый 8-слойный NN. Количество обучающих данных очень велико (до 90 тыс. Изображений). Train-Set - до 5 тыс., А Valid-Set - до 2,5 тыс. Изображений.
Для соответствия моей модели я использую Adam Optimizer с
- скорость обучения 1e-4
- нет затухания скорости обучения (потому что Адам делает это сам)
- BatchSize 1
- Регуляризация 0,001 с категориальная_кросентропия
Для подачи Train-Loop я использую data_generator
. Для понимания в Train я написал несколько лямбда-обратных вызовов, которые вычисляют субплот 3x3 с RGB-GT-Pred и ConfusionMatrix на Valid-Set каждую 10 итераций.
Разрешение данных изображения значительно уменьшено (экономит память).
Во время тренировки моей модели (около 55 эпох -> около 13 часов) будет увеличиваться потеря или уменьшаться в соответствии с моими наборами данных Точность модели Потеря модели .
В архитектуре FCN отсутствует Dropout.
Очень подозрительно, что при вычислении ConfusionMatrix и 3x3spplot появляются «отрицательные» пики. Но интенсивный поиск по коду не находит причины.
Для вычисления матрицы путаницы я использую секунду data_generator
для быстрого прогресса.
Каждый может дать мне подсказку о том, как решить эту проблему?
Весьма подозрительно, что acc на Train-Set уменьшается, а val_acc увеличивается в ту же эпоху ???
Пожалуйста, игнорируйте проблему с переоснащением.
Это мой data_generator:
def data_generator(data, labels, batch_size, input_dims, [...]):
batch_data = np.empty(shape = (batch_size, input_dims[0], input_dims[1], 3))
batch_labels = np.empty(shape = (batch_size, input_dims[0], input_dims[1], num_classes))
if shuffle:
indices = generate_shuffled_indices(len(data), batch_size)
else:
indices = generate_indices(len(data), batch_size)
[...]
While True:
for index, image in enumerate(batch_data_pil):
batch_data[index] = np.asarray(image, dtype = np.uint8)
yield batch_data, batch_labels
Это мой расчет матрицы путаницы:
def visualizeConfMatrix_2(X_val, Y_val, [...]):
rnd_idx = np.random.randint(0, len(Y_val), maxData)
X_val_red = np.ndarray([maxData, imageHeight, imageWidth, 3])
Y_val_red = np.ndarray([maxData, imageHeight, imageWidth, 1])
for i in range(0, len(rnd_idx)):
X_val_red[i] = X_val[i, :, :, :]
Y_val_red[i] = Y_val[i, :, :, :]
softmax_output = model.predict(X_val_red, batch_size = 1)
output = softmax_output.argmax(axis = -1).reshape(-1, 1)
label_images = Y_val_red.squeeze().reshape(-1, 1)
cnf_mat = confusion_matrix(label_images, output)
cnf_mat = cnf_mat.astype('float') / cnf_mat.sum(axis = 1)[:, np.newaxis]
plt.figure(figsize = (35, 25))
[...]