потери pytorch, накопленные при использовании мини-партии

#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()».