Почему моя модель Keras учится распознавать фон?

9

Я пытаюсь обучить эту реализацию Keras Deeplabv3 + на Pascal VOC2012, используя предварительно обученную модель (которая также обучалась на этом наборе данных).

Я получил странные результаты с точностью, быстро сходящейся к 1,0:

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

Тестирование модели также дает 100% точность.

Я решил построить прогнозы на одном и том же наборе случайных изображений до и после тренировки, и обнаружил, что модели рекомендуется говорить, что все является просто фоном (это 1-й класс в Паскале VOC2012).

введите описание изображения здесь

введите описание изображения здесь

Я довольно плохо знаком с глубоким изучением, и мне понадобится помощь, чтобы выяснить, откуда это может прийти.

Я подумал, что, возможно, это может быть моя функция потерь, которую я определил как:

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

Я немного не уверен в правильности формы моих тензоров. Я использую API набора данных TF для загрузки .tfrecordфайлов, и мой тензор аннотаций имеет форму (batch_size, height, width). Будет (batch_size, height, width, 21)ли то, что нужно? Другие ошибки внутри модели возникают, когда я пытаюсь разделить изображение аннотации на тензор, содержащий 21 изображение (по одному для каждого класса):

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

Спасибо за помощь!

Matt
источник
5
Здесь достаточно рассмотреть несколько вопросов, я почти не знаю, с чего начать. (1) Используете ли вы размер выборки 5 для обучения ??? (2) Какую предварительную обработку вы выполняете с изображениями? У меня есть ощущение, что ответ лежит в этом и (3) вам нужно будет предоставить гораздо больше информации о вашей модели. Сколько у вас маркированных образцов? Сколько возможных категорий? У вас есть сбалансированный тренировочный набор? (4) ваша точность 1,0 практически ничего не значит, потому что ваша потеря очень высока и увеличивается. Ваша потеря должна уменьшиться, поскольку ваша точность улучшается.
I_Play_With_Data
(1) Я использую партии размером 12, но я думаю, что это не имеет значения. Я показал только 3 маленькие эпохи всего по 5 шагов здесь, потому что именно так быстро они сходятся. (2) Моя предварительная обработка состоит из некоторого увеличения и масштабирования (возможно, обрезки) до 512x512 для каждого изображения и связанной с ним аннотации. (3) в Pascal VOC 2012 имеется около 11 500 помеченных изображений. Поскольку большинство документов достигают 85% + mIOU в этом наборе данных, я бы предположил, что он сбалансирован. В этом наборе данных есть 20 различных категорий плюс одна для фона или «неоднозначная», всего 21
Мэтт
Я любопытствую. Вы нашли причину результатов вашей модели?
Mark.F
3
Если бы вы поделились своим кодом, можно было бы найти ошибку.
Дмитрий Прилипко
1
Тот факт, что предварительно обученная модель находит способ получить 100% точность в течение 3 эпох, используя те же данные, которые использовались первоначально, заставляет меня думать, что ошибка в том, что ваши обучающие метки неверны, возможно, все они установлены на метку, которая соответствует в фоновом режиме. В любом случае, посмотрите на эту тему , где люди обсуждают свои проблемы и решения для тонкой настройки модели. Модель не обязательно нарушена, и ошибка в BatchNorm в Tensorflow может быть устранена.
n1k31t4

Ответы:

1

Ваша модель переоснащается. Каждая эпоха имеет только 5 изображений. Модель «запоминает» ответ для каждого изображения.

Чтобы минимизировать вероятность переоснащения, увеличьте количество изображений. Для каждой категории объектов должно быть несколько тысяч примеров изображений.

Брайан Спиеринг
источник