为什么我的分类器没有给我二进制结果?

时间:2019-07-26 16:47:20

标签: python neural-network pytorch

我创建了一个线性ReLu网络,该网络应该适合我的数据。我使用BCEWithLogisticLoss作为损失函数。我用它来分类3d点。由于数据足够小,所以我不在乎将其分成批处理。而且效果很好。但是现在我已经实现了批处理,似乎预测值不是我期望的值(即0或1),相反它给了我像-25.4562这样的数字,我没有从网络上仅更改批处理。

我尝试了二进制丢失函数BSELoss,但是在pytorch版本中似乎是一个错误,因此我无法使用它。您可以在下面查看我的代码:


device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# We load the training data 
Samples, Ocupancy = common.load_samples()
for i in range(0,Ocupancy.shape[0]):
    if Ocupancy[i] > 1 or Ocupancy[i] < 0:
        print("upsie")

max = np.amax(Samples)
min = np.amin(Samples)

x_test = torch.from_numpy(Samples.astype(np.float32)).to(device)
y_test = torch.from_numpy(Ocupancy.astype(np.float32)).to(device)

train_data = CustomDataset(x_test, y_test)

train_loader = DataLoader(dataset=train_data, batch_size= 22500, shuffle=False) # Batches_size equal to the number of points in each slice 


phi = common.MLP(3, 1).to(device)
criterion = torch.nn.BCEWithLogitsLoss()
optimizer = torch.optim.Adam(phi.parameters(), lr = 0.01)
epoch = 10

fit_start_time = time.time()

for epoch in range(epoch):
    for x_batch, y_batch in train_loader:
        #optimizer.zero_grad()

        x_train = x_batch.to(device)

        y_train = y_batch.to(device)

        y_pred = phi(x_batch)
        print(y_pred)

        # Compute Loss
        loss = criterion(y_pred.squeeze(), y_batch.squeeze())

        print('Epoch {}: train loss: {}'.format(epoch, loss.item()))    # Backward pass

        loss.backward()
        optimizer.step()

fit_end_time = time.time()

print("Total time = %f" % (fit_end_time - fit_start_time))
min = -2
max = 2
resolution = 0.05
X,Y,Z  = np.mgrid[min:max:resolution,min:max:resolution,min:max:resolution] # sample way more

xyz = torch.from_numpy(np.vstack([X.ravel(), Y.ravel(),Z.ravel()]).transpose().astype(np.float32)).to(device)

eval = LabelData(xyz)

eval_loader = DataLoader(dataset=eval, batch_size= 22500, shuffle=False) # Make bigger batches

# feed the network bit by bit?
i = 0
for x_batch in eval_loader:
    phi.eval()
    labels =  phi(x_batch).to(device)
print(labels)

visualization_iso(X,Y,Z,labels)

我希望预测值是0或1,或者至少是一个概率,但是它给了我很多我不理解的数字。像:19.5953 请查看我的代码,如果发现任何重大错误,请告诉我。我真的很困惑,因为它在我扩展所使用的数据大小之前效果很好。

致谢

1 个答案:

答案 0 :(得分:1)

我可能是错的,但是我正在尝试根据您在问题中的代码进行回答。

您正在使用BCEwithlogitsloss,这意味着该模型将输出logitslogits是在使用S型激活之前的输出。回想一下,S型激活用于将输出转换为概率(基本上在0到1之间)。 Logits可以是任何实数。

基于此,我认为您应该通过S型激活来传递模型的输出,即F.sigmoid(phi(x_batch))。或者,您也可以只检查模型的输出是大于0还是小于0。如果大于0,则标签应为1。