Почему моя точность нейронных сетей систематически уменьшается каждую n-ю эпоху, пока я тренирую модель FCN-8? - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь приспособить модель 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))
    [...]
...