Код можно увидеть ниже.
Проблема в том, что часть optimizer.step()
не работает.Я печатаю model.parameters()
до и после тренировки, и веса не меняются.
Я пытаюсь создать персептрон, который может решить проблему AND.Мне удалось это сделать с моей собственной крошечной библиотекой, где я реализовал персептрон с двумя функциями predict()
и train()
.
Просто чтобы прояснить, я только начал изучать глубокое обучение с использованием PyTorch, так что это, вероятно, очень новая проблема.Я пытался найти решение, но без удачи.Я также сравнил свой код с другими работающими кодами, но я не знаю, что я делаю неправильно.
import torch
from torch import nn, optim
from random import randint
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.layer1 = nn.Linear(2, 1)
def forward(self, input):
out = input
out = self.layer1(out)
out = torch.sign(out)
out = torch.clamp(out, 0, 1) # 0=false, 1=true
return out
data = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])
target = torch.Tensor([0, 0, 0, 1])
model = NeuralNet()
epochs = 1000
lr = 0.01
print(list(model.parameters()))
print() # Print parameters before training
loss_func = nn.L1Loss()
optimizer = optim.Rprop(model.parameters(), lr)
for epoch in range(epochs + 1):
optimizer.zero_grad()
rand_int = randint(0, len(data) - 1)
x = data[rand_int]
y = target[rand_int]
pred = model(x)
loss = loss_func(pred, y)
loss.backward()
optimizer.step()
# Print parameters again
# But they haven't changed
print(list(model.parameters()))