Python 为什么我的分类器不给我二进制结果?

Python 为什么我的分类器不给我二进制结果?,python,neural-network,pytorch,Python,Neural Network,Pytorch,我创建了一个线性ReLu网络,该网络应该与我的数据过度匹配。我使用bcewithlogicsloss作为损失函数。我用它来分类3d点。由于数据足够小,我不想分批处理。而且效果很好。然而,现在我已经在其中实现了批处理,似乎预测值不是我所期望的(即0或1),相反,它给了我-25.4562这样的数字,我没有从网络中更改任何其他内容,只更改了批处理 我尝试了二进制丢失函数BSELoss,但是它似乎是pytorch版本中的一个bug,所以我不能使用它。您可以在下面查看我的代码: device=torch

我创建了一个线性ReLu网络,该网络应该与我的数据过度匹配。我使用bcewithlogicsloss作为损失函数。我用它来分类3d点。由于数据足够小,我不想分批处理。而且效果很好。然而,现在我已经在其中实现了批处理,似乎预测值不是我所期望的(即0或1),相反,它给了我-25.4562这样的数字,我没有从网络中更改任何其他内容,只更改了批处理

我尝试了二进制丢失函数BSELoss,但是它似乎是pytorch版本中的一个bug,所以我不能使用它。您可以在下面查看我的代码:


device=torch.device(“cuda”如果torch.cuda.is_可用()否则为“cpu”)
#我们加载训练数据
样本,Ocupancy=common.load_样本()
对于范围(0,Ocupancy.shape[0])中的i:
如果Ocupancy[i]>1或Ocupancy[i]<0:
打印(“upsie”)
最大值=np.amax(样本)
最小值=np.amin(样本)
x_测试=火炬从_numpy(Samples.astype(np.float32))到(设备)
y_测试=火炬从_numpy(Ocupancy.aType(np.float32))到(设备)
列车数据=自定义数据集(x\U测试、y\U测试)
train_loader=DataLoader(dataset=train_data,batch_size=22500,shuffle=False)#batch_size等于每个切片中的点数
phi=公共.MLP(3,1).to(设备)
标准=torch.nn.BCEWithLogitsLoss()
optimizer=torch.optim.Adam(phi.parameters(),lr=0.01)
历元=10
fit_start_time=time.time()
对于范围内的历元(历元):
对于x_批次,列车装载机中的y_批次:
#optimizer.zero_grad()
x_系列=x_批次至(设备)
y_系列=y_批次至(设备)
y_pred=φ(x_批次)
打印(y_pred)
#计算损失
损失=标准(y_pred.squence(),y_batch.squence())
打印('Epoch{}:train loss:{}'。格式(Epoch,loss.item())#向后传递
loss.backward()
optimizer.step()
fit\u end\u time=time.time()
打印(“总时间=%f”%(拟合结束时间-拟合开始时间))
最小值=-2
最大值=2
分辨率=0.05
十、 Y,Z=np.mgrid[min:max:resolution,min:max:resolution,min:max:resolution]#示例方式更多
xyz=torch.from_numpy(np.vstack([X.ravel(),Y.ravel(),Z.ravel()])。transpose().astype(np.float32))。到(设备)
eval=LabelData(xyz)
eval_loader=DataLoader(dataset=eval,batch_size=22500,shuffle=False)#生成更大的批
#一点一点地给网络供电?
i=0
对于评估加载程序中的x_批次:
phi.eval()
标签=φ(x_批次)。至(设备)
打印(标签)
可视化_iso(X、Y、Z、标签)
我希望预测值是0或1,或者至少是一个概率,但是它给了我一个我不理解的大数字。比如:19.5953 请看一下我的代码,如果你发现任何大错误,请告诉我。我真的很困惑,因为在我扩展我使用的数据的大小之前,它工作得相当好


关于

我可能错了,但我试图根据问题中的代码回答

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

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