Для чего используются данные проверки в последовательной модели Keras?

У меня простой вопрос: какие данные проверки передаются в model.fit в последовательной модели, для которой используется?

И влияет ли это на то, как обучается модель (обычно используется набор проверки, например, для выбора гиперпараметров в модели, но я думаю, что здесь этого не происходит)?

Я говорю о наборе проверки, который можно передать следующим образом:

# Create model
model = Sequential()
# Add layers
model.add(...)

# Train model (use 10% of training set as validation set)
history = model.fit(X_train, Y_train, validation_split=0.1)

# Train model (use validation data as validation set)
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test))

Я немного исследовал и увидел, что keras.models.Sequential.fit вызывает keras.models.training.fit, который создает такие переменные, как val_acc и val_loss (к которым можно получить доступ из обратных вызовов). keras.models.training.fit также вызывает keras.models.training._fit_loop, который добавляет данные проверки к callbacks.validation_data, а также вызывает keras.models.training._test_loop, который циклически обрабатывает данные проверки в пакетах на self.test_function модели. Результат этой функции используется для заполнения значений журналов, которые являются значениями, доступными из обратных вызовов.

Увидев все это, я чувствую, что набор проверки, переданный в model.fit, не используется для проверки чего-либо во время обучения, и его единственное использование - получить обратную связь о том, как обученная модель будет работать в каждую эпоху для полностью независимого набора. Следовательно, было бы нормально использовать один и тот же набор для проверки и тестирования, не так ли?

Может ли кто-нибудь подтвердить, имеет ли проверка, установленная в model.fit, какая-либо другая цель, кроме чтения из обратных вызовов?


person danidc    schedule 19.09.2017    source источник


Ответы (4)


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

Идея состоит в том, что вы тренируетесь на своих обучающих данных и настраиваете свою модель с результатами метрик (точность, потери и т. Д.), Которые вы получаете из своего набора для проверки.

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

Именно по этой причине вы оцениваете окончательную оценку своей модели только на основе данных, которые ни ваша модель, ни вы сами не использовали - и это третий блок данных, ваш набор тестов.

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

person petezurich    schedule 19.09.2017
comment
Хорошо, я уже понял это, но все именно так, как вы говорите. По сути, поскольку мы можем использовать точность проверки и потери, чтобы узнать что-то о модели, нам нужен другой набор тестов для проверки того, что мы узнали. Например, если у меня есть 3 модели, я обучаю их одним и тем же обучающим данным, я получаю точность проверки для каждой из них, которую использую, чтобы выбрать лучшую модель, а затем я тестирую выбранную модель в другом наборе тестов, поэтому я можно получить точность модели. Если бы я использовал для этого набор проверки, результат был бы необъективным. - person danidc; 02.02.2018
comment
каков же обходной путь проверки, когда мы хотим использовать train_on_batch () для большого набора данных в keras? - person Guido Mocha; 20.01.2019
comment
при использовании model.fit (X_train, Y_train, validation_data = (X_test, Y_test)) нужно ли использовать .predict () или .evaluate () (с X_test, Y_test или другим набором)? - person Ben; 17.10.2019
comment
@ Бен, да. Другой набор называется набором тестов. Это необходимо для объективной оценки. Всегда хорошо (или, по крайней мере, не навредит), если у вас получится. Вы можете ознакомиться с моим ответом для получения более подробной информации. - person hafiz031; 22.03.2020
comment
@Guido Mocha для набора проверки необходимо, чтобы он отражал данные реального мира, то есть данные, поступающие из той же практической области, где будет использоваться модель. Так что, если вы уверены, что набор валидации его охватит, то все в порядке, независимо от мини-пакетного / пакетного / стохастического градиентного спуска. Опять же, набор для проверки не должен быть чрезмерно большим. Если вы можете гарантировать, что он охватывает почти все интересующие вас случаи, тогда набор для проверки может быть меньше. Перетасовка всех данных перед включением в набор для обучения и проверки полезна для равномерного распределения. - person hafiz031; 22.03.2020
comment
Спасибо за четкое объяснение. Сегодня у меня был старший специалист по анализу данных, который сказал мне в лицо, что неспособность выделить 3-ю группу тестовых данных приведет к чрезмерной подгонке, что сделает мои результаты недействительными. Основываясь на вашем объяснении здесь, потенциально предвзятость не является недействительной, есть разница. Мне очень нужна была эта проверка работоспособности, и я далее прихожу к выводу, что если я обязуюсь больше не изменять гиперпараметры, если и когда я наконец увижу свежие «тестовые» данные, то я даже не потенциально предвзято? - person J B; 14.06.2021

В этом видео на YouTube объясняется, что такое набор проверки, почему он полезен и как реализовать набор проверки в Keras: Создайте набор проверки в Керас

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

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

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

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

person blackHoleDetector    schedule 20.09.2017
comment
каков же обходной путь проверки, когда мы хотим использовать train_on_batch () для большого набора данных в keras? - person Guido Mocha; 20.01.2019

