pytorch中损失函数错误-损失函数应该如何使用?

问题描述 投票:0回答:1

我写了这段代码:

import torch
import torch.nn as nn
import torch.nn.functional as f
import math
import matplotlib.pyplot as plt
import numpy as np
import random

class dnn(nn.Module):
    def __init__(self):
        super(dnn, self).__init__()
        self.l1 = nn.Linear(in_features=1, out_features=3)
        self.l2 = nn.Linear(in_features=3, out_features=3)
        self.l3 = nn.Linear(in_features=3, out_features=1)

    def forward(self, out):
        out = f.leaky_relu(self.l1(out))
        out = f.leaky_relu(self.l2(out))
        out = f.leaky_relu(self.l3(out))
        return out

model = dnn()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)

for k in range(100):
    for i in range(30):
        outputs = model(torch.tensor([i]).type(torch.FloatTensor))
        loss = criterion(outputs, torch.tensor([math.cos(i)]).type(torch.FloatTensor))
        *print(loss)*
        loss.backward()
        optimizer.zero_grad()
        optimizer.step()
    print('{}%'.format(k))

x = []
y = []
p = []

for i in range(30):
    x.append(i)
    y.append(math.cos(i))
    p.append(str(model(torch.tensor([i]).type(torch.FloatTensor))).split('[')[1].split(']')[0])

plt.plot(x, p, 'g')
plt.plot(x, y, 'b')

plt.show()

然而,这个模型预测的结果却很奇怪。

https://i.stack.imgur.com/bs6Q2.png

所以我又尝试了几次,并不断得到类似的结果。 当我查看代码中的各种变量来解决问题时,我发现了一些奇怪的事情。

打印(丢失)

tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)
tensor(-0., grad_fn=<DivBackward1>)

损失函数没有改变。 我该如何解决这个问题?

python pytorch loss-function
1个回答
0
投票

例如,您需要回归任务的损失函数

criterion = nn.L1Loss()

nn.CrossEntropyLoss() 期望目标作为类的索引或类的概率,您可以更改您的网络以进行二元分类任务

import torch
import torch.nn as nn
import torch.nn.functional as f
import math
import matplotlib.pyplot as plt
import numpy as np
import random

class dnn(nn.Module):
    def __init__(self):
        super(dnn, self).__init__()
        self.l1 = nn.Linear(in_features=1, out_features=3)
        self.l2 = nn.Linear(in_features=3, out_features=3)
        self.l3 = nn.Linear(in_features=3, out_features=2)

    def forward(self, out):
        out = f.leaky_relu(self.l1(out))
        out = f.leaky_relu(self.l2(out))
        out = f.leaky_relu(self.l3(out))
        
        return out

model = dnn()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)

for k in range(100):
    for i in range(30):
        # print(torch.tensor([i]))
        outputs = model(torch.tensor([i]).type(torch.FloatTensor))
        
        loss = criterion(outputs, torch.tensor([math.cos(i), 0]).type(torch.FloatTensor))
        loss.backward()
        optimizer.zero_grad()
        optimizer.step()
    print('{}%'.format(k))

x = []
y = []
p = []

for i in range(30):
    x.append(i)
    y.append(math.cos(i))
    p.append(str(model(torch.tensor([i]).type(torch.FloatTensor))).split('[')[1].split(']')[0])

plt.plot(x, p, 'g')
plt.plot(x, y, 'b')

plt.show()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.