python - Conv2d层中的filter参数是什么意思?
问题描述
我对过滤器参数感到困惑,它是 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 图像。
所以我的问题是,当我将卷积层定义为 时Conv2D(64, ...)
,这 64 是否意味着 64 种不同类型的过滤器,例如由 keras 随机选择的垂直边缘、水平边缘等?如果是这样,那么卷积层(具有 64 个滤波器和 5x5 内核和 1x1 步幅)在 32x32 1 通道图像上的输出是 64 个 28x28 大小的图像。这 64 幅图像如何组合成一个图像以供进一步的层使用?
解决方案
该filters
参数设置该层中卷积滤波器的数量。这些过滤器使用kernel_initializer
参数指定的方法初始化为小的随机值。在网络训练期间,过滤器以最小化损失的方式更新。因此,在训练过程中,过滤器将学习检测某些特征,如边缘和纹理,它们可能会变成如下图(来自此处)。
认识到一个人不会手工制作过滤器是非常重要的。这些是在训练过程中自动学习的——这就是深度学习的美妙之处。
我强烈建议您阅读一些深度学习资源,特别是https://cs231n.github.io/convolutional-networks/和https://www.youtube.com/watch?v=r5nXYc2wYvI&list=PLypiXJdtIca5sxV7aE3-PS9fYX3vUdIOX&index=3&t=3122s .
推荐阅读
- java - 在eclipse中运行tomcat失败
- java - 是否有任何配置可以将 jsonplugin 添加到 apama 项目
- socket.io - AdonisJS Socket.IO JWT 认证
- javascript - 是否可以在 NPM 中使用两个不同版本的库?
- c++ - 如何从 C++(非阻塞)启动 macos .app?
- rust - 如何为嵌入在实现特征 A 或 B 的结构中的类型定义方法?
- bash - 为“git submodule foreach”设置不同的外壳
- java - 使用字符串值作为另一个变量的名称
- javascript - 它不会移动到下一个图像
- opencart - 如何让亚马逊 AWS 凭证在亚马逊卖家中心注册应用程序?