Низкая точность тестирования при очень хорошей точности обучения и проверки

#python #machine-learning #deep-learning #pytorch #loss-function

Вопрос:

У меня странное представление, которое я не могу объяснить. Во время обучения моей сети и после того, как я закончу с вычислением моей обучающей партии, я также непосредственно перейду к набору проверки, возьму партию и протестирую на ней свою модель. Таким образом, моя проверка не выполняется на этапе, отличном от обучения. Но я просто запускаю пакет обучения, а затем также пакет проверки.

Мой код выглядит примерно так:

 for (data, targets) in tqdm(training_loader):
output = net(data)
log_p_y = log_softmax_fn(output)
loss = loss_fn(log_p_y, targets)

# Do backpropagation

val_data = itertools.cycle(val_loader)
valdata, valtargets = next(val_data)
val_output = net(valdata)
log_p_yval = log_softmax_fn(val_output)
loss_val = loss_fn(log_p_yval, valtargets)
 

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

В чем могут быть причины низкой точности тестирования в конце? Я буду рад, если кто-нибудь сможет объяснить, что я испытываю, и порекомендовать некоторые решения 🙂

Вот картина потерь при обучении и проверке. введите описание изображения здесь

А вот изображение точности обучения и проверки. введите описание изображения здесь

Ответ №1:

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

Непредставительный набор данных проверки означает, что набор данных проверки не предоставляет достаточной информации для оценки способности модели к обобщению. Это может произойти, если в наборе данных проверки слишком мало примеров по сравнению с обучающим набором данных. Убедитесь, что ваши данные для обучения и тестирования выбраны случайным образом и как можно точнее отражают одно и то же распределение и реальное распределение.

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

1. Мой набор данных для проверки имеет размер 512, обучение-2048, а тест-640. Должен ли я сократить набор поездов и, с другой стороны, увеличить наборы данных для тестирования и проверки?

2. Вы перемешиваете свои данные? В каждом наборе данных train/val/test должен быть примерно одинаковый процент каждого класса

3. Будет одинаковый процент от каждого класса, если я выполняю разделение по слоям, однако я этого не делаю, так как в любом случае мой набор данных является сбалансированным набором данных. И все классы представлены справедливо во всех разбиениях наборов данных.

Ответ №2:

Каковы размеры вашего набора данных для обучения, тестирования и валидации?

Похоже, что здесь проблема в чрезмерной подгонке,которую вы можете проверить, используя методы регуляризации, такие как L1, L2 или Отсев.

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

1. Привет, Декодируй, потеря валидации все еще уменьшается, поэтому я думаю, что перенапряжения нет. Размер поезда 2048, тест 640, проверка 512. Более того, я уже применяю снижение веса.

2. @Atila можете ли вы извлечь и поделиться некоторыми тестовыми изображениями, которые дают большие неточности? Это также может произойти из-за неправильного набора данных.