最近在尝试用CrossEntropyLoss(),实现猫狗图像分类的功能。遇到了一个奇怪的问题:loss一直停留在0.69附近,我查了查loss函数的公式,公式如下:
网络预测给出的二类概率向量为[0.5,0.5],也就是a和1-a都是0.5,不管y取值0/1,整个的平均loss就是-ln(0.5)=0.69,这样网络根本没有学习到东西。
我用的模型是resnet18,后来尝试使用预训练模型发现loss可以收敛,但是不用预训练模型就拉跨了。
在网上查找了很多解决方案,放在我的模型里都没有起作用。直到我发现了这篇文章:
神经网络训练常见坑 - 知乎 (zhihu.com)
13. 你是否应用了过量的数据增强?
数据增强有正则化效果。过量的数据增强,加上其它形式的正则化(权重 L2,dropout操作,等等)可能会导致网络欠拟合。
突然想到我是不是用的数据增强不对,或者对于我的模型来说不适用。于是我把增强的代码注释了
transform = transforms.Compose([
transforms.Resize((128, 128)),
# transforms.RandomVerticalFlip(),
# transforms.RandomCrop(50),
# transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
然后就可以收敛了:
看来图像增强不能乱用,用的不好还能起负作用。