我写了这段代码:
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()
然而,这个模型预测的结果却很奇怪。
所以我又尝试了几次,并不断得到类似的结果。 当我查看代码中的各种变量来解决问题时,我发现了一些奇怪的事情。
打印(丢失):
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>)
损失函数没有改变。 我该如何解决这个问题?
例如,您需要回归任务的损失函数
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()