Python 如何使用torch.nn.CrossEntropyLoss作为自动编码器';什么是重建损失?

Python 如何使用torch.nn.CrossEntropyLoss作为自动编码器';什么是重建损失?,python,machine-learning,deep-learning,pytorch,cross-entropy,Python,Machine Learning,Deep Learning,Pytorch,Cross Entropy,我想使用CrossEntropyLoss计算自动编码器的重建精度: ae_criterion = nn.CrossEntropyLoss() ae_loss = ae_criterion(X, Y) 其中,X是自动编码器的重建,而Y是目标(因为它是一个自动编码器,Y与原始输入X相同)。 X和Y都具有形状[42,32,130]=[批大小、时间步长、类数]。当我运行上面的代码时,我得到以下错误: ValueError:预期的目标大小(42130),获取火炬。大小([42,32, 130]) 查看文

我想使用CrossEntropyLoss计算自动编码器的重建精度:

ae_criterion = nn.CrossEntropyLoss()
ae_loss = ae_criterion(X, Y)
其中,
X
是自动编码器的重建,而
Y
是目标(因为它是一个自动编码器,
Y
与原始输入
X
相同)。
X
Y
都具有形状
[42,32,130]=[批大小、时间步长、类数]
。当我运行上面的代码时,我得到以下错误:

ValueError:预期的目标大小(42130),获取火炬。大小([42,32, 130])

查看文档后,我仍然不确定如何以适当的方式调用
nn.CrossEntropyLoss()
。似乎我应该将Y的形状更改为
[42,32,1]
,每个元素都是区间
[0129]
(或
[1130]
)中的标量,对吗


有没有办法避免这种情况?由于
X
Y
介于
0
1
之间,我可以用一种等效的方式使用二进制交叉熵损失元素吗?

对于
交叉熵权
,Y的形状必须是(42,32),每个元素必须是区间[0,129]中的长标量


您可能需要使用
BCELoss
BCEWithLogitsLoss
来解决您的问题。

交叉入口权限
通常用于分类问题。你可能应该使用
MSELoss
或类似的工具。@iacolippo不,我的数据集是由离散事件的时间序列组成的,所以我实际上在做分类。哦,我的错,误读了这个问题。您不想在最后一个维度上使用argmax有什么原因吗?(使用类的idx而不是一个热向量)。否则,您可以按照答案中的建议使用
BCELoss
。主要是为了计算效率,我不想在每次训练迭代中都进行计算。但这似乎是唯一的方法,因为我的三维空间是softmax层的输出,我认为
BCELoss
在这里不合适。如果你看看执行argmax需要多少时间,我很确定,与所有其他的相比,它可以忽略不计:-)在这种情况下,您确定使用
BCELoss
等同于
CrossEntropyLoss
?我的最后一个维度是超过130个类的softmax层的输出,不确定它是否与使用元素级
BCELoss
相同。