一般来说,我不熟悉Pythorch和深度学习。
我写的代码可以再往下看。
我在学习简单的“与”问题,它是线性可分的。
问题是,我的成绩很差。只有大约2/10倍的答案是正确的。
有时损失.项目卡在250()值处。在
只是为了清理一下
一。在
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.autograd as autog
data_x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
data_y = np.array([[0, 0, 0, 1]]).T
data_x = autog.Variable(torch.FloatTensor(data_x))
data_y = autog.Variable(torch.FloatTensor(data_y), requires_grad=False)
in_dim = 2
out_dim = 1
epochs = 15000
epoch_print = epochs / 5
l_rate = 0.001
class NeuralNet(nn.Module):
def __init__(self, input_size, output_size):
super(NeuralNet, self).__init__()
self.lin1 = nn.Linear(input_size, output_size)
self.relu = nn.ReLU()
def forward(self, x):
out = x
out = self.lin1(out)
out = self.relu(out)
return out
model = NeuralNet(in_dim, out_dim)
criterion = nn.L1Loss()
optimizer = optim.Adam(model.parameters(), lr=l_rate)
for epoch in range(epochs):
pred = model(data_x)
loss = criterion(pred, data_y)
loss.backward()
optimizer.step()
if (epoch + 1) % epoch_print == 0:
print("Epoch %d Loss %.3f" %(epoch + 1, loss.item()))
for x, y in zip(data_x, data_y):
pred = model(x)
print("Input", list(map(int, x)), "Pred", int(pred), "Output", int(y))
1。在优化器中使用零梯度
您没有使用
optimizer.zero_grad()
来清除渐变。你的学习循环应该是这样的:在这种情况下,它不会产生任何有害的影响,梯度是累积的,但当你有相同的数据集循环,它几乎没有任何区别(你应该养成这个习惯,因为你将在你的深入学习旅程中使用它)。在
2。成本函数
您使用的是回归损失函数,而不是分类函数(您所做的是二进制分类)。在
因此,您应该使用
BCELoss
和sigmoid activation,或者(我更喜欢这样),从网络返回logits并使用BCEWithLogitsLoss
,它们都计算二进制交叉熵(交叉熵的简化版本)。在见下文:
^{pr2}$3。预测
如果您使用的是logits版本,分类器将学习为0标签分配负值,为正表示1。您的显示功能必须进行修改以包含以下知识:
如果forward将}。在
sigmoid
应用于输出,则此步骤不适用。哦,最好使用torch.round
而不是转换成{相关问题 更多 >
编程相关推荐