Conv2d层中的filter参数是什么意思?

What does the filter parameter mean in Conv2d layer?

我对过滤器参数感到困惑,它是 keras 中 Conv2D() 层函数中的第一个参数。据我了解,过滤器应该执行诸如边缘检测或锐化图像或模糊图像之类的操作,但是当我将模型定义为

input_shape = (32, 32, 3)
model = Sequential()
model.add( Conv2D(64, kernel_size=(5, 5), activation='relu', input_shape=input_shape, strides=(1,1), padding='same') )
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5, 5), activation='relu', input_shape=input_shape, strides=(1,1), padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Conv2D(128, kernel_size=(5, 5), activation='relu', input_shape=input_shape, strides=(1,1), padding='same'))
model.add(Flatten())
model.add(Dense(3072, activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

我没有提到 Conv2D 函数中任何地方的边缘检测或模糊或锐化。输入图像是 32 x 32 RGB 图像。

所以我的问题是,当我将Convolution层定义为Conv2D(64, ...)时,这个64是不是意味着keras随机选择的64种不同类型的过滤器,例如垂直边缘,水平边缘等?如果是这样,那么 32x32 1 通道图像上的卷积层(具有 64 个过滤器和 5x5 内核以及 1x1 步长)的输出是 64 个图像,每个图像大小为 28x28。这 64 张图像如何组合成一张图像用于更多层?

filters 参数设置该层中卷积滤波器的 数量。使用 kernel_initializer 参数指定的方法将这些过滤器初始化为较小的随机值。在网络训练期间,过滤器以最小化损失的方式更新。因此,在训练过程中,过滤器将学会检测某些特征,如边缘和纹理,它们可能会变成如下图所示(来自 here)。

认识到过滤器不是手工制作的这一点非常重要。这些是在训练过程中自动学习的——这就是深度学习的美妙之处。

我强烈建议阅读一些深度学习资源,尤其是 https://cs231n.github.io/convolutional-networks/ and https://www.youtube.com/watch?v=r5nXYc2wYvI&list=PLypiXJdtIca5sxV7aE3-PS9fYX3vUdIOX&index=3&t=3122s

只是想弄清楚输出形状是什么。

虽然 jakub 的回答很好,但我认为它没有解决问题的“单张图像用于更多层”部分。

我做了 model.summary() 以了解更多信息。

我发现从 Conv2D 返回的形状是 (None, img_width, img_height, num_filters)

因此,当您将 Conv2D 的输出传递给 MaxPooling 时,您传递的是那个形状,这意味着它基本上传递了每个完整的卷积图像。

其他层处理得很好。 MaxPooling2D(2,2) returns 形状相同但图像大小减半 (None, img_width / 2, img_height / 2, num_filters).

旁注:我希望滤镜被命名为 num_filters,因为滤镜似乎暗示您正在传递一个滤镜列表,用于对图像进行卷积处理。