EDIT1:我的代码与此处https://github.com/tensorflow/models/blob/master/inception/inception相同。唯一的区别是我将我的文件打包到TFRecords并以明智的方式提供它。此外,0级:1级的比例是70:30。
我目前正在开展一个项目,我正在使用初始-V3 CNN模型来训练分类器。目前,我正在研究一个二元分类器(预测1或0)但是,我的模型只预测0级的所有内容。在排除故障时,我发现0级的预测概率始终为100%。我已经验证了从输入排队系统到评估和测试的所有内容,一切似乎都运行良好。
奇怪的是,损失值以完美的半抛物线方式减少,这使我认为损失已经收敛到局部最小值。在测试脚本时,每次只生成0级(概率为100%)。我注意到的另一件事是各种Conv层的激活总是不变的,这可能意味着神经元根本就不会发射。我的问题是, 我的模特有效吗?损失似乎趋同,但各层的激活似乎停滞不前。 2.我正在使用张量流(https://github.com/tensorflow/models/blob/master/inception/inception/inception_train.py)
的模型部分提供的训练代码我正在重用火车,评估和支持代码来训练我的模型,使用我创建的自定义输入管道(这也是有效的)。有人可以帮我指导正确的方向吗?
感谢。
答案 0 :(得分:0)
Ik我回答这个问题有点晚了
首先,你的模型根本没有学到任何东西。所有这些(巧妙地)都是为所有情况预测0级,这样它就可以毫不费力地达到70%的基线准确度。 (可能模型很懒)JK。这是机器学习中一个众所周知的问题。这被称为类不平衡问题。请参阅此http://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/。
除了那里提到的技术。创造奇迹的一种技术是使用类权重。也就是说,基本上告诉网络偏向弱势阶层。在你的情况下,类权重将是class0:class1 = 3:7。这也是一个超参数!但这是一个很好的开始。
此外,您没有提供有关数据集大小的任何信息。无论您是从头开始进行微调还是培训。没有他们,很难推测。默认情况下,我建议进行微调。
此外,损失是指培训损失或验证损失?因为训练损失实际上没有关于模型性能的信息。此外,在我看来,培训损失和验证损失几乎没有信息来获得有关模型性能的有意义的见解。使用其他指标,如混淆矩阵,f1分数,召回,精确度等。
最后,你的问题绝对没有单一答案。唯一的方法是艰难的方式 - 你将学习模型。因为我认为训练NN特别是CNN是一门艺术。其中,直觉起着至关重要的作用,大多数时候,最不期望的变化会产生最好的结果。无论如何,这是训练NN的有趣部分。
快乐训练
P.S:尝试使用像gradcam这样的可视化工具来了解模型是否正在查看图像的正确部分以进行分类。这非常重要!