Как избежать переоснащения с помощью keras?

def build_model():
  model = keras.models.Sequential()

  model.add(keras.layers.Flatten(input_shape=[32,32,3]))
  keras.layers.Dropout(rate=0.2)

  model.add(keras.layers.Dense(500, activation="relu"))
  keras.layers.Dropout(rate=0.2)

  model.add(keras.layers.Dense(300, activation="relu"))
  keras.layers.Dropout(rate=0.2)  

  model.add(keras.layers.Dense(10, activation="softmax"))
  model.compile(loss='sparse_categorical_crossentropy', optimizer=keras.optimizers.SGD(), metrics=['accuracy'])
  return model 

keras_clf = keras.wrappers.scikit_learn.KerasClassifier(build_model)

def exponential_decay_fn(epoch): 
  return 0.05 * 0.1**(epoch / 20)

lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)

history = keras_clf.fit(np.array(X_train_new), np.array(y_train_new), epochs=100,
                      validation_data=(np.array(X_validation), np.array(y_validation)),
                      callbacks=[keras.callbacks.EarlyStopping(patience=10),lr_scheduler])

Результат приведенного выше кода

Я использую «выпадение», «раннюю остановку» и «планировщик lr». Результаты кажутся завышенными, я попытался уменьшить n_neurons скрытых слоев до (300, 100). Результаты были неудовлетворительными, точность набора поездов составляла всего около 0,5.

Есть предложения?


person Limin    schedule 30.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как предотвратить переоснащение моей модели?   -  person M.Innat    schedule 30.04.2021
comment
Переобучение — это не проблема программирования, запросы предложений — это просто мнение, которое здесь не по теме.   -  person Dr. Snoopy    schedule 30.04.2021


Ответы (1)


При решении этой проблемы я сначала начинаю с простой модели, такой как несколько плотных слоев с небольшим количеством узлов. Я запускаю модель и смотрю на результирующую точность обучения. Первым шагом в моделировании является получение высокой точности обучения. Вы можете добавить больше слоев и/или больше узлов в каждом слое, пока не получите удовлетворительный уровень точности. Как только это будет достигнуто, начните оценивать потери при проверке. Если по прошествии определенного количества эпох потери при обучении продолжают уменьшаться, но потери при валидации начинают увеличиваться, то вы находитесь в состоянии переподгонки. Теперь слово ТРЕНД импортируется. Я не могу сказать по вашим графикам, действительно ли вы переоснащаетесь, но мне кажется, что потери при проверке достигли своего минимума и, вероятно, колеблются вокруг минимума. Это нормально и НЕ является переоснащением. Если у вас есть настраиваемый обратный вызов lr, который отслеживает потерю проверки, или, в качестве альтернативы, планировщик скорости обучения, снижение обучения может привести к более низким минимальным потерям, но в какой-то момент (при условии, что вы работаете в течение достаточного количества эпох) постоянное снижение скорости обучения не дает вам к более низким минимальным потерям. Модель просто сделала все возможное. Теперь, если вы ДЕЙСТВИТЕЛЬНО переборщили, вы можете принять меры по исправлению положения. Один из них заключается в добавлении большего количества отсева при потенциальном снижении точности обучения. Другой вариант — добавить регуляризацию L1 и/или L2. Документация для этого находится здесь. Если ваша точность обучения высока, но ваша точность проверки низкая, это обычно означает, что вам нужно больше обучающих выборок, поскольку имеющиеся у вас выборки не полностью репрезентативны для распределения вероятностей данных. Чем больше обучающих данных, тем лучше. Я заметил, что у вас 10 классов. Посмотрите на баланс вашего набора данных. Если классы имеют значительно разное количество образцов, это может вызвать проблемы. Существует множество методов для решения этой проблемы, таких как избыточная выборка представленных классов, недостаточная выборка представленных классов или их комбинация. Простой способ — использовать параметр class_weight в model.fit. Посмотрите на свой набор проверки и убедитесь, что он не использует много образцов из недостаточно представленных классов. Всегда лучше выбирать набор проверки случайным образом из общего набора данных.

person Gerry P    schedule 30.04.2021