Чтобы добавить точность, вам нужна только одна строка, а именно:
print("Accuracy: ", ((prediction > 0.5) == y).float().mean().item())
При использовании sigmoid
все, что больше 0.5
, считается положительным, а что-либо ниже отрицательного. (prediction > 0.5)
создает tensor
типа bool
, и вы проверяете, какие из них равны y
. float()
необходим, поскольку вы не можете вычислить mean
из bool
тензоров. item()
не требуется, но возвращает python значение из одного значения tensor
, и IMO выглядит чище.
Вы можете сделать то же самое для test
, следовательно, это будет:
model.eval()
x_test = Variable(torch.Tensor([[1, 1, 0], [0, 0, 1], [0, 1, 1]]))
y_test = Variable(torch.Tensor([[0], [0], [1]]))
with torch.no_grad():
y_pred = model(x_test)
print("Accuracy: ", ((y_pred > 0.5) == y_test).float().mean().item())
Обратите внимание torch.no_grad()
. Этот менеджер контекста отключает autograph
, когда вы находитесь в пределах его видимости. Поскольку вы просто передаете входные данные через свою нейронную сеть, а не обучаете ее с использованием градиентов, нет необходимости использовать автограф как часть уравнения.
Работа с логитами
Обычно это хорошая привычка не использовать окончательную активацию в ваших нейронных сетях (если вам это действительно не нужно). Следовательно, ваш форвард будет выглядеть так:
def forward(self, x):
matmul = self.linear_ij(x)
activation = torch.sigmoid(matmul)
# Notice no sigmoid
return self.linear_jk(activation)
Это выдает logits
(скажем, ненормализованная вероятность в диапазоне от [-inf, inf]
), указывающее, насколько уверена ваша нейронная сеть в положительном (+inf
) или отрицательном классе .
Вы должны соответствующим образом изменить функцию потерь, например, torch.nn.BCEWithLogitsLoss
(mean
- сокращение по умолчанию, здесь нет необходимости делать это явно):
criterion = torch.nn.BCEWithLogitsLoss()
Наконец, точность изменяется немного так же. Теперь все, что больше 0
, считается положительным, поэтому вы должны сделать это:
print("Accuracy: ", ((prediction > 0) == y).float().mean().item())
Если вам нужна вероятность, вы все равно можете использовать torch.sigmoid
на выходе, но вам это может даже не понадобиться (так как в данном случае это выглядит так) 1055 *
x = torch.Tensor(
[[0, 0, 1], [0, 1, 1], [1, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1], [0, 0, 0]]
)
y = torch.Tensor([[0], [1], [1], [1], [1], [0], [0]])
РЕДАКТИРОВАТЬ2:
Он должен быть размещен ниже (или выше) вашей печати с потерями, например:
for epoch in range(10000):
prediction = model(x)
loss = criterion(prediction, y)
if epoch % 1000 == 0 or epoch == 10000 - 1:
# Here is fine
print("Accuracy: ", ((prediction > 0.5) == y).float().mean().item())
print("epoch ", epoch, ",", "loss: ", loss.item())
# Backpropagation process
optimizer.zero_grad()
loss.backward()
optimizer.step()