首页 > 解决方案 > 为什么使用 Resnet 的测试损失波动如此之大?

问题描述

这是随着 epoch 增加而训练/测试损失行为的典型图。
在此处输入图像描述

我不是专家,但我已经阅读了几个关于类似问题的主题。好吧,让我解释一下我在做什么。

首先,我使用了https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py给出的实现 resnet18 和 resnet50,以及https://github.com/akamaster/pytorch_resnet_cifar10给出的实现resnet32,resnet56。对于所有这些网络,我得到了相同的测试损失等级行为。

其次,我的输入是 5x64x64 的图像,所以我调整了第一个卷积层,最后一个全连接的输出由 180 个神经元组成。我在训练中使用了 64、128、256 批大小,在测试中使用了 128:相同的行为仍然存在。我还在输入训练中使用了 300k 或 100k 图像(测试为 100k):同样的行为也持续存在。这些图像不是“标准”RGB照片:首先,您可能已经说过,有5个通道,其次像素值可以是负数(例如,跨越范围(-0.01, 500))

第三,我知道训练阶段的 model.train() 语句,以及测试阶段的 model.eval() 语句(加上 with torch.no_grad():)。很明显,如果我在测试阶段不使用 model.eval() ,测试损失会随着训练损失而缓慢下降。但是,这是不允许的,不是吗?

在阅读有关 Batch Norm 行为的帖子后,我尝试了几件事并取得了任何成功

现在,我已经成功地使用经典 CNN 获得了不错的结果(即良好的训练和测试损失)(即没有任何批量标准化和捷径),但我想研究 Resnet 对抗对抗性攻击的行为。所以,我想让 Resnet 适合我的图像:slight_smile:

任何想法 ?谢谢

经过一些测试,我发现了一些东西:我使用了标准的 resnet20 (h=1)。然后,我使用与训练集相同的样​​本(100,000 张图像)作为测试集。但是,对于测试集 1)我不使用洗牌,2)我不做任何水平/垂直翻转或 Rot90deg、Rot180deg 或 Rot270deg。我观察到测试损失的同样波动在此处输入图像描述

此外,当我关闭完成训练集的转换并使用相同的训练集和测试集时,我得到了相同的行为: 在此处输入图像描述

最后,如果我关闭火车组的 suffling 和随机变换(翻转和旋转),并且我使用相同的集合进行测试,那么我得到: 在此处输入图像描述

似乎测试损失正在向一个值收敛,但与训练损失不同。为什么 ???

标签: pythondeep-learningpytorchresnet

解决方案


推荐阅读