Точность обучения меньше точности валидации - PullRequest
0 голосов
/ 18 февраля 2020

Я создал модель CNN для классификации текстовых данных. Пожалуйста, помогите мне интерпретировать мой результат и скажите, почему моя точность обучения меньше точности проверки?

У меня в общей сложности 2619 данных, все они являются текстовыми данными. Есть два разных класса. Вот образец моего набора данных.

Dataset Sample

Набор проверки содержит 34 данных. Остальные 2619 данных являются данными обучения.

Я сделал перекрестную проверку RepeatedKfold. Вот мой код.

from sklearn.model_selection import RepeatedKFold 
kf = RepeatedKFold(n_splits=75, n_repeats=1, random_state= 42) 

for train_index, test_index in kf.split(X,Y):
      #print("Train:", train_index, "Validation:",test_index)
      x_train, x_test = X.iloc[train_index], X.iloc[test_index] 
      y_train, y_test = Y.iloc[train_index], Y.iloc[test_index]

Я использовал CNN. Вот моя модель.

model = Sequential()
model.add(Embedding(2900,2 , input_length=1))
model.add(Conv1D(filters=2, kernel_size=3, kernel_regularizer=l2(0.0005 ), bias_regularizer=l2(0.0005 ), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1, kernel_regularizer=l2(0.0005 ), bias_regularizer=l2(0.0005 ), activation='sigmoid'))
model.add(Dropout(0.25))
adam = optimizers.Adam(lr = 0.0005, beta_1 = 0.9, beta_2 = 0.999, epsilon = None, decay = 0.0, amsgrad = False)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
print(model.summary())
history = model.fit(x_train, y_train, epochs=300,validation_data=(x_test, y_test), batch_size=128, shuffle=False)
# Final evaluation of the model
scores = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

А вот и результат.

Epoch 295/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6920 - acc: 0.7528 - val_loss: 0.5839 - val_acc: 0.8235
Epoch 296/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6532 - acc: 0.7617 - val_loss: 0.5836 - val_acc: 0.8235
Epoch 297/300
2585/2585 [==============================] - 0s 27us/step - loss: 1.5328 - acc: 0.7551 - val_loss: 0.5954 - val_acc: 0.8235
Epoch 298/300
2585/2585 [==============================] - 0s 20us/step - loss: 1.6289 - acc: 0.7524 - val_loss: 0.5897 - val_acc: 0.8235
Epoch 299/300
2585/2585 [==============================] - 0s 21us/step - loss: 1.7000 - acc: 0.7582 - val_loss: 0.5854 - val_acc: 0.8235
Epoch 300/300
2585/2585 [==============================] - 0s 25us/step - loss: 1.5475 - acc: 0.7451 - val_loss: 0.5934 - val_acc: 0.8235
Accuracy: 82.35%

Пожалуйста, помогите мне с моей проблемой. Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

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

  • Если нет, регуляризация бесполезна
  • Если она переоснащается, добавляйте регуляризацию понемногу, начните с небольшого спада / снижения веса, а затем увеличьте ее, если она будет продолжать перефитить

Более того, не помещайте Dropout в качестве последнего слоя и не ставьте два слоя Dropout подряд.

0 голосов
/ 18 февраля 2020

Ваша точность тренировки меньше, чем точность проверки, вероятно, из-за использования отсева: он «отключает» некоторые нейроны во время тренировки, чтобы предотвратить переоснащение. Во время проверки отключение отключено, поэтому ваша сеть использует все свои нейроны, что делает (в данном конкретном случае) более точные прогнозы.

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

...