Более высокая точность проверки, чем точность обучения с использованием Tensorflow и Keras

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

Мы получаем довольно странные результаты, когда наши данные проверки получают лучшую точность и меньшие потери, чем наши данные обучения. И это соответствует разным размерам скрытых слоев. Это наша модель:

for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]:
    def baseline_model():
        model = Sequential()
        model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001)))
        model.add(Dropout(0.5, seed=seed))
        model.add(Dense(3, kernel_initializer='normal', activation='sigmoid'))

        model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy'])
        return model

    history_logs = LossHistory()
    model = baseline_model()
    history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs])

И это пример точности и потерь: Accuracy with hidden layer of 250 neurons и the loss.

Мы попытались убрать регуляризацию и отсев, которые, как и ожидалось, закончились переоснащением (обучение: ~ 85%). Мы даже пытались резко снизить скорость обучения, с похожими результатами.

Кто-нибудь видел подобные результаты?

Ответ 1

Это происходит, когда вы используете Dropout, поскольку поведение при тренировке и тестировании отличается.

При обучении процент функций устанавливается равным нулю (50% в вашем случае, так как вы используете Dropout(0.5)). При тестировании все функции используются (и масштабируются соответственно). Таким образом, модель во время тестирования более надежна и может привести к более высокой точности тестирования.

Ответ 2

Это на самом деле довольно часто ситуация. Когда в вашем наборе данных не так много различий, вы можете иметь такое поведение. Здесь вы можете найти объяснение, почему это может произойти.

Ответ 3

Вы можете проверить часто задаваемые вопросы Keras и особенно раздел "Почему потери при обучении намного выше, чем потери при тестировании?".

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

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

Помимо вашего конкретного случая, я полагаю, что помимо Dropout разделение набора данных иногда может привести к этой ситуации. Особенно, если разделение набора данных не является случайным (в случае, когда существуют временные или пространственные структуры), набор валидации может принципиально отличаться, т.е. Меньше шума или меньше дисперсии, от последовательности и, следовательно, его легче прогнозировать, что приводит к более высокой точности набора валидации чем на тренировках.

Более того, если набор для проверки очень мал по сравнению с обучением, то случайным образом модель лучше подходит для набора для проверки, чем для обучения.]

Ответ 4

Это указывает на наличие высокого предвзятости в вашем наборе данных. Это недооценивается. Решения для выпуска: -

  • Вероятно, сеть изо всех сил пытается соответствовать данным обучения. Следовательно, попробуйте немного более крупная сеть.

  • Попробуйте использовать другую глубокую нейронную сеть. Я хочу сказать изменение архитектуры немного.

  • Поезд в течение более длительного времени.

  • Попробуйте использовать усовершенствованные алгоритмы оптимизации.