PyTorch ValueError:目标和输入必须具有相同数量的元素

时间:2017-12-01 13:20:26

标签: python-3.x lstm pytorch

我对PyTorch不熟悉,但我想了解当计算损失函数时,目标和输入的大小如何在torch.nn.BCELoss()中工作。

Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/nn/functional.py", line 767
"Please ensure they have the same size.".format(target.size(), input.size()))

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/nn/functional.py", line 770, in binary_cross_entropy
"!= input nelement ({})".format(target.nelement(), input.nelement()))
ValueError: Target and input must have the same number of elements. target nelement (3) != input nelement (6)

我收到以下错误:

{{1}}

此错误肯定来自last_out(大小3x2)和目标(大小3)的不同大小。所以我的问题是如何将last_out转换为目标(大小为3且仅包含0和1)以计算损失函数?

1 个答案:

答案 0 :(得分:2)

nn.BCELoss()的想法是实现以下公式:

enter image description here

ot都是任意(但相同!)大小的张量,i只是索引两个张量的每个元素来计算上面的总和。

通常,nn.BCELoss()用于分类设置:oi将是维度N x D的矩阵。 N将是您的数据集或小批量中的观察数量。如果您只是尝试对单个属性进行分类,则D将为1;如果您尝试对多个属性进行分类,则t将大于1。 o,目标矩阵,只保留0和1,对于每个属性,只有两个类(二进制交叉熵损失的二进制来自)。 target将保留将每个观察的每个属性分配给第1类的概率。

现在,在您的上述设置中,您不清楚正在考虑的课程数量以及您有多少属性。如果model的形状只建议了一个属性,则只应输出一个数量,即从targets输入第1类的概率。如果有两个属性,则torch.nn.CrossEntropyLoss不完整!如果有多个课程,则应使用torch.nn.BCELoss()代替torch.nn.BCEWithLogitsLoss

顺便说一下,为了数值稳定性,通常希望在某些输出上使用torch.nn.BCELoss()而不是nn.Sigmoid() GlslProgram(const char* vertex_shader_path, const char* fragment_shader_path, const char* tess_control_shader_path = "", const char* tess_eval_shader_path = "", const char* geom_shader_path = "");