#pytorch #loss-function #mini-batch
Вопрос:
Я новичок в пайторче. Могу я спросить, в чем разница между добавлением «loss.item ()» или нет? Следующие 2 части кода:
for epoch in range(epochs):
trainingloss =0
for i in range(0,X.size()[1], batch_size):
indices = permutation[i:i batch_size]
F = model.forward(X[n])
optimizer.zero_grad()
criterion = loss(X,n)
criterion.backward()
optimizer.step()
trainingloss = criterion.item()
и это
for epoch in range(epochs):
for i in range(0,X.size()[1], batch_size):
indices = permutation[i:i batch_size]
F = model.forward(X[n])
optimizer.zero_grad()
criterion = loss(X,n)
criterion.backward()
optimizer.step()
Если у кого-нибудь есть какие-либо идеи, пожалуйста, помогите. Большое спасибо.
Ответ №1:
Вызов loss.item()
позволяет вам взять loss
переменную, которая отделена от графика вычислений, который создает PyTorch (это то, что .item()
делает для переменных PyTorch).
Если вы добавляете строку trainingloss = criterion.item()
в конце каждого «цикла пакетной обработки», это позволит отслеживать потери пакета на протяжении всей итерации, постепенно добавляя потери для каждого мини-матча в вашем обучающем наборе. Это необходимо, так как вы используете мини — пакеты-потери для каждого мини-пакета не будут равны потерям по всем партиям.
Примечание: Если вы используете PyTorch переменные за пределами оптимизации контура, например, в другой области, которая может произойти, если вы вызываете что-то вроде return loss
, это важно, что вы звоните .item()
с любым PyTorch переменные, которые входят в расчет диаграммы (как общее правило, каких-либо мероприятий/потери/моделей, которые взаимодействуют с PyTorch методов, вероятно, будет частью Вашего расчета граф). Если нет, это может привести к тому, что график вычислений не будет выделен/удален из памяти Python, и может привести к утечкам памяти процессора/графического процессора. Однако то, что у вас есть выше, выглядит правильно!
Кроме того, в будущем DataLoader
класс PyTorch может помочь вам с мини — пакетами с меньшим количеством шаблонного кода — он может зацикливаться на вашем наборе данных таким образом, что каждый элемент, который вы зацикливаете, является обучающим пакетом, т. Е. вам не требуется два цикла для оптимизации.
Я надеюсь, вам понравится изучать/использовать PyTorch!
Комментарии:
1. Большое вам спасибо за вашу помощь. Но у меня все еще есть один вопрос, пожалуйста. Похоже, что два ответа, приведенные здесь, отличаются, когда речь заходит о необходимости этого » потеря =потеря.item()».
2. Ах да, чтобы уточнить, я согласен с приведенным выше ответом. Вызов
loss = loss.item()
полезен для регистрации потерь и отслеживания их, но не является необходимым для оптимизации. Надеюсь, это поможет!
Ответ №2:
В вашем цикле обучения criterion.backward()
часть вычисляет градиент каждого обучаемого параметра пути прямой передачи, затем optimizer.step()
часть обновляет параметры на основе вычисленных градиентов и методов оптимизации. Таким образом, в конце этого этапа обучение модели для конкретной партии было завершено, и эта trainingloss = criterion.item()
часть предназначена только для отслеживания и мониторинга процесса обучения и значений потерь для каждого этапа обучения.
Комментарии:
1. Большое спасибо. Тогда нужно ли его добавлять или нет?
2. Нет, в этом нет необходимости:)
3. Большое вам спасибо за вашу помощь. Но у меня все еще есть один вопрос, пожалуйста. Похоже, что два ответа, приведенные здесь, отличаются, когда речь заходит о необходимости этого » потеря =потеря.item()».