nn.Module
ли он forward()
в nn.Module
? Я думал, что когда мы вызываем модель, используется метод forward
. Почему нам нужно указать train()?
Что делает model.train() в pytorch?
Ответ 1
model.train()
сообщает вашей модели, что вы model.train()
модель. Таким образом, эффективно такие слои, как выпадание, групповой поток и т.д., Которые ведут себя по-разному в поезде и в процедурах испытаний, знают, что происходит, и, следовательно, могут вести себя соответствующим образом.
Более подробно: он устанавливает режим тренировки (см. Исходный код). Вы можете вызвать model.eval() или model.train(mode = False), чтобы сообщить, что вы тестируете. Это несколько интуитивного ожидать train
функции для обучения модели, но он не делает этого. Он просто устанавливает режим.
Ответ 2
Есть два способа позволить модели знать ваше намерение, т.е. Вы хотите обучить модель или хотите использовать модель для оценки. В случае model.train() модель знает, что она должна изучать слои, и когда мы используем model.eval(), это указывает на то, что ничего нового не нужно изучать, а модель используется для тестирования. model.eval() также необходимо, потому что в pytorch, если мы используем batchnorm и во время теста, если хотим просто передать одно изображение, pytorch выдает ошибку, если model.eval() не указан.
Ответ 3
Вот код module.train()
:
def train(self, mode=True):
r"""Sets the module in training mode."""
self.training = mode
for module in self.children():
module.train(mode)
return self
А вот и module.eval
.
def eval(self):
r"""Sets the module in evaluation mode."""
return self.train(False)
Режимы train
и eval
- это единственные два режима, в которые мы можем установить модуль, и они абсолютно противоположны.
Это просто self.training
флаг и в настоящее время только отсев и bachnorm забота о том флаге.
По умолчанию этот флаг установлен в True
.