卷积神经网络之卷积核为啥能够识别图像特征?

先梳理下整个卷积神经网络工作主要过程

卷积神经网络(Convolutional Neural Network,简称 CNN)是一种深度学习模型,尤其擅长处理图像数据。CNN 通过多层结构逐步提取图片的特征。以下是 CNN 提取图片特征的主要过程:

1.卷积层(Convolutional Layer):

  • 滤波器(Filters):卷积层的核心组件是滤波器(也称为卷积核,Kernel)。滤波器是一个小矩阵,它在图像上滑动(进行卷积操作),用来检测特定的特征(如边缘、纹理等)。
  • 卷积操作:滤波器在图像上滑动,每次滑动时滤波器矩阵与图像的对应部分进行元素级别的乘积并求和,生成一个单一值。这个过程在图像的每个位置重复,生成一个特征图(Feature Map)。
  • 多通道:通常会使用多个不同的滤波器,因此在每个卷积层中会生成多个特征图,捕捉图像中的不同特征。

2.激活函数(Activation Function):

  • 常用的激活函数是 ReLU(Rectified Linear Unit)。ReLU 会将输入中的所有负值变为零,保持正值不变。这样可以引入非线性,使网络能够学习更复杂的特征。

3.池化层(Pooling Layer):

  • 最大池化(Max Pooling):这是最常见的池化操作。它通过取局部区域(通常是 2x2 或 3x3 矩阵)内的最大值来下采样特征图。这减少了特征图的尺寸,同时保留了最重要的特征。
  • 平均池化(Average Pooling):取局部区域内的平均值,下采样特征图。虽然不如最大池化常用,但在某些情况下也会使用。

4.全连接层(Fully Connected Layer):

  • 在经过若干次卷积和池化操作后,特征图被展平成一个向量,输入到全连接层。全连接层与传统的神经网络类似,每个神经元与上一层的所有神经元相连,用于组合提取到的特征并进行最终分类。

5.输出层(Output Layer):

  • 最后一层通常是一个 Softmax 层(用于分类任务),输出每个类别的概率。

通过这些步骤,CNN 能够逐层提取图片的低级和高级特征,从边缘和纹理,到更复杂的结构和对象。每一层都在前一层的基础上提取更抽象的特征,从而实现对图像的理解和分类。

进入正题,卷积核如何提取到特征的?

假设我们有一个简单的 5x5 的灰度图像(灰度图像的每个像素值是一个单一的数值,表示亮度),以及一个 3x3 的卷积核。我们来看看卷积操作是如何进行的。

原始图像(5x5):

1 2 3 0 1
4 5 6 1 2
7 8 9 2 3
1 0 1 3 4
2 1 0 4 5

卷积核(3x3):

1 0 -1
1 0 -1
1 0 -1

这个卷积核可以用来检测垂直边缘。

卷积操作步骤:

1.将卷积核放在图像的左上角,并计算覆盖区域的点积:

  • 覆盖区域(图像的左上角 3x3 部分):

    1 2 3
    4 5 6
    7 8 9

  • 计算点积:

scss 复制代码
(1*1 + 2*0 + 3*(-1)) + (4*1 + 5*0 + 6*(-1)) + (7*1 + 8*0 + 9*(-1))
= (1 + 0 - 3) + (4 + 0 - 6) + (7 + 0 - 9)
= -2 + -2 + -2
= -6

这样,卷积核在图像左上角的卷积结果是 -6。

2.将卷积核向右移动一格,并重复计算:

  • 覆盖区域:

    2 3 0
    5 6 1
    8 9 2

  • 计算点积:

scss 复制代码
(2*1 + 3*0 + 0*(-1)) + (5*1 + 6*0 + 1*(-1)) + (8*1 + 9*0 + 2*(-1))
= (2 + 0 - 0) + (5 + 0 - 1) + (8 + 0 - 2)
= 2 + 4 + 6
= 12

所以在这个位置的卷积结果是 12。

3.继续滑动卷积核,直到覆盖整个图像:

通过这种方式,我们可以计算出整个特征图(Feature Map)。假设步长为 1,并且没有使用填充(Padding),则特征图的尺寸将会是 (5-3+1) x (5-3+1) = 3x3。

最终的特征图(3x3):

diff 复制代码
-6  12  1
-6  12  1
-6  12  1

解释:

  • 卷积核在图像上滑动时,每次计算的点积都反映了卷积核与图像局部区域的匹配程度。在这个例子中,卷积核检测的是垂直边缘。
  • 负值(-6)表示图像局部区域中的某些像素值与卷积核的负值部分匹配较好(例如,左侧的高亮像素和右侧的暗像素)。
  • 正值(12)表示图像局部区域中的某些像素值与卷积核的正值部分匹配较好(例如,右侧的高亮像素和左侧的暗像素)。

为什么这个卷积核就能用来检测垂直边缘?

1  0 -1
1  0 -1
1  0 -1

垂直边缘检测的原理:

1.卷积核的结构:

  • 左侧的列全是正值(1),右侧的列全是负值(-1),中间的列是零(0)。

2.计算卷积时的效果:

  • 当这个卷积核覆盖在图像的某个局部区域时,它会对该区域的像素进行加权求和。
  • 左侧的像素值会被乘以正值(1),右侧的像素值会被乘以负值(-1),中间的像素值对结果没有贡献(因为乘以0)。

3.边缘检测的逻辑:

  • 如果图像的某个局部区域存在垂直边缘,那么左侧和右侧的像素值将有显著差异。例如,左侧可能是高亮(大像素值),而右侧是暗(小像素值),或反之。
  • 在这种情况下,卷积操作的结果将是一个较大的正值或负值,因为左侧和右侧的像素差异显著。
  • 如果某个局部区域没有垂直边缘(即左右侧的像素值变化不大),那么卷积操作的结果将接近零,因为正负部分的加权和会相互抵消。

总结

以上例子只是一个简单的识别垂直边缘特征,但是通过这个例子,我们知道了提取图像的特征的关键是卷积核,构造不同的卷积核可以识别不同的图像特征。

相关推荐
hn小菜鸡1 小时前
LeetCode 2058.找出临界点之间的最小和最大距离
算法·leetcode·职场和发展
liuyang-neu1 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
IronmanJay1 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组
OT.Ter1 小时前
【力扣打卡系列】二分查找(搜索旋转排序数组)
算法·leetcode·职场和发展·go·二分查找
J_z_Yang1 小时前
LeetCode 202 - 快乐数
c++·算法·leetcode
pengpeng021 小时前
力扣每日一题 685. 冗余连接 II
算法·leetcode
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
Iareges3 小时前
美团2025校招 广告算法工程师 面经
算法·面试·求职招聘·笔试·秋招
堇舟4 小时前
斯皮尔曼相关(Spearman correlation)系数
人工智能·算法·机器学习
西几5 小时前
代码训练营 day48|LeetCode 300,LeetCode 674,LeetCode 718
c++·算法·leetcode