потеря проверки иногда зашкаливает - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу определить, какое изображение является подлинным, а какое - поддельным. и у меня есть + - 8000 изображений набора данных (объединить). поэтому я обучил модель с LR = 1e-4 BS = 32 EPOCHS = 100. и это результат. иногда моя потеря терпит пики, но после этого она возвращается ниже линии потери поезда. что случилось с моей моделью? Любой ответ будет оценен. заранее спасибо !

training result graph

        model = Sequential()
        inputShape = (height, width, depth)
        chanDim = -1

        # if we are using "channels first", update the input shape
        # and channels dimension
        if K.image_data_format() == "channels_first":
            inputShape = (depth, height, width)
            chanDim = 1

        model.add(Conv2D(16, (3, 3), padding="same",
            input_shape=inputShape))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(Conv2D(16, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))

        # second CONV => RELU => CONV => RELU => POOL layer set
        model.add(Conv2D(32, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(Conv2D(32, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))

        model.add(Flatten())
        model.add(Dense(64))
        model.add(Activation("relu"))
        model.add(BatchNormalization())
        model.add(Dropout(0.5))
        # softmax classifier
        model.add(Dense(classes))
        model.add(Activation("softmax"))

1 Ответ

1 голос
/ 18 апреля 2020

Представьте функцию потерь как поверхность, имеющую столько размеров, сколько имеется свободных параметров в вашей модели. Каждая точка на этой поверхности соответствует набору значений параметров и связана со значением потерь (которое вы пытаетесь минимизировать). Я предполагаю, что вы тренируете эту модель CNN с каким-то алгоритмом градиентного спуска / обратного распространения (все Keras оптимизаторы попадают в эту категорию).

В этой настройке оценки градиента будут неизменно шумными , поскольку ваши обучающие данные не являются полной выборкой всего пробного пространства (не содержат все возможные входные значения, которые в противном случае были бы трудно решаемыми для реальных задач) и могут не иметь распределения, которое точно соответствует распределению набора проверки. Вы рассчитываете оценку градиента на основе неполной конечной выборки (возможно, бесконечной) вселенной . Следовательно, каждый шаг не будет точно направлен на минимизацию функции истинных потерь, но, надеюсь, будет достаточно близок, чтобы модель приблизилась к полезному решению. Даже если бы вы могли каким-то образом вычислить точный градиент, некоторые алгоритмы не будут точно следовать этому направлению (например, те, которые используют импульс ). Кроме того, даже следование точному направлению градиента может привести к увеличению значения потерь из-за перерегулирования (особенно при больших скоростях обучения).

Использование мини-пакетов (размер партии выбирается при вызове model.fit () , в вашем случае 32) также внесет некоторый дополнительный шум, так как градиенты для каждой итерации обновления веса будут рассчитываться не для всех доступных данных тренировки, а только для ограниченного подмножества (партии). Этот дополнительный шум - небольшая цена, которую нужно заплатить, учитывая значительный рост производительности мини-партии, что приводит к более быстрой конвергенции.

Фактически, некоторый шум действительно желателен, так как он может помочь оптимизатору уйти от локальных минимумов, как показано ниже (пример с игрушкой):

Perfect gradient descent vs. Noisy gradient descent

Итак, чтобы ответить на ваш вопрос, вполне нормально иметь шипы, которые вы видите во время обучение, будь то проверка или потеря обучения, из-за причин, указанных выше, и того факта, что наборы проверки и обучения являются конечными и неполными образцами выборочного пространства. Я подозреваю, что показатели проверки могут быть еще более шумными, поскольку набор проверки обычно намного меньше выборки, чем обучающий набор, и не является целью оптимизации (распределение обучения / проверки может не полностью перекрываться).

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