В чем разница между этими двумя:
model.training = False
а также
for param in model.parameters():
param.require_grad = False
model.training = False
переводит модуль в оценочный режим, т.е.
if model.training == True:
# Train mode
if model.training == False:
# Evaluation mode
Таким образом, эффективные уровни, такие как отсев, пакетная норма и т. д., которые ведут себя по-разному в поезде, и процедуры тестирования знают, что происходит, и, следовательно, могут вести себя соответствующим образом.
пока
for param in model.parameters():
param.require_grad = False
заморозить слои так, чтобы эти слои не обучались.
Основная идея заключается в том, что все модели имеют функцию model.children(), которая возвращает слои. Внутри каждого слоя есть параметры (или веса), которые можно получить с помощью .param() для любых дочерних элементов (т.е. слоя). Теперь у каждого параметра есть атрибут с именем requires_grad
, который по умолчанию равен True. True означает, что он будет распространяться обратно и, следовательно, чтобы заморозить слой, вам нужно установить для require_grad значение False для всех параметров слоя.
Если вас устраивает мой ответ, пожалуйста, примите его. Спасибо.
При случайном выпадении мы случайным образом выбрасываем единицы из нейронной сети. Но то, что мы делаем здесь, это установка всех параметров (весов) или параметров, которые мы хотим, чтобы они не участвовали в обратном распространении (в расчете градиента). Это выглядит случайным, но на самом деле это не так. И согласитесь с вашей последней частью, поскольку модель не будет использовать отсев в режиме оценки.
Спасибо за ваше объяснение. Это очень полезно. Могу ли я обобщить ваше объяснение следующим образом: в param.require_grad = False модель будет использовать случайное выпадение, а в model.training == False - нет. Это правильно?