我的ConvNet只预测单一类别,且损失保持不变。
我尝试了以下方法:
- 添加类别权重,使其与数据大小成比例(1 -(类别出现次数/总数据))
- 调整学习率,试图找到一个最佳点
- 调整gamma(学习率衰减的乘法因子)
- 在损失函数中使用gamma,以及在损失函数中不使用gamma(主要一直在尝试Adam)
- 尝试使用比目前使用的“简单”ConvNet更为复杂的ConvNet
我不知道接下来该怎么做。似乎无论我尝试什么,神经网络总是预测同一个类别(通过极度失衡的权重,我能够让它预测另一个类别)
以下是我运行程序的输出。其中应该包含所有相关信息,可以用来提出一些修复建议。如果您需要查看一些源代码或对数据集的外观感到好奇,请随时提出要求。
任何帮助都将不胜感激。我在这个问题上已经困惑了很长时间。谢谢!
Train dataset length: 27569Test dataset length: 4866Image preprocessing: NoneInput dimensions: 28 X 28Output dimension: 2Model: SimpleNeuralNetwork( (flatten): Flatten(start_dim=1, end_dim=-1) (linear_relu_stack): Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() (2): Linear(in_features=512, out_features=512, bias=True) (3): ReLU() (4): Linear(in_features=512, out_features=2, bias=True) (5): ReLU() ))Optimizer: AdamLearning rate: 0.0001Loss function: CELclass weights: tensor([0.3481, 0.6519], device='cuda:0')Multiplicative factor of learning rate decay: 0.0005Train Epoch: 1 [0/27569 (0%)] Loss: 3785.907959Train Epoch: 1 [6400/27569 (23%)] Loss: 0.693147Train Epoch: 1 [12800/27569 (46%)] Loss: 0.693147Train Epoch: 1 [19200/27569 (70%)] Loss: 0.693147Train Epoch: 1 [25600/27569 (93%)] Loss: 0.693147Test set: Average loss: 0.0110, Accuracy: 3172/4866 (65%)actual count: [3172, 1694]predicted count: [4866, 0]
回答:
在最后一个Linear
层(即logits来源处)之后使用ReLU
是非常不常见的。考虑将其移除。
此外,您的学习率可能过高。可以尝试稍作调整。检查损失是否在迭代之间平滑下降(在大多数情况下这是理想的),否则请降低学习率。