我创建了一个线性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 请查看我的代码,如果发现任何重大错误,请告诉我。我真的很困惑,因为它在我扩展所使用的数据大小之前效果很好。
致谢
答案 0 :(得分:1)
我可能是错的,但是我正在尝试根据您在问题中的代码进行回答。
您正在使用BCEwithlogitsloss
,这意味着该模型将输出logits
。 logits
是在使用S型激活之前的输出。回想一下,S型激活用于将输出转换为概率(基本上在0到1之间)。 Logits可以是任何实数。
基于此,我认为您应该通过S型激活来传递模型的输出,即F.sigmoid(phi(x_batch))
。或者,您也可以只检查模型的输出是大于0还是小于0。如果大于0,则标签应为1。