我有一个简单的nn模型,看起来像这样
class TestRNN(nn.Module): def __init (self,batch_size,n_steps,n_inputs,n_neurons,n_outputs): super(TestRNN,self). init __() ……
的 TL; DR 强>
您有两种选择:
outputs
nn.BCEWithLogitsLoss
nn.CrossEntropyLoss
我认为问题不在于负数。它的形状 outputs 。
看着你的阵列 y ,我看到你有两个不同的类(可能更多,但让我们假设它是2)。这意味着最后一个维度 outputs 应该是2.原因是 outputs 需要给两个不同类别中的每一个“得分”(见 文件 )。得分可以是负数,零或正数。但你的形状 outputs 是 [64,1] , 并不是 [64,2] 按要求。
y
[64,1]
[64,2]
其中一个步骤 nn.CrossEntropyLoss() 对象将把这些分数转换为两个类的概率分布。这是使用softmax操作完成的。但是,在进行二进制分类时(即,仅使用2个类进行分类,如我们当前的情况),还有另一种选择:仅为一个类提供分数,使用sigmoid函数将其转换为该类的概率,以及然后对此执行“1-p”以获得其他类的概率。这个选项意味着 outputs 只需要给出两个类别中的一个的分数,就像你目前的情况一样。要选择此选项,您需要更改 nn.CrossEntropyLoss 同 nn.BCEWithLogitsLoss 。然后你可以传递给它 outputs 和 y 正如你现在所做的那样(注意它的形状) outputs 需要准确的形状 y ,所以在你的例子中,你需要通过 outputs[:,0] 代替 outputs 。你还需要转换 y 浮动: y.float() 。因此呼叫是 criterion(outputs[:,0], y.float()) )
nn.CrossEntropyLoss()
outputs[:,0]
y.float()
criterion(outputs[:,0], y.float())