Pytorch ConvNet loss保持不变,只有一个class被预测
Pytorch ConvNet loss remains unchanged and only one class is predicted
我的 ConvNet 只预测一个 class 并且损失保持不变。
我试过以下方法:
- 添加了 class 与数据大小成比例的权重 (1-(class occurrences/total 数据))
- 调整学习率试图找到最佳点
- 调整后的伽玛(学习率衰减的乘数)
- 在损失函数中使用了gamma,在损失函数中没有使用(主要是一直在用Adam做实验)
- 尝试了比 'Simple' 当前使用的复杂得多的 ConvNet
我不确定从这里到哪里去。似乎无论我尝试什么,神经网络总是预测相同的 class(我已经能够通过不成比例地抛出权重来预测另一个 class)
下面是 运行 我的程序的输出。它应该包含所有相关信息,以便提出一些关于如何修复它的想法。如果您需要查看一些源代码或对数据集的外观感到好奇,请询问。
非常感谢任何帮助。我已经被这个问题难住了很长一段时间了。谢谢!
Train dataset length: 27569
Test dataset length: 4866
Image preprocessing:
None
Input dimensions: 28 X 28
Output dimension: 2
Model: Simple
NeuralNetwork(
(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: Adam
Learning rate: 0.0001
Loss function: CEL
class weights: tensor([0.3481, 0.6519], device='cuda:0')
Multiplicative factor of learning rate decay: 0.0005
Train Epoch: 1 [0/27569 (0%)] Loss: 3785.907959
Train Epoch: 1 [6400/27569 (23%)] Loss: 0.693147
Train Epoch: 1 [12800/27569 (46%)] Loss: 0.693147
Train Epoch: 1 [19200/27569 (70%)] Loss: 0.693147
Train Epoch: 1 [25600/27569 (93%)] Loss: 0.693147
Test set: Average loss: 0.0110, Accuracy: 3172/4866 (65%)
actual count: [3172, 1694]
predicted count: [4866, 0]
在最后一个 Linear
层(logits 的来源)之后有一个 ReLU
是非常罕见的。考虑删除它。
另外,可能你的学习率太高了。你可以试着稍微调整一下。检查迭代之间的损失是否平滑减少(这在大多数情况下是理想的),否则减少它
我的 ConvNet 只预测一个 class 并且损失保持不变。
我试过以下方法:
- 添加了 class 与数据大小成比例的权重 (1-(class occurrences/total 数据))
- 调整学习率试图找到最佳点
- 调整后的伽玛(学习率衰减的乘数)
- 在损失函数中使用了gamma,在损失函数中没有使用(主要是一直在用Adam做实验)
- 尝试了比 'Simple' 当前使用的复杂得多的 ConvNet
我不确定从这里到哪里去。似乎无论我尝试什么,神经网络总是预测相同的 class(我已经能够通过不成比例地抛出权重来预测另一个 class)
下面是 运行 我的程序的输出。它应该包含所有相关信息,以便提出一些关于如何修复它的想法。如果您需要查看一些源代码或对数据集的外观感到好奇,请询问。
非常感谢任何帮助。我已经被这个问题难住了很长一段时间了。谢谢!
Train dataset length: 27569
Test dataset length: 4866
Image preprocessing:
None
Input dimensions: 28 X 28
Output dimension: 2
Model: Simple
NeuralNetwork(
(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: Adam
Learning rate: 0.0001
Loss function: CEL
class weights: tensor([0.3481, 0.6519], device='cuda:0')
Multiplicative factor of learning rate decay: 0.0005
Train Epoch: 1 [0/27569 (0%)] Loss: 3785.907959
Train Epoch: 1 [6400/27569 (23%)] Loss: 0.693147
Train Epoch: 1 [12800/27569 (46%)] Loss: 0.693147
Train Epoch: 1 [19200/27569 (70%)] Loss: 0.693147
Train Epoch: 1 [25600/27569 (93%)] Loss: 0.693147
Test set: Average loss: 0.0110, Accuracy: 3172/4866 (65%)
actual count: [3172, 1694]
predicted count: [4866, 0]
在最后一个 Linear
层(logits 的来源)之后有一个 ReLU
是非常罕见的。考虑删除它。
另外,可能你的学习率太高了。你可以试着稍微调整一下。检查迭代之间的损失是否平滑减少(这在大多数情况下是理想的),否则减少它