python - 为什么使用 Resnet 的测试损失波动如此之大?
问题描述
我不是专家,但我已经阅读了几个关于类似问题的主题。好吧,让我解释一下我在做什么。
首先,我使用了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 行为的帖子后,我尝试了几件事并取得了任何成功
- 我用过 SGD、Adam (& SWATS)
- 我试过 lr = 0.1 到 lr= 1e-5
- 我修改了 BN 动量(默认 = 0.1):0.5 和 0.01;以及 eps 参数。
现在,我已经成功地使用经典 CNN 获得了不错的结果(即良好的训练和测试损失)(即没有任何批量标准化和捷径),但我想研究 Resnet 对抗对抗性攻击的行为。所以,我想让 Resnet 适合我的图像:slight_smile:
任何想法 ?谢谢
经过一些测试,我发现了一些东西:我使用了标准的 resnet20 (h=1)。然后,我使用与训练集相同的样本(100,000 张图像)作为测试集。但是,对于测试集 1)我不使用洗牌,2)我不做任何水平/垂直翻转或 Rot90deg、Rot180deg 或 Rot270deg。我观察到测试损失的同样波动。
此外,当我关闭完成训练集的转换并使用相同的训练集和测试集时,我得到了相同的行为:
最后,如果我关闭火车组的 suffling 和随机变换(翻转和旋转),并且我使用相同的集合进行测试,那么我得到:
似乎测试损失正在向一个值收敛,但与训练损失不同。为什么 ???
解决方案
推荐阅读
- php - OPCache 处理多个 apache
- sql-server - 在 SSRS 矩阵报告中添加 2 个计算字段时出现问题
- configuration - 在 ack 中,我可以定义一个受扩展名和第一行限制的类型(两个过滤器类型)吗?
- java - 使用 postgresql NOT IN 语句
- python - 有效地折叠 Parquet 中的行组
- python - 添加相似数组的值
- javascript - 如何为 Javascript 视频播放触发器添加延迟
- php - 无法在 Heroku 上移动上传的文件
- shell - 使文件和目录恢复生机
- java - 如何解决此代码中使用泛型的“方法不适用于参数”问题