趋近智
卷积神经网络 (neural network) (CNN)的构成主体是卷积层,它承担着在网格状数据中检测局部模式的主要部分。与全连接层不同,全连接层独立处理输入特征并丢失空间信息,而卷积层则在数据的空间背景下进行明确处理。针对二维数据(如图像),Conv2D 层是 Keras 中的主要实现方式。
想象一下在图像上滑动一个小型放大镜。这个放大镜不会一次性查看整个图像,而是集中于小区域,寻找边缘、角点或纹理等特定特征。卷积层以类似的方式,使用数字滤波器(也称为卷积核)进行运作。
Conv2D 层中的滤波器本质上是一个由可学习权重 (weight)构成的小型矩阵。在训练期间,这些滤波器会演变以识别特定模式。例如,一个滤波器可能学会检测垂直边缘,另一个检测水平边缘,还有一个检测特定的颜色或纹理块。
核心操作是将每个滤波器在输入体积的空间尺寸(高度和宽度)上进行滑动。在每个位置,滤波器会对其当前覆盖的输入补丁执行逐元素乘法,然后将结果求和。通常会将一个偏置 (bias)项加入到这个和中。这个过程本质上是滤波器权重 (weight)与输入补丁之间的点积,再加上一个偏置。
当滤波器在整个输入上滑动时,这个计算过程会重复进行,产生一个二维数组,称为特征图或激活图。
Conv2D 层通常使用多个滤波器,它会产生多个特征图,这些特征图堆叠在一起形成输出体积。此输出体积的深度等于所用滤波器的数量。考虑一个 滤波器在 输入上滑动的简化视图(假设单通道、步长为1、无填充):
滤波器(黄色)覆盖输入的补丁(蓝色)。计算得到输出特征图(绿色)中的一个值。然后滤波器滑动到下一个位置。
Conv2D 层当您向 Keras 模型添加 Conv2D 层时,需要指定几个重要参数 (parameter):
filters:这个整数决定了层将学习多少个滤波器。每个滤波器产生一个特征图,因此这定义了输出体积的深度。选择更多的滤波器使层能够学习更多样的模式,但会增加参数数量和计算成本。
# 示例:一个学习 32 种不同滤波器的层
layers.Conv2D(filters=32, ...)
kernel_size:这指定了滤波器的高度和宽度。它通常以包含两个整数的元组形式给出,例如 (3, 3) 或 (5, 5)。较小的卷积核捕捉更精细的局部细节,而较大的卷积核捕捉更宽泛的模式。(3, 3) 是一个常用起始点。
# 示例:使用 3x3 滤波器
layers.Conv2D(filters=32, kernel_size=(3, 3), ...)
strides:这个元组 (sh, sw) 控制滤波器在每一步水平 (sw) 和垂直 (sh) 移动多少像素。默认值是 (1, 1),表示滤波器每次移动一个像素。使用大于 1 的步长(例如 (2, 2))会导致滤波器跳过像素,产生更小的输出特征图(下采样)。这可以减少计算量,但可能导致信息丢失。
# 示例:滤波器水平和垂直移动 1 个像素
layers.Conv2D(..., strides=(1, 1), ...) # 默认
# 示例:滤波器水平和垂直移动 2 个像素(下采样)
layers.Conv2D(..., strides=(2, 2), ...)
padding:这决定了如何处理输入的边界。
'valid':不应用填充。滤波器只在其能完全重叠输入的地方滑动。这会导致输出特征图的空间尺寸随每层缩小,尤其是在步长为 1 的情况下。'same':填充(通常为零)会自动添加到输入周围,使得输出特征图与输入具有相同的高度和宽度(假设 strides=(1, 1))。这对于构建更深的神经网络 (neural network),同时避免过快丢失空间分辨率很有帮助。# 示例:输出尺寸缩小
layers.Conv2D(..., padding='valid', ...)
# 示例:输出高度/宽度与输入匹配(步长为 1 时)
layers.Conv2D(..., padding='same', ...)
activation:指定在卷积和偏置 (bias)添加后,逐元素应用于输出特征图的激活函数 (activation function)。ReLU ('relu') 是卷积层一个非常常见的选择,因为它高效且能够缓解梯度消失问题。
# 示例:使用 ReLU 激活
layers.Conv2D(..., activation='relu', ...)
input_shape:仅在 Sequential 模型中的第一层(或在函数式 API 中定义 Input 层时)需要。它指定了层预期输入的尺寸,不包括批量大小。对于典型的彩色图像数据集,这会是 (高度, 宽度, 通道数),例如灰度 MNIST 为 (28, 28, 1),彩色 CIFAR-10 为 (32, 32, 3)。
# 示例:用于 28x28 灰度图像的模型中的第一层
model = keras.Sequential([
layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu',
input_shape=(28, 28, 1)),
# ... 其他层
])
Conv2D 层以下是如何在 Keras 模型中定义用于处理 RGB 图像的第一层 Conv2D 层:
import keras
from keras import layers
# 定义输入形状(高度,宽度,通道数)
input_shape = (64, 64, 3)
# 开始构建一个 Sequential 模型
model = keras.Sequential(name="SimpleCNN")
# 添加第一个 Conv2D 层
model.add(layers.Conv2D(
filters=32, # 学习 32 种模式
kernel_size=(3, 3), # 使用 3x3 滤波器
activation='relu', # 应用 ReLU 激活
padding='same', # 保持输出尺寸与输入相同 (64x64)
input_shape=input_shape # 为第一层指定输入尺寸
))
# 通常在此之后会添加更多层
# model.add(layers.MaxPooling2D(pool_size=(2, 2)))
# model.add(layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'))
# ...
# 打印模型摘要以检查输出形状
model.summary()
这第一层接受一个 的输入,并产生一个 的输出体积(因为使用了 padding='same' 且 strides 默认为 (1, 1))。输出中 32 个通道中的每一个都对应于由所学习的滤波器之一生成的特征图。
卷积层在处理图像数据方面相比全连接层具有多项优势:
理解 Conv2D 层及其参数对构建高效的 CNN 极为重要。在接下来的章节中,我们将了解池化层,它们常常伴随卷积层,以及如何将这些组件组合成一个完整的 CNN 架构。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•