Pytorch 使用小批量时累积的Pyrotch损失

Pytorch 使用小批量时累积的Pyrotch损失,pytorch,loss-function,mini-batch,Pytorch,Loss Function,Mini Batch,我是个新手。请问添加“loss.item()”与不添加“loss.item()”有什么区别?以下两部分代码: 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

我是个新手。请问添加“loss.item()”与不添加“loss.item()”有什么区别?以下两部分代码:

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()
如果有人有任何想法,请帮忙。非常感谢。

调用
loss.item()
允许您获取一个
loss
变量,该变量从PyTorch创建的计算图中分离出来(这就是
.item()
对PyTorch变量的作用)

如果在每个“批次循环”的末尾添加行
trainingloss+=criteria.item()
,这将通过递增地添加训练集中每个小批次的损失来跟踪整个迭代中的批次损失。这是必要的,因为您使用的是小批量-每个小批量的损失将不等于所有批次的损失

注意:如果您在优化循环之外使用PyTorch变量,例如在不同的范围内使用PyTorch变量,如果您调用类似于
的返回损失
,则对属于计算图一部分的任何PyTorch变量调用
.item()
,这一点至关重要(作为一般的经验法则,任何与PyTorch方法交互的输出/丢失/模型都可能是计算图的一部分)。如果不是,这可能会导致计算图无法从Python内存中取消分配/删除,并可能导致CPU/GPU内存泄漏。不过,您上面的情况看起来是正确的

此外,在未来,PyTorch的类可以帮助您使用较少样板代码的小批量-它可以循环您的数据集,这样您循环的每个项目都是一个训练批-也就是说,在优化过程中不需要两个for循环


我希望您喜欢学习/使用Pytork!

在您的训练循环中,
criteria.backward()
部分计算前馈路径的每个可训练参数的梯度,然后是
优化器.step()
part根据计算的梯度和优化技术更新参数。因此,在该步骤结束时,特定批次的模型训练已经完成,并且
trainingloss+=criteria.item()
部分仅用于跟踪和监控培训过程以及培训每个步骤的损失值。

非常感谢。那么是否需要添加它?不,不需要:)非常感谢您的帮助。但我还有一个问题。当谈到“loss+=loss.item()”的必要性时,这里给出的两个答案似乎是不同的。非常感谢您的帮助。但我还有一个问题。这里给出的两个答案似乎是不同的,当谈到这个“损失+=损失.item()”的必要性时。啊,是的,澄清一下,我同意上面的答案。调用
loss+=loss.item()
有助于记录损失并跟踪损失,但不需要进行优化。希望这有帮助!