卷积层 - CNN 的构建块

卷积层原理与PyTorch实现
部署运行你感兴趣的模型镜像

原文:towardsdatascience.com/convolutional-layer-building-block-of-cnns-501b5b643e7b

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5a32083e93ccb51a9383485ad81180aa.png

www.flaticon.com/free-icons/neural-network” 标题:“神经网络图标”由 juicy_fish – Flaticon 创建。

计算机如何看图像

与我和你不同,计算机只使用二进制数工作。因此,它们无法看到并理解图像。然而,我们可以使用像素来表示图像。对于灰度图像,像素越小,颜色越暗。像素的值在 0(黑色)和 255(白色)之间,中间的数字是灰度的光谱。这个数值范围等于二进制的字节,即 ²⁸,这是大多数计算机的最小工作单位。

下面是一个我使用 Python 创建的示例图像及其相应的像素值:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9abc715a6ee00a12a8a09c91aeb50599.png

一朵花状图像分解成像素的示例。由作者在 LaTeX 中生成的图表。

使用这个概念,我们可以开发出能够从这些像素中看到模式以对图像进行分类的算法。这正是卷积神经网络(CNN)所做的事情。_

大多数图像都不是灰度图像,并且有一些颜色。它们通常使用 RGB 来表示,其中我们有三条通道,分别是红色、绿色和蓝色。每种颜色都是一个二维像素网格,然后堆叠在一起。因此,图像输入是三维的。

生成图表的代码可在我的 GitHub 上找到:

Medium-Articles/Neural Networks/convolution_layers.py at main · egorhowell/Medium-Articles


什么是卷积?

概述

CNN 的关键部分是卷积操作。我有一篇完整的文章详细说明了卷积是如何工作的,但为了完整性,我将在这里快速回顾一下。如果你想要深入理解,我强烈推荐你查看之前的帖子:

卷积解释 – 卷积神经网络简介

卷积是我们混合两个函数的地方。

对于图像处理,一个函数是我们的输入图像,另一个是核(过滤器)。输入图像是一组或矩阵的像素值,而核是一个比输入图像小几个数量级的矩阵。

然后将核在输入图像上滑动,我们通过将每个像素值与核中的相应元素相乘并求和这些乘积来计算输出。然后通过核中的元素数量进行归一化,以确保图像不会变得更亮或更暗。

示例

在下面的图中,我们有一个对我们输入图像中间像素的此过程的视觉示例。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/88035d3387b392f14755e0d033937ca3.png

应用模糊效果的灰度图像的卷积示例。由作者创建的图表。

这里我们有一个输入灰度图像,它有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

通过滑动核并在每个像素处计算卷积来重复此过程。相应的输出被称为“特征图。”

下面是将上述核应用于图像的完整结果。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/52d6debc8c537fce6f8853e5552d3b6a.png

模糊图像的示例。由作者在 Python 中创建的图表。

核的类型

根据核的结构,它将对输入图像应用不同的效果。以下是常用核及其效果的图表:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8ef04478e8b81ad1c2266608524d8eba.png

核及其效果。由作者绘制的图表。

对于机器学习和计算机视觉,最有用的核之一是能够检测边缘的核。一个例子是Sobel 算子,它通过测量像素两侧的强度梯度来检测边缘。所以,如果我们测量的像素两侧的像素值有大的差异,那么很可能在那个像素周围有一个边缘。

Sobel 算子有两个核,一个用于垂直梯度,另一个用于水平梯度:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7d79e4a3bed8056af63ff5d0e5ab2ab7.png

Sobel 算子。由作者在 LaTeX 中创建的方程。

如果你想了解更多关于 Sobel 算子的信息,我有一篇完整的文章:

图像处理中的 Sobel 算子

卷积层

为什么?

你可能想知道为什么我们需要了解所有这些卷积垃圾。为什么我们不能使用一个 全连接神经网络 并将像素展平成单一维度?

它在著名的 MNIST 数据库 数据集上工作,但这些是28×28像素的小图像。高清(HD)图像有1280×720像素。这大约是1,000,000像素,也就是输入层中的1,000,000个神经元。更不用说隐藏层所需的数百万个权重,这使得全连接神经网络由于维度复杂性而不适合这些图像。

这就是我们要转向 CNN 并使用卷积操作以及部分连接层的原因。换句话说,不是所有输入神经元都会影响所有输出神经元。这大大降低了计算成本。

卷积层是如何工作的?

我们已经看到核(过滤器)是如何从图像中提取信息的。然而,如果我们允许机器甚至神经网络学习最佳的核来解析图像,会怎样呢?

