Потеря проверки, достигающая минимума, затем увеличивается

#python #tensorflow #machine-learning #keras #deep-learning

#питон #тензорный поток #машинное обучение #keras #глубокое обучение

Вопрос:

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

Как можно видеть, примерно в эпоху 60 мои потери при проверке начинают увеличиваться, в то время как точность проверки остается прежней. Похоже, что примерно в это время он начинает перегружаться, но разве потери в тренировках не продолжили бы снижаться почти до нуля, если бы он просто запоминал мои данные о тренировках? Моя модель также кажется очень маленькой, чтобы ее можно было переоборудовать (я пытаюсь классифицировать данные FFT). Есть ли что-то, что я явно делаю неправильно?

Вот моя модель:

 model = Sequential()
model.add(Conv1D(filters = 32, kernel_size = 3, activation = 'relu', input_shape = (size, 1)))
model.add(Dropout(dropout))
model.add(GlobalMaxPooling1D())
model.add(Dropout(dropout))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid')) #Output layer
 

Форма моих тренировочных данных:

x: (1038, 2206)

y: (1038, 1)

Мои параметры:

ЭПОХИ = 300

LR = 1e-3

ОТСЕВ = 0,5

РАЗМЕР ПАКЕТА = 128

Кстати, моя точность проверки составляет около 98%, но когда я тестирую свою модель на тех же данных проверки, я получаю неверный вывод. Я не верю, что мои данные проверки сделаны неправильно, потому что я сделал это точно так же, как и мои тренировочные данные.

Комментарии:

1. каков размер вашего набора данных?

2. @Andrey Извините, я ввел свою форму данных проверки. У меня есть 1038 образцов, содержащих 2206 значений (каждая партия будет (128 2206)).

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

4. Итак, мой единственный вариант — либо расширить мои данные, либо уменьшить мою сеть? @AaronJones

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

Ответ №1:

Ваши графики потерь выглядят классическими по сравнению с подгонкой, что странно, учитывая простоту модели. Одна вещь в модели, которую я бы изменил, это то, что у вас есть

 model.add(Dropout(dropout))
model.add(GlobalMaxPooling1D())
model.add(Dropout(dropout))
 

Глобальный максимальный пул не имеет функции активации, поэтому я не вижу необходимости во втором уровне отсева. На самом деле с коэффициентом отсева .5 я удивлен, что ваша модель тренируется так же хорошо
, как и она. Вы упомянули о создании своего набора проверки, поэтому я предполагаю, что ВЫ выбрали данные проверки. Обычно лучше создавать данные проверки с помощью случайного выбора из полного набора данных, используя что-то вроде функции train_test_split от sklearn. При том количестве отсева, которое у вас есть, имеет смысл, что ваша модель может не достичь 100% точности обучения. Одна вещь, которую я бы попробовал, это использовать регулируемую скорость обучения с использованием Keras callback ReduceLROnPlateau. Настройте его, чтобы отслеживать потерю проверки. Если потеря не может быть уменьшена для количества эпох «терпения», скорость обучения будет уменьшена на «фактор», где фактор — значение меньше 1,0. Документация находится здесь . Ниже приведены мои рекомендации по коду.

 lr_adjust= tf.keras.callbacks.ReduceLROnPlateau(
    monitor="val_loss", factor=0.5, patience=2,verbose=1,mode="auto")
 

Теперь в модели.fit add callbacks=[lr_adjust] Вы не показываете свой код model.compile, но вы можете попробовать использовать другой оптимизатор, чтобы посмотреть, дает ли он эффект. Я рекомендую оптимизатор adam. Я подозреваю, что происходит то, что распределение вероятностей вашего тестового набора значительно отличается от распределения ваших обучающих и проверочных наборов. Учитывая, что вы создали более позднее синтетически, в то время как ваши тестовые данные являются «реальными данными», это делает вероятным случай разнородных распределений вероятностей.

Комментарии:

1. Я выбрал свои данные проверки с явной целью проверить, будет ли это работать с реальными данными. Мои обучающие данные являются «синтетическими» (т. Е. сгенерированными), тогда как данные проверки — это то, что вы получили бы в реальных данных.

2. Мне также нравится этот ответ, поскольку он расширяет информацию о скорости обучения и влиянии уровня отсева на обучение.