在构建深度学习模型时,面临一个挑战:如何预测那些可能未曾预料到的情况。这似乎是一个矛盾:需要构建能够预测可能未曾预料到的世界的模型。但这就是防止过拟合的核心问题。无意中构建的模型往往最适合预测训练数据,而不是真实世界(或测试集)。因此,有意识地引入噪声是帮助让模型负责的一种方式。希望模型学习训练数据的模式,而不是记忆。这种差异很微妙。但模型(包括卷积神经网络)在推理能力上比人类要脆弱得多,因此数据中的简单扰动可能会产生严重的意外后果。
什么是噪声?为什么关心它?
噪声是有意识地改变像素,使其与它们可能应该代表的内容不同。老式电影以有黑色和白色像素斑点而闻名,这些斑点不应该出现。这就是噪声!灰色屏幕上的白色斑点。噪声是一种不完美,对机器的理解尤其令人沮丧,而人类可以轻易地忽略噪声(或将其适应适当的上下文),算法却难以应对。这就是所谓的对抗性攻击的根源,其中微小的、人类难以察觉的像素变化可以显著改变神经网络进行准确预测的能力。
ASU研究
亚利桑那州立大学的研究人员考虑了各种图像不完美对分类模型的影响。在测试的方法中,模糊和噪声对top-1和top-5准确分类的影响最大。其他不完美,如JPEG压缩和对比度,只有在显著增加时才会受到影响,而噪声和高斯模糊在测试模型(VGG16、GoogleNet、VGG-CNN-S、Caffe Reference)上显示出了近乎立即的平滑效果。
噪声用例
那么什么时候应该制造噪声呢?噪声可以是一种预处理技术——在模型学习和进行推断之前应用于所有图像——或者是一种增强技术,只应用于训练集中的图像以实现战略性变化。在大多数情况下,噪声最适合用于增强:寻求增加一些图像的可变性,以训练为目的,以减轻对抗性攻击和避免过拟合,但不希望在验证和测试集中引入噪声。
实现噪声
在处理信号时,可以添加多种类型的噪声。例如,白噪声是均匀添加的一致水平的噪声。对于图像处理,经常创建椒盐噪声——即随机地将一些像素完全变为白色或完全变为黑色。在某些情况下,可能只添加斑点噪声(均匀添加),只添加白色像素(盐),或只添加黑色像素(胡椒)。
# 使用scikit-image库实现噪声添加
import numpy as np
from skimage import util
from skimage import io
# 读取图像
image = io.imread('path_to_image.jpg')
# 添加椒盐噪声
noisy_image = util.random_noise(image, mode='salt', amount=0.05)
io.imsave('noisy_image.jpg', (noisy_image * 255).astype(np.uint8))
Scikit-image确实有许多形式的噪声实现。最佳实践是变化给定图像接收的噪声量,以便不是所有图像都提供相同量的噪声。通常,添加到图像的噪声量由要替换的像素数的比例决定。(默认值通常是5%)。
Roboflow支持
Roboflow也支持向图像添加噪声。用户指定任何给定图像可以被噪声替换的最大像素数(比如说,n)。然后,数据集中的每个图像都有从零到n的噪声量被添加,从均匀分布中采样。
使用滑块随机更改图像噪声。Roboflow还记录了每个图像是如何变化的,以便可以轻松地看到哪个噪声水平可能是最有问题的。