核中的值可以是权重,我们可以将多个核卷积操作堆叠起来形成几个卷积层,类似于全连接神经网络中的隐藏层。然后,神经网络可以通过 反向传播 调整核内的这些权重,从而使网络找到最佳的核。

后续层的神经元仅与前一层的一小部分神经元连接,由核的大小定义。这允许前几层识别低级特征,并在网络传播过程中逐步建立复杂性。这种层次化学习使 CNN 特别适用于计算机视觉。

下面的图展示了这个过程和卷积层:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b6c94be4cbfc2118169307e93584a3a8.png

卷积层的示例。图由作者绘制。

在 RGB 彩色图像的情况下,我们需要为每个通道应用一个单独的核。所以,在 RGB 的情况下,每个红色、绿色和蓝色的二维输入都会有三个核。

填充 & 步长

为了使卷积层与前一层的尺寸相同,我们应用一种称为 零填充 的方法。以下是一些图像的此过程示例:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/66ae068187b148ab378279b3c61c0b8e.png

零填充示例。图由作者绘制。

填充保持维度不变,并增加了边缘像素的采样。如果我们不对输入图像进行填充,那么边缘像素将只被核计算一次,导致丢失像素和信息。

通常,输出维度定义为:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dcf5762ca22cf9dc8a9690b3019f0657.png

输出维度。作者在 LaTeX 中的方程。

  • H_in 和* W_in_ 是原始输入图像的高度和宽度。

  • H_filter 和* W_filter_ 是核或滤波器的高度和宽度。

  • Padding_height 和* Padding_width_ 是应用于输入图像高度和宽度的填充量。

  • Stride_heightStride_width_ 是核沿输入图像高度和宽度的步长。

步长是指我们在输入图像上滑动核的像素数。通过增加步长,我们可以减少计算成本,但也会增加丢失输入信息的机会。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d3b82c7baa80f705c47a43a7bf2ea758.png

步长为 1 的示例。图由作者绘制。

多个核

在实践中,每个卷积层将会有多个核,并为每个核输出一个特征图。例如,如果一个卷积层有 32 个核,输出体积的深度将为 32,每个切片对应于每个核产生的特征图。这允许 CNN 学习不同的方面,因为每个核学会识别输入的不同特征。

在 RGB 图像的情况下,由于每个通道有 32 个特征图,输出将会有 96 个特征图深。维度还可以更大。卫星图像有额外的频率,例如红外线。

理论与数学

每层的神经元值是:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2eeeb8a25bbe280959e90b5eec38dc59.png

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。请参阅以下我之前的文章,了解为什么这很重要:

使用 ReLU 打破线性

