带着Pythorch的门

2024-03-29 11:44:49 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我不熟悉Pythorch和深度学习。
我写的代码可以再往下看。 我在学习简单的“与”问题,它是线性可分的。
问题是,我的成绩很差。只有大约2/10倍的答案是正确的。
有时损失.项目卡在250()值处。在

只是为了清理一下

  • 为什么它只能工作2/10次?

一。在

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))

Tags: inimportselfdatasizemodelasnp
1条回答
网友
1楼 · 发布于 2024-03-29 11:44:49

1。在优化器中使用零梯度

您没有使用optimizer.zero_grad()来清除渐变。你的学习循环应该是这样的:

for epoch in range(epochs):
    optimizer.zero_grad()
    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()))

在这种情况下,它不会产生任何有害的影响,梯度是累积的,但当你有相同的数据集循环,它几乎没有任何区别(你应该养成这个习惯,因为你将在你的深入学习旅程中使用它)。在

2。成本函数

您使用的是回归损失函数,而不是分类函数(您所做的是二进制分类)。在

因此,您应该使用BCELoss和sigmoid activation,或者(我更喜欢这样),从网络返回logits并使用BCEWithLogitsLoss,它们都计算二进制交叉熵(交叉熵的简化版本)。在

见下文:

^{pr2}$

3。预测

如果您使用的是logits版本,分类器将学习为0标签分配负值,为正表示1。您的显示功能必须进行修改以包含以下知识:

for x, y in zip(data_x, data_y):
    pred = model(x)
    # See int(pred > 0), that's the only change
    print("Input", list(map(int, x)), "Pred", int(pred > 0), "Output", int(y))

如果forward将sigmoid应用于输出,则此步骤不适用。哦,最好使用torch.round而不是转换成{}。在

相关问题 更多 >