我有一个由三部分组成的图像数据集-训练,验证和测试部分,并希望规范化数据集以使训练更容易。因此,我想从可用数据中找到RGB值的平均值和标准差。
我的疑问是——我应该考虑将所有的分割归一化吗?
我个人的想法是,只有训练分割应该被使用,因为它被认为是我们训练模型的唯一数据。因此,从训练数据的分布中为模型提供输入,留下可以通过对验证分割进行评估来挑选的错误。如果我从训练数据之外的数据向网络提供分布,它会不会给网络提供比它应该学习的更多的信息?
其他方法也会有帮助。例如,使用RGB标准值是否更好?
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
(来源:Pytorch Torchvision Transforms)
我的疑问是-我应该考虑所有的分割规范化吗?
正如你所说的,理论上你应该只把训练数据用于任何事情,甚至是规范化。
任何其他方法也会有所帮助。例如,使用RGB标准值是否更好?
实际上,可能是的。事实上,如何规范化数据并不重要,你甚至可以让每个通道的均值=0.5,std=0.5。或者甚至采用-127/+127范围,网络应该适应你在训练期间提供的任何输入。
你可能应该记住的是实际使用和应用:如果你正在处理预训练的网络,它们通常提供ImageNet规范化(你建议的那个)。这是常见的做法,因为:
- 它们被广泛使用
- 它们确实是"真实"的很好近似。RGB的含义和标准是自然图像。
TLDR:定制或"标准"的选择规范化取决于任务本身。在实践中,规范化应该不太重要,在这两种情况下都应该没问题。你有一个合适大小的集合和时间来计算一些统计数据?选择自定义值。没有太多时间进行统计或者数据集很小?也许最好使用安全的ImageNet方法。
应该只使用训练分割,因为它被认为是我们训练模型的唯一数据
正确的。不要忘记使用训练集的均值和方差来扩展验证和测试集,而不是使用它们自己的均值和方差。否则将引入域移位。
使用RGB标准值是否更好
结果可能会稍好或稍差,但如果其他一切(学习率,权重初始化)都是最优的,则可能不会有太大差异。