Я пытаюсь разработать простой однослойный персептрон с PyTorch (v0.4.0) для классификации логических операций AND.
Я хочу разработать его, используя autograd для расчета градиента весов и смещения, а затем обновлять их в SGD-манере.
Код очень прост и выглядит следующим образом:
# AND points and labels
data = torch.tensor([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
], dtype=torch.float32)
labels = torch.tensor([0,0,0,1], dtype=torch.float32)
weights = torch.zeros(2, dtype=torch.float32, requires_grad=True)
bias = torch.zeros(1, requires_grad=True)
losses = []
epochs = 100
eta = 0.01
for epoch in range(epochs):
total_loss = 0
for idx in range(4):
# take current input
X = data[idx,:]
y = labels[idx]
# compute output and loss
out = torch.add(torch.dot(weights, X), bias)
loss = (out-y).pow(2)
total_loss += loss.item()
# backpropagation
loss.backward()
# compute accuracy and update parameters
with torch.no_grad():
weights -= eta * weights.grad
bias -= eta * bias.grad
# reset gradient to zero
weights.grad.zero_()
bias.grad.zero_()
losses.append(total_loss)
Модель сходится, как видно из кривой обучения
но полученная плоскость:
с 50% точностью.
Я пробовал с разными исходными параметрами, а также с использованием оптимизатора SGD от PyTorch, но ничего не изменилось.
Я знаю, что MSE - это потеря регрессии, но я не думаю, что проблема в этом.
Есть идеи?
Обновление
Плоскость вычисляется с этими двумя строками кода
xr = np.linspace(0, 1, 10)
yr = (-1 / weights[1].item()) * (weights[0].item() * xr + bias.item())
plt.plot(xr,yr,'-')