问题描述
我正在尝试在一些图像中训练 GAN,我遵循了 pytorch 页面上的教程并获得了以下代码,但是在训练期间应用交叉熵函数时,它返回代码下方的错误:
session.request(signedRequest)
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
}
错误:
回溯(最近一次调用最后一次):
文件“G:/Pastas Estruturadas/Conhecimento/CEFET/IA/SpectroGAN/DCGAN.py”,第 137 行,在 errD_real = 标准(输出,标签)
文件“C:\Users\Ramon\anaconda3\envs\vision\lib\site-packages\torch\nn\modules\module.py”,第 722 行,在 _call_impl 中
result = self.forward(*input,**kwargs)
文件“C:\Users\Ramon\anaconda3\envs\vision\lib\site-packages\torch\nn\modules\loss.py”,第 948 行,向前
ignore_index=self.ignore_index,reduction=self.reduction)
文件“C:\Users\Ramon\anaconda3\envs\vision\lib\site-packages\torch\nn\functional.py”,第 2422 行,在 cross_entropy 中
return nll_loss(log_softmax(input,1),target,weight,None,ignore_index,reduction)
文件“C:\Users\Ramon\anaconda3\envs\vision\lib\site-packages\torch\nn\functional.py”,第 1591 行,在 log_softmax 中
ret = input.log_softmax(dim)
IndexError: Dimension out of range(预计在 [-1,0] 范围内,但得到 1)
解决方法
您模型的输出与您的标准不一致。
如果您想保留模型并更改标准:
使用 BCELoss
而不是 CrossEntropyLoss
。注意:在传入标签之前,您需要将标签强制转换为浮动。还可以考虑从模型中删除 Sigmoid()
并使用 BCEWithLogitsLoss
。
如果您想保留标准并更改模型:
CrossEntropyLoss
期望形状为 (...,num_classes)
。因此,对于您的 2 类案例(真实和虚假),您必须为批次中的每个图像预测 2 个值,这意味着您需要更改模型中最后一层的输出通道。它还需要原始 logits,因此您应该删除 Sigmoid()
。