我有一个神经网络,如下所示,用于二进制预测。我的课程严重不平衡,1级只发生了2%的次数。只显示最后几层
self.batch_norm2 = nn.BatchNorm1d(num_filters)
self.fc2 = nn.Linear(np.sum(num_filters), fc2_neurons)
self.batch_norm3 = nn.BatchNorm1d(fc2_neurons)
self.fc3 = nn.Linear(fc2_neurons, 1)
我的损失如下。这是计算pos_weight
参数的正确方法吗?我查看了这个链接的正式文档,它表明,对于多类分类,pos_weight
需要每个类都有一个值。不确定二进制类是否是一个不同的场景。我试着输入两个值,但是我得到了一个错误。
My问题:对于二进制问题,是否是一个单独的值,而不像多类分类那样需要长度等于类数的列表/数组?
BCE_With_LogitsLoss=nn.BCEWithLogitsLoss(pos_weight=class_wts[0]/class_wts[1])
我的y变量是一个单一的变量,它有0或1来表示实际的类,并且神经网络输出一个值。
--------------------------------------------------Update 1
基于Shai的回答,我有以下问题:
BCEWithLogitsLoss
-如果这是一个多类问题,那么如何使用pos_weigh
参数?发布于 2022-03-16 01:17:32
pos_weight
的文档确实有点不清楚。对于BCEWithLogitsLoss
,pos_weight
应该是torch.tensor
of size=1:
BCE_With_LogitsLoss=nn.BCEWithLogitsLoss(pos_weight=torch.tensor([class_wts[0]/class_wts[1]]))
但是,在您的例子中,pos类只发生了2%的次数,我认为只设置pos_weight
是不够的。
请考虑使用焦损
宋伊琳,普里亚·戈亚尔,罗斯·格什克,何凯明,皮奥特·多尔拉尔·用于密集目标检测的焦距损失 (ICCV 2017)。
除了描述焦损外,本文还很好地解释了为什么CE损耗在不平衡情况下表现如此差。我强烈建议阅读这篇论文。
这里列出了其他替代方案。
https://stackoverflow.com/questions/71462326
复制