神经网络与深度学习的激活函数

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 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,用户想了解LSTM-CNN模型的构建原理,我需要详细解释这个模型的组成部分以及它们是如何结合的。首先,我应该先回顾一下LSTM和CNN各自的特点,然后说明它们在模型中的角色。 LSTM,即长短期记忆网络,擅长处理时间序列数据,因为它能捕捉长期依赖关系。而CNN,卷积神经网络,通常在提取局部特征和空间结构方面表现优异,比如在图像处理中。但在时间序列或文本数据中,CNN可以用来提取局部时间模式或局部语义特征。 接下来,用户可能想知道这两者如何结合。常见的结合方式有两种:CNN在前,LSTM在后,或者反过来。需要解释这两种结构的区别和应用场景。比如,CNN先处理数据提取特征,然后LSTM捕捉时间依赖,适用于时间序列预测;而LSTM先处理序列,再用CNN提取高层次特征,可能适用于更复杂的模式识别。 然后,需要详细说明构建模型的步骤,包括输入数据的处理、各层的配置、参数设置等。比如输入形状、卷积层的过滤器数量、池化方式、LSTM的单元数,以及如何连接这些层。这部分需要具体,让用户能够理解每个组件的作用。 用户提供的引用中提到了VMD-CNN-BiLSTM-Attention和TCN-BiLSTM-Attention等模型,这说明用户可能对结合多种结构的模型感兴趣。虽然用户的问题是LSTM-CNN,但可能需要提到这些变体,或者说明不同组合的优缺点。 另外,用户的问题是关于原理的,所以需要强调为什么这样组合有效。比如,CNN提取局部特征后,LSTM可以捕捉这些特征在时间上的变化,从而提升模型对时序数据的建模能力。 还要注意用户的示例中提到了代码结构,可能用户希望了解实际实现中的注意事项,比如参数调优、过拟合处理(如Dropout层)、数据预处理等。不过用户这次的问题更偏向原理,所以代码示例可以作为补充,但重点还是在理论解释。 最后,生成的相关问题需要围绕模型结构、应用场景、优化方法等,帮助用户进一步探索。比如,如何选择CNN和LSTM的顺序,或者在不同任务中的调整方法。 需要确保使用正确的中文术语,避免翻译错误,并且按照用户的要求使用LaTeX格式标注数学公式,比如输入数据的形状可以用$(batch\_size, time\_steps, features)$这样的格式。 总结思考步骤: 1. 解释LSTM和CNN的单独作用。 2. 讨论两者的结合方式及顺序。 3. 详细描述构建步骤,包括各层配置。 4. 结合引用中的其他模型结构,说明可能的变体。 5. 提供代码示例(如果需要)。 6. 生成相关问题,引导深入学习。</think>### LSTM-CNN模型构建原理详解 LSTM-CNN模型结合了**长短期记忆网络(LSTM)**和**卷积神经网络CNN)**的优势,主要用于处理**时间序列数据**或**序列化特征的空间-时序混合建模**。其核心在于通过CNN提取局部特征,再通过LSTM捕捉时序依赖关系。以下从**结构设计**和**数学原理**两方面展开。 --- #### 一、模型结构设计 典型的LSTM-CNN有两种构建方式: 1. **CNN前置结构** **输入** → **卷积层** → **池化层** → **LSTM层** → **输出** **适用场景**:时间序列预测、语音信号处理 **原理**:CNN提取局部时间模式,LSTM学习时序动态特性[^3]。 2. **LSTM前置结构** **输入** → **LSTM层** → **卷积层** → **输出** **适用场景**:文本分类、多尺度时序分析 **原理**:LSTM先建模全局时序依赖,CNN再提取高阶空间特征。 --- #### 二、数学原理分析 1. **输入数据表示** 输入数据通常为三维张量:$(batch\_size, time\_steps, features)$,例如$(32, 100, 5)$表示32个样本,每个样本100个时间步,每步5个特征。 2. **卷积操作** CNN通过滤波器(Filter)对局部时间窗口进行特征提取: $$h_{t} = \sigma(W_c \cdot X_{t:t+k-1} + b_c)$$ 其中: - $k$为卷积核大小 - $W_c \in \mathbb{R}^{k \times d \times m}$($d$为输入维度,$m$为滤波器数量) - $\sigma$为激活函数(如ReLU) 3. **LSTM单元计算** LSTM通过门控机制控制信息流: $$ \begin{aligned} f_t &= \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \\ i_t &= \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \\ \tilde{C}_t &= \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) \\ C_t &= f_t \circ C_{t-1} + i_t \circ \tilde{C}_t \\ o_t &= \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) \\ h_t &= o_t \circ \tanh(C_t) \end{aligned} $$ 其中$f_t, i_t, o_t$分别表示遗忘门、输入门、输出门[^2]。 --- #### 三、关键参数配置 | 组件 | 参数示例 | 作用说明 | |------------|--------------------|--------------------------| | 卷积层 | filters=64, kernel_size=3 | 提取3个时间步的局部特征 | | 池化层 | pool_size=2 | 降低时间维度分辨率 | | LSTM层 | units=128 | 捕捉长期时序依赖关系 | | Dropout层 | rate=0.5 | 防止过拟合 | --- #### 四、代码示例(PyTorch实现) ```python import torch import torch.nn as nn class LSTM_CNN(nn.Module): def __init__(self, input_dim, cnn_filters, lstm_units, output_dim): super().__init__() self.cnn = nn.Sequential( nn.Conv1d(input_dim, cnn_filters, kernel_size=3), nn.ReLU(), nn.MaxPool1d(2) ) self.lstm = nn.LSTM(cnn_filters, lstm_units, batch_first=True) self.fc = nn.Linear(lstm_units, output_dim) def forward(self, x): x = x.permute(0, 2, 1) # 调整为(批大小, 特征数, 时间步) x = self.cnn(x) x = x.permute(0, 2, 1) # 恢复为(批大小, 时间步, 特征数) _, (h_n, _) = self.lstm(x) return self.fc(h_n[-1]) ``` --- #### 五、应用场景 1. **时间序列预测**:电力负荷预测、股票价格分析[^2] 2. **文本分类**:结合词向量(如Word2Vec)进行情感分析[^3] 3. **生物信号处理**:EEG/ECG信号模式识别 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值