首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么损失函数总是在第一阶段之后返回零?

为什么损失函数总是在第一阶段之后返回零?
EN

Stack Overflow用户
提问于 2021-12-01 02:52:57
回答 1查看 945关注 0票数 1

为什么损失函数总是在第一个时期之后打印为零?

我怀疑这是因为loss = loss_fn(outputs, torch.max(labels, 1)[1])

但是如果我使用loss = loss_fn(outputs, labels),我将得到错误

代码语言:javascript
复制
RuntimeError: 0D or 1D target tensor expected, multi-target not supported

代码语言:javascript
复制
nepochs = 5

losses = np.zeros(nepochs)

loss_fn = nn.CrossEntropyLoss()

optimizer = optim.Adam(modell.parameters(), lr = 0.001)

for epoch in range(nepochs):

    running_loss = 0.0
    n = 0
    
    for data in train_loader:
        
        #single batch
        if(n == 1):
            break;
            
        inputs, labels = data
        
        optimizer.zero_grad()

        outputs = modell(inputs)
        
        #loss = loss_fn(outputs, labels)
        loss = loss_fn(outputs, torch.max(labels, 1)[1])
        loss.backward()
        optimizer.step()
    
        running_loss += loss.item()
        n += 1
       
    losses[epoch] = running_loss / n
    print(f"epoch: {epoch+1} loss: {losses[epoch] : .3f}")

模式是:

代码语言:javascript
复制
def __init__(self, labels=10):
    super(Classifier, self).__init__()
    self.fc = nn.Linear(3 * 64 * 64, labels)
    
def forward(self, x):
    out = x.reshape(x.size(0), -1) 
    out = self.fc (out)
    return out

有什么想法吗?

标签是这样的64个元素张量:

代码语言:javascript
复制
tensor([[7],[1],[ 2],[3],[ 2],[9],[9],[8],[9],[8],[ 1],[7],[9],[2],[ 5],[1],[3],[3],[8],[3],[7],[1],[7],[9],[8],[ 8],[3],[7],[ 5],[ 1],[7],[3],[2],[1],[ 3],[3],[2],[0],[3],[4],[0],[7],[1],[ 8],[4],[1],[ 5],[ 3],[4],[3],[ 4],[8],[4],[1],[ 9],[7],[3],[ 2],[ 6],[4],[ 8],[3],[ 7],[3]])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-01 04:40:16

通常损失计算为loss = loss_fn(outputs, labels),此处outputs如下所示:

代码语言:javascript
复制
_ , outputs = torch.max(model(input), 1)
or
outputs = torch.max(predictions, 1)[0]

常见的做法是修改outputs而不是labels

torch.max()返回一个名称元组(values, indices),其中的值是给定维度diminput张量的每行的最大值。indices是找到的每个最大值(argmax)的索引位置。

在代码片段中,labels不是标签的索引,所以在计算损失时,函数应该如下所示:

代码语言:javascript
复制
loss = loss_fn(torch.max(outputs, 1)[0], labels)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70178582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档