Я сталкивался с несколькими постами ( здесь и здесь ), в которых упоминается, что выполнение перекрестной проверки (CV) в k-кратном порядке с нейронными сетями (NN) аналогично CV с алгоритмы машинного обучения (SVM, случайный лес и др. c.). Основная идея c состоит в том, чтобы разделить базу данных на k равных разбиений, обучить модель на k-1
разбиениях и проверить производительность на k
-м разбиении, выполнить итерацию для всех разбиений.
Но, рассмотрим проблема классификации, где мне нужно получить матрицу CV путаницы.
Очевидно, что при обучении NN мы должны наблюдать потерю проверки и убедиться, что сеть не перегружена. Поэтому обучение модели для фиксированного числа эпох на каждом этапе CV без учета потери проверки не рекомендуется, несмотря на то, что кодировано в machinelearningmastery .
Если мы используем k
th Разделив данные проверки, как показано в следующем фрагменте, эпоха с наименьшими потерями проверки будет сохранена как лучшая модель.
for train, test in kfold.split(X, Y):
model = build_model()
opt = Adam(lr=0.00005)
model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics=['accuracy'])
filepath='saved_models/best_model.h5'
checkpointer = ModelCheckpoint(filepath=filepath, verbose=1, save_best_only=True)
model.fit([X[train], Y[train],
validation_data=([X[test]],Y[test]), epochs=50, batch_size=40, callbacks=[checkpointer])
Теперь,
Насколько рационально использовать сохраненную наилучшую модель для оценки тех же данных проверки следующим образом?
best_model = load_model('saved_models/best_model.h5')
scores = best_model.evaluate([X[test], Y[test], verbose=0)
accuracy = scores[1]*100 # classification accuracy of kth split
Если у нас есть наборы для обучения, проверки и тестирования отдельно, как описано в этом SO ответе. Но это противоречит определению k-кратного CV, потому что мы не тренируемся на k-1
сплитах.
Или мы должны тренироваться для фиксированного числа эпох без рассмотрения проверки, и проверить производительность на тестовом наборе, как в machinelearningmastery ?