В чем разница между model.training = False и model.param.require_grad = False

В чем разница между этими двумя:

model.training = False

а также

for param in model.parameters():
    param.require_grad = False
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
866
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 - нет. Это правильно?

Jing Gu 30.05.2019 11:32

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

Anubhav Singh 30.05.2019 13:25

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

Anubhav Singh 30.05.2019 13:43

Другие вопросы по теме