原文:
towardsdatascience.com/convolutional-layer-building-block-of-cnns-501b5b643e7b
“www.flaticon.com/free-icons/neural-network” 标题:“神经网络图标”由 juicy_fish – Flaticon 创建。
计算机如何看图像
与我和你不同,计算机只使用二进制数工作。因此,它们无法看到并理解图像。然而,我们可以使用像素来表示图像。对于灰度图像,像素越小,颜色越暗。像素的值在 0(黑色)和 255(白色)之间,中间的数字是灰度的光谱。这个数值范围等于二进制的字节,即 ²⁸,这是大多数计算机的最小工作单位。
下面是一个我使用 Python 创建的示例图像及其相应的像素值:
一朵花状图像分解成像素的示例。由作者在 LaTeX 中生成的图表。
使用这个概念,我们可以开发出能够从这些像素中看到模式以对图像进行分类的算法。这正是卷积神经网络(CNN)所做的事情。_
大多数图像都不是灰度图像,并且有一些颜色。它们通常使用 RGB 来表示,其中我们有三条通道,分别是红色、绿色和蓝色。每种颜色都是一个二维像素网格,然后堆叠在一起。因此,图像输入是三维的。
生成图表的代码可在我的 GitHub 上找到:
Medium-Articles/Neural Networks/convolution_layers.py at main · egorhowell/Medium-Articles
什么是卷积?
概述
CNN 的关键部分是卷积操作。我有一篇完整的文章详细说明了卷积是如何工作的,但为了完整性,我将在这里快速回顾一下。如果你想要深入理解,我强烈推荐你查看之前的帖子:
卷积是我们混合两个函数的地方。
对于图像处理,一个函数是我们的输入图像,另一个是核(过滤器)。输入图像是一组或矩阵的像素值,而核是一个比输入图像小几个数量级的矩阵。
然后将核在输入图像上滑动,我们通过将每个像素值与核中的相应元素相乘并求和这些乘积来计算输出。然后通过核中的元素数量进行归一化,以确保图像不会变得更亮或更暗。
示例
在下面的图中,我们有一个对我们输入图像中间像素的此过程的视觉示例。
应用模糊效果的灰度图像的卷积示例。由作者创建的图表。
这里我们有一个输入灰度图像,它有5×5个像素,以及一个3×3的核,其中所有元素都是1,这导致了模糊效果(具体来说是 方框模糊)。
中间像素的输出计算如下:
[30*1 + 30*1 + 30*1] +
[30*1 + 70*1 + 30*1] +
[30*1 + 30*1 + 30*1]
= 30 + 30 + 30 + 30 + 70 + 30 + 30 + 30 + 30 = 310
pixel value = 310 / 9 ~ 34
通过滑动核并在每个像素处计算卷积来重复此过程。相应的输出被称为“特征图。”
下面是将上述核应用于图像的完整结果。
模糊图像的示例。由作者在 Python 中创建的图表。
核的类型
根据核的结构,它将对输入图像应用不同的效果。以下是常用核及其效果的图表:
核及其效果。由作者绘制的图表。
对于机器学习和计算机视觉,最有用的核之一是能够检测边缘的核。一个例子是Sobel 算子,它通过测量像素两侧的强度梯度来检测边缘。所以,如果我们测量的像素两侧的像素值有大的差异,那么很可能在那个像素周围有一个边缘。
Sobel 算子有两个核,一个用于垂直梯度,另一个用于水平梯度:
Sobel 算子。由作者在 LaTeX 中创建的方程。
如果你想了解更多关于 Sobel 算子的信息,我有一篇完整的文章:
卷积层
为什么?
你可能想知道为什么我们需要了解所有这些卷积垃圾。为什么我们不能使用一个 全连接神经网络 并将像素展平成单一维度?
它在著名的 MNIST 数据库 数据集上工作,但这些是28×28像素的小图像。高清(HD)图像有1280×720像素。这大约是1,000,000像素,也就是输入层中的1,000,000个神经元。更不用说隐藏层所需的数百万个权重,这使得全连接神经网络由于维度复杂性而不适合这些图像。
这就是我们要转向 CNN 并使用卷积操作以及部分连接层的原因。换句话说,不是所有输入神经元都会影响所有输出神经元。这大大降低了计算成本。
卷积层是如何工作的?
我们已经看到核(过滤器)是如何从图像中提取信息的。然而,如果我们允许机器甚至神经网络学习最佳的核来解析图像,会怎样呢?
核中的值可以是权重,我们可以将多个核卷积操作堆叠起来形成几个卷积层,类似于全连接神经网络中的隐藏层。然后,神经网络可以通过 反向传播 调整核内的这些权重,从而使网络找到最佳的核。
后续层的神经元仅与前一层的一小部分神经元连接,由核的大小定义。这允许前几层识别低级特征,并在网络传播过程中逐步建立复杂性。这种层次化学习使 CNN 特别适用于计算机视觉。
下面的图展示了这个过程和卷积层:
卷积层的示例。图由作者绘制。
在 RGB 彩色图像的情况下,我们需要为每个通道应用一个单独的核。所以,在 RGB 的情况下,每个红色、绿色和蓝色的二维输入都会有三个核。
填充 & 步长
为了使卷积层与前一层的尺寸相同,我们应用一种称为 零填充 的方法。以下是一些图像的此过程示例:
零填充示例。图由作者绘制。
填充保持维度不变,并增加了边缘像素的采样。如果我们不对输入图像进行填充,那么边缘像素将只被核计算一次,导致丢失像素和信息。
通常,输出维度定义为:
输出维度。作者在 LaTeX 中的方程。
-
H_in 和* W_in_ 是原始输入图像的高度和宽度。
-
H_filter 和* W_filter_ 是核或滤波器的高度和宽度。
-
Padding_height 和* Padding_width_ 是应用于输入图像高度和宽度的填充量。
-
Stride_height 和Stride_width_ 是核沿输入图像高度和宽度的步长。
步长是指我们在输入图像上滑动核的像素数。通过增加步长,我们可以减少计算成本,但也会增加丢失输入信息的机会。
步长为 1 的示例。图由作者绘制。
多个核
在实践中,每个卷积层将会有多个核,并为每个核输出一个特征图。例如,如果一个卷积层有 32 个核,输出体积的深度将为 32,每个切片对应于每个核产生的特征图。这允许 CNN 学习不同的方面,因为每个核学会识别输入的不同特征。
在 RGB 图像的情况下,由于每个通道有 32 个特征图,输出将会有 96 个特征图深。维度还可以更大。卫星图像有额外的频率,例如红外线。
理论与数学
每层的神经元值是:
CNN 中神经元的方程。作者在 LaTeX 中的方程。
-
{i,j,l}是神经元的三个坐标,其中l是通道数。对于 RGB 来说,这将是一个三。
-
**Input_{i,*j,l}**是图像在位置{i,j,l}*处的值。
-
Kernel_{i,_j,l}_ 是核(或滤波器)在位置*{i,*j,l}*处的值。
-
**Output_*{k}*是第k个核的输出特征图。
-
**Bias_*{k}*是与第k个核相关的单个标量值。这与全连接神经网络中的概念相同。
-
**∑_{i,*j,l}**是输入和核值在所有位置{i,*j,l}*上的乘积之和。
-
f 是激活函数,通常是应用于总和值的***ReLU***函数。激活函数用于将非线性引入 CNN。请参阅以下我之前的文章,了解为什么这很重要:
PyTorch 示例
下面是一个如何在 PyTorch 中实现两个卷积层的示例:
import torch
import torch.nn as nn
import torch.nn.functional as F
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
# Convolutional layer 1: 1 input channel, 5 kernels/filters, kernel size 3x3
self.conv1 = nn.Conv2d(1, 5, 3)
# Convolutional layer 2: 5 input channels, 10 kernels/filters, kernel size 3x3
self.conv2 = nn.Conv2d(5, 10, 3)
# An example of a fully connected layer after the convolutional layers
# This example assumes an input image size of 32x32
self.fc1 = nn.Linear(10 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 2) # Assuming binary classification
摘要 & 进一步思考
卷积层通过将核应用于某些输入图像的输出堆叠来工作。这些核可以识别边缘等事物,但选择最佳核的任务则由 CNN 来学习。堆叠允许我们在每一层学习图像的更复杂特征,这些特征随后将被传递到一个常规的全连接神经网络中。
另一件事!
我提供 1:1 的辅导通话,我们可以讨论你需要的一切——无论是项目、职业建议,还是只是确定你的下一步。我在这里帮助你前进!
[1:1 与 Egor Howell 的辅导通话]
职业指导、工作建议、项目帮助、简历审查topmate.io](https://topmate.io/egorhowell/1203300)
卷积层原理与PyTorch实现
11万+

被折叠的 条评论
为什么被折叠?



