交叉熵 IndexError 维度超出范围

问题描述

我正在尝试在一些图像中训练 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)

进程以退出代码 1 结束

解决方法

您模型的输出与您的标准不一致。

如果您想保留模型并更改标准:

使用 BCELoss 而不是 CrossEntropyLoss。注意:在传入标签之前,您需要将标签强制转换为浮动。还可以考虑从模型中删除 Sigmoid() 并使用 BCEWithLogitsLoss

如果您想保留标准并更改模型:

CrossEntropyLoss 期望形状为 (...,num_classes)。因此,对于您的 2 类案例(真实和虚假),您必须为批次中的每个图像预测 2 个值,这意味着您需要更改模型中最后一层的输出通道。它还需要原始 logits,因此您应该删除 Sigmoid()