Я думаю, что общее обсуждение набора поездов, набора проверки и набора тестов поможет:

  • Train-Set: набор данных, на котором обучается модель. Это единственный набор данных, для которого веса обновляются во время обратного распространения.
  • Validation-Set (Development Set): набор данных, на котором мы хотим, чтобы наша модель работала хорошо. Во время процесса обучения мы настраиваем гиперпараметры таким образом, чтобы модель хорошо работала на dev-set (но не использовать dev-set для обучения, он используется только для просмотра производительности, чтобы мы могли решить, как изменить гипер -параметры и после изменения гиперпараметров продолжаем обучение на тренировочном наборе). Dev-set используется только для настройки гиперпараметров, чтобы модель могла хорошо работать с неизвестными данными (здесь dev-set рассматривается как представитель неизвестного набора данных, поскольку он не используется напрямую для обучения и дополнительно говорит о гипер -параметры похожи на ручки настройки для изменения способа обучения), и на dev-set не происходит обратного распространения и, следовательно, нет прямого обучения на нем.
  • Тестовый набор: мы просто используем его для объективной оценки. Как и dev-set, на тестовом наборе не происходит обучения. Единственное отличие от набора проверки (dev-set) состоит в том, что мы не даже настраиваем здесь гиперпараметры и просто смотрим, насколько хорошо наша модель научилась обобщать. Хотя, как и test-set, dev-set не используется напрямую для обучения, но поскольку мы неоднократно настраиваем гиперпараметры, нацеленные на dev-set, наша модель косвенно изучает шаблоны из dev-set, и dev-set больше не становится неизвестным к модели. Следовательно, нам нужна еще одна свежая копия dev-set, которая даже не используется для настройки гиперпараметров, и мы называем эту новую копию dev-set тестовым набором. Поскольку по определению тест-набор должен быть «неизвестен» модели. Но если мы не можем управлять таким свежим и невидимым набором тестов, то иногда мы называем набор для разработки как набор тестов.

Резюмируя:

  • Train-Set: используется для обучения.
  • Validation-Set / Dev-Set: используется для настройки гиперпараметров.
  • Test-Set: используется для объективной оценки.

Здесь снова несколько практических вопросов:

  • Для обучения вы можете собирать данные откуда угодно. Это нормально, если все ваши собранные данные относятся к разным доменам, в которых будет использоваться модель. Например, если реальным доменом являются фотографии, сделанные камерой смартфона, нет необходимости создавать набор данных только с фотографиями смартфона. Вы можете включать данные из Интернета, высококачественных или недорогих камер или откуда угодно.
  • Для dev-set и test-set необходимо отразить реальные данные предметной области, где модель будет практически использоваться. Также он должен содержать все возможные случаи для лучшей оценки.
  • Dev-set и test-set не должны быть такими большими. Просто убедитесь, что он почти охватывает все случаи или ситуации, которые могут возникнуть в реальных данных. После проверки постарайтесь предоставить как можно больше данных для построения набора поездов.
person hafiz031    schedule 16.03.2020
comment
лучший ответ ... также я думал, что гиперпараметры такие же, как параметры ... наш ответ заставил меня гуглить об этом ... для таких людей, как я, это ваш ответ datascience.stackexchange.com/questions/14187 / - person Lakshay; 22.03.2020
comment
Настройка гиперпараметров выполняется автоматически или мне нужно делать это вручную? Веса обновляются автоматически с помощью обратного распространения ошибки, и мне интересно, выполняется ли настройка гиперпараметров другим алгоритмом. - person VansFannel; 05.06.2020
comment
@VansFannel, гиперпараметры - это переменные, которые мы используем для управления процессом обучения. Если бы это происходило автоматически, то мы бы не контролировали тренировочный процесс. Если вы не хотите их настраивать, вы всегда можете выбрать для них значения по умолчанию. В большинстве случаев это нормально, но иногда специально для новых случаев, если у вас нет предварительного представления о работе с этими данными, рекомендуется настроить их вручную. - person hafiz031; 05.06.2020
comment
@ hafiz031 Значит, приходится делать это вручную. Проверьте потерю валидации и точность и попробуйте другие параметры, пока я не получу лучший результат, не так ли? - person VansFannel; 05.06.2020
comment
@VansFannel: да, рекомендуется, если у вас нет предварительного представления, какое значение выбрать, или если вы не уверены, как модель будет себя вести. Но вы можете изначально выбрать значения по умолчанию для этих гиперпараметров. Если это соответствует вашим потребностям, то все готово. В противном случае постепенно меняйте их и наблюдайте за поведением. Не меняйте более одного гиперпараметра за раз, иначе вы не сможете узнать, кто на самом деле несет ответственность за определенное изменение. Так что меняйте их один за другим. Вы можете использовать планировщик скорости обучения для постепенного уменьшения скорости обучения. Вы также можете попробовать поиск по сетке по гиперпараметрам. - person hafiz031; 05.06.2020

Итак, в основном в наборе проверки модель будет пытаться предсказать, но она не будет обновлять свои веса (что означает, что она не будет учиться на них), поэтому вы получите четкое представление о том, насколько хорошо ваша модель может находить шаблоны в данные обучения и применить их к новым данным.

person Aaditya Shukla    schedule 15.04.2021