我试图理解用于计算机视觉的卷积网络中过滤器的概念。我了解它们的作用,例如,它们可用于减少输入图像的尺寸,等等。 我被困的是这些过滤器来自哪里?
例如,我正在观看一个教程,该教程表明要检测垂直线/边缘,我们可以使用形状为model.add(Conv2D(64, (3, 3), padding='same', input_shape=x_train.shape[1:]))
的3x3滤镜...我们如何得出这个矩阵?
即使使用Keras,我也只需传递要使用的过滤器数量
function doit(arr, obj, start){
if (Array.isArray(obj)) {
asdf.map((i, idx) => doit(arr, i, start + `${idx}.`))
} else if (typeof obj == 'object') {
Object.keys(obj).map(k => {
arr.push(start + `${k}`)
doit(arr, obj[k], start + `${k}.`)
})
}
}
其中64是我要应用于输入的过滤器的数量...但是Keras或任何其他库如何确定过滤器矩阵将容纳的数量?我很困惑。
假设您有1000个图像的输入空间,每个36x36x3,其中3是通道(一个用于R,G和B)...这意味着我们有3个矩阵代表每个图像...总共将是1000 x 3 = 3000矩阵。
现在,如果我想检测整个图像的边缘,那么我所说的边缘就是要检测图像是笔记本电脑还是手机的物体轮廓,那么在conv网络中这实际上是如何发生的?寻找边缘的概念仅仅是抽象的,所有寻找边缘的意思是在您要评估的矩阵中相似位置处的相似数字/激活数,以及在输入空间中标记的那些数字/活动吗?
因此,总而言之,任何机器学习库如何决定初始化这些过滤器?对于我们的示例,我想应用18x18x3滤镜,这些滤镜矩阵将是什么样?如何在初始层中应用它们,以及如何在深层网络中使用它们时填充它们?
有人可以帮助我理解吗?
谢谢。
答案 0 :(得分:1)
简而言之,过滤器是随机初始化的。然后在带标签的大量图像上训练卷积网络。
在训练过程中,特征提取部分(转换滤波器)和分类部分(通常是密集层,在转换滤波器之后找到)协同工作,以在图像上产生最佳分类结果。错误的分类结果会导致特征提取部分中的过滤器权重以特定方式改变(反向传播)。此过程重复了很多次,之后最终“选择”了导致最佳分类性能的过滤器作为最终模型的一部分。
边缘对于图像分类非常重要,因此,如果模型想要正确地对图像进行分类,模型会尽早“学习”以识别边缘。因此,尽管该过程看似随机,但CNN滤镜通常会在较早的图层中识别边缘和颜色,因为它们会导致最佳分类。
在更深层次中,滤镜从这些简单的边缘和颜色中学习更多复杂的对象。通常,这就是CNN和ANN进行的“分布式学习”的功能,简单功能的学习功能可以创建更复杂的功能。