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

9

我对keras中Conv2D()层函数的第一个参数filter产生了困惑。据我理解,filter应该能够进行边缘检测、图像锐化或图像模糊等操作,在定义模型时,我却遇到了问题。

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函数中,我没有提到边缘检测、模糊或锐化。输入图像是32x32的RGB图像。

我的问题是,当我将卷积层定义为Conv2D(64, ...)时,这个64是否表示64种不同类型的过滤器,如垂直边缘、水平边缘等,这些过滤器由keras随机选择?如果是这样的话,那么对于一个32x32的单通道图像,在64个过滤器和5x5内核以及1x1步幅下,卷积层的输出是64个28x28大小的图像。这64个图像如何组合成一个单一的图像用于后续的层?

2个回答

12
< p > filters 参数设置该层中的卷积过滤器的数量。这些过滤器使用由 kernel_initializer 参数指定的方法初始化为小的随机值。在网络训练期间,过滤器以最小化损失的方式进行更新。因此,在训练过程中,过滤器将学习检测某些特征,如边缘和纹理,并且它们可能会变成类似于下面的图像(来自here)。< / p >

A set of CNN filters

非常重要的一点是,人们不需要手工制作过滤器。这些都是在训练过程中自动学习的 - 这就是深度学习的美妙之处。

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


2

我想澄清一下输出形状是什么。

虽然Jakub的回答很好,但我认为它没有解决问题中“进一步图层的单个图像”部分。

我使用model.summary()来了解更多信息。

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

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

其他图层会优雅地处理这个问题。MaxPooling2D(2,2)返回相同的形状,但图像大小缩小了一半(None, img_width / 2, img_height / 2, num_filters)。

副笔:我希望num_filters被命名为num_filters,因为filters似乎暗示您正在传递要用于卷积图像的过滤器列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接