当前位置: 首页 > news >正文

【PyTorch】PyTorch中torch.nn模块的卷积层

PyTorch深度学习总结

第七章 PyTorch中torch.nn模块的卷积层


文章目录

  • PyTorch深度学习总结
  • 前言
  • 一、torch.nn模块
    • 1. 模块的基本组成部分
      • 1.1 层(Layers)
      • 1.2 损失函数(Loss Functions)
      • 1.3 激活函数(Activation Functions)
    • 2. 自定义神经网络模型
    • 3. 模块的优势
  • 二、torch.nn模块的卷积层
    • 1. 卷积的定义
    • 2. 常见的卷积层
    • 3. 卷积层的重要参数
    • 4. 卷积层总结


前言

上文介绍了PyTorch中张量(Tensor)微分(torch.autograd)操作,现在我们以及学习完了张量的主要基本操作,本文将进入神经网络介绍。
首先,本文将介绍torch.nn模块学习(卷积层)。


一、torch.nn模块

torch.nn 是 PyTorch 中用于构建神经网络的核心模块,它提供了丰富的类和函数,方便用户定义、训练和评估神经网络模型


1. 模块的基本组成部分

1.1 层(Layers)

torch.nn 提供了多种类型的层,如卷积层、池化层、循环层、全连接层等,这些层是构建神经网络的基本单元。
例如:卷积层nn.Conv2d等)、池化层nn.MaxPool2d等)、循环层nn.rnn等)、全连接层nn.Linear等)。

1.2 损失函数(Loss Functions)

损失函数能衡量模型预测结果与真实标签之间的差异,用于指导模型的训练。
例如:交叉熵损失nn.CrossEntropyLoss)、 均方误差损失nn.MSELoss)等。

1.3 激活函数(Activation Functions)

激活函数是为神经网络引入非线性因素,使网络能够学习更复杂的函数。
例如:ReLU 激活函数(nn.ReLU)、Sigmoid 激活函数(nn.Sigmoid)等。


2. 自定义神经网络模型

通过继承 nn.Module 类,可以自定义神经网络模型。在自定义模型时,需要实现 __init__ 方法来初始化模型的层,以及 forward 方法来定义模型的前向传播过程。


3. 模块的优势

高度模块化torch.nn 模块将神经网络的各个组件进行了模块化封装,用户可以方便地组合不同的层、损失函数和激活函数,构建出复杂的神经网络模型。
自动求导:结合 PyTorch 的自动求导机制,torch.nn 模块可以自动计算模型的梯度,大大简化了模型训练的过程。
跨平台支持:基于 PyTorch 的跨平台特性,torch.nn 模块可以在 CPUGPU 等不同的计算设备上运行,提高了模型的训练和推理效率。


二、torch.nn模块的卷积层

1. 卷积的定义

卷积是一种数学运算,在信号处理、图像处理和机器学习等领域都有广泛应用。卷积公式通常用星号“*”表示卷积运算,下方展示了连续和离散两种信号的卷积计算公式。
连续时间信号 x(t)h(t) ,其卷积公式定义为:
( y ∗ h ) ( t ) = ∫ − ∞ ∞ x ( τ ) h ( t − τ ) d τ (y * h)(t) = \int_{-\infty}^{\infty} x(\tau)h(t - \tau)d\tau (yh)(t)=x(τ)h(tτ)dτ
离散时间信号 x[n]h[n],其卷积公式定义为:
( y ∗ h ) [ n ] = ∑ k = − ∞ ∞ x [ k ] h [ n − k ] (y * h)[n] = \sum_{k = -\infty}^{\infty} x[k]h[n - k] (yh)[n]=k=x[k]h[nk]
下图展示了离散信号卷积计算过程:
卷积运算过程


2. 常见的卷积层

以下举例了torch.nn模块中常见的卷积层:

卷积层类名(torch.nn 中)用途
一维卷积nn.Conv1d主要用于处理一维序列数据,如音频信号、时间序列等。在音频处理中,可以将音频的波形信号作为输入,通过一维卷积提取不同时间步的特征。
二维卷积nn.Conv2d广泛应用于处理二维图像数据,如图像分类、目标检测、语义分割等任务。通过二维卷积可以提取图像中的边缘、纹理等特征。
三维卷积nn.Conv3d适用于处理三维数据,如视频数据(包含时间维度)、医学影像(如 CT 扫描数据)等。在视频分析中,可提取视频在时间和空间上的特征。
转置卷积(反卷积)nn.ConvTranspose2d常用于将低分辨率的特征图上采样为高分辨率的特征图,在图像生成、语义分割等任务中经常使用。例如在图像生成网络中,将随机噪声通过转置卷积逐步生成高分辨率的图像。
分组卷积nn.Conv2d(使用 groups 参数)将输入通道和输出通道分别分成若干组,每组独立进行卷积操作,最后将结果拼接起来。可以减少模型的参数数量,提高计算效率。在一些轻量级的神经网络中经常使用。

3. 卷积层的重要参数

在 PyTorch 的 torch.nn 模块中,卷积层是构建卷积神经网络(CNN)的核心组件之一。以下为你详细介绍卷积层的几个重要参数:


in_channels

  • 参数含义:该参数表示输入特征图的通道数。在处理图像数据时,通道数对应着图像的颜色通道,例如灰度图像的通道数为 1,RGB 彩色图像的通道数为 3。
  • 示例解释:假设你要处理 RGB 彩色图像,那么输入特征图的通道数 in_channels 就应该设置为 3。若使用预训练模型的中间层输出作为输入,这个输出的特征图通道数就决定了 in_channels 的取值。
  • 代码示例
import torch
import torch.nn as nn# 输入为 RGB 图像,通道数为 3
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, >kernel_size=3)

out_channels

  • 参数含义:此参数指定了卷积层输出特征图的通道数。它相当于卷积核的数量,每个卷积核会生成一个对应的输出通道。
  • 示例解释:若将 out_channels 设置为 16,意味着卷积层会使用 16 个不同的卷积核来对输入特征图进行卷积操作,最终会输出 16 个通道的特征图。在网络的不同层中,out_channels 的值通常会根据网络的设计和任务需求进行调整,例如在更深的层中可能会增加 out_channels 以提取更复杂的特征。
  • 代码示例
import torch
import torch.nn as nn# 输出特征图的通道数为 16
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)

kernel_size

  • 参数含义:该参数定义了卷积核的大小。卷积核是一个二维或三维的矩阵,用于在输入特征图上进行滑动并执行卷积操作。kernel_size 可以是一个整数,此时表示卷积核的高度和宽度相等;也可以是一个元组,分别指定卷积核的高度和宽度。
  • 示例解释:当 kernel_size = 3 时,意味着使用的是一个 3x3 的卷积核;若 kernel_size = (3, 5),则表示卷积核的高度为 3,宽度为 5。不同大小的卷积核可以捕捉不同尺度的特征,较小的卷积核(如 3x3)可以捕捉局部特征,而较大的卷积核(如 7x7)可以捕捉更全局的特征。
  • 代码示例
import torch
import torch.nn as nn# 使用 3x3 的卷积核
conv_layer_3x3 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
# 使用 3x5 的卷积核
conv_layer_3x5 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=(3, 5))

stride

  • 参数含义stride 表示卷积核在输入特征图上滑动的步长。它控制着卷积操作的抽样间隔,即卷积核每次移动的像素数。stride 可以是一个整数,也可以是一个元组,分别指定在高度和宽度方向上的步长。
  • 示例解释:若 stride = 1,卷积核每次在输入特征图上移动一个像素;若 stride = 2,则每次移动两个像素。较大的步长会减少输出特征图的尺寸,从而降低计算量,但可能会丢失一些细节信息。例如在图像分类任务中,适当增大步长可以加快模型的训练和推理速度。
  • 代码示例
import torch
import torch.nn as nn# 步长为 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=2)

padding

  • 参数含义padding 用于在输入特征图的边界周围填充值,通常填充 0。它可以控制输出特征图的尺寸,避免在卷积过程中由于边界信息丢失而导致特征图尺寸过度缩小。padding 可以是一个整数,表示在高度和宽度方向上填充的像素数相同;也可以是一个元组,分别指定在高度和宽度方向上的填充像素数。
  • 示例解释:当 padding = 1 时,会在输入特征图的上下左右各填充一行或一列 0;若 padding = (1, 2),则在高度方向上填充 1 个像素,在宽度方向上填充 2 个像素。通过合理设置 padding,可以使输出特征图的尺寸与输入特征图的尺寸保持一致或满足特定的要求。
  • 代码示例
import torch
import torch.nn as nn# 填充 1 个像素
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)

dilation

  • 参数含义dilation 表示卷积核的膨胀率。它控制着卷积核中元素之间的间距,默认值为 1。dilation 可以是一个整数,也可以是一个元组,分别指定在高度和宽度方向上的膨胀率。
  • 示例解释:当 dilation = 1 时,卷积核是正常的紧密排列;当 dilation = 2 时,卷积核中的元素之间会有一个像素的间距。膨胀卷积可以在不增加卷积核参数数量的情况下,增大卷积核的感受野,从而捕捉更广泛的特征信息。在语义分割任务中,膨胀卷积常用于扩大模型对上下文信息的感知能力。
  • 代码示例
import torch
import torch.nn as nn# 膨胀率为 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, dilation=2)

4. 卷积层总结

卷积层类名(torch.nn 中)用途参数解释
一维卷积nn.Conv1d主要用于处理一维序列数据,如音频信号、时间序列等。在音频处理中,可以将音频的波形信号作为输入,通过一维卷积提取不同时间步的特征。
  • in_channels:输入数据的通道数。例如音频单声道时为 1,立体声为 2。
  • out_channels:输出的通道数,即卷积核的数量。
  • kernel_size:卷积核的大小,是一个整数。
  • stride:卷积核在输入数据上滑动的步长,默认值为 1。
  • padding:在输入数据边界填充的数量,默认值为 0。
二维卷积nn.Conv2d广泛应用于处理二维图像数据,如图像分类、目标检测、语义分割等任务。通过二维卷积可以提取图像中的边缘、纹理等特征。
  • in_channels:输入图像的通道数,如 RGB 图像为 3。
  • out_channels:输出特征图的数量,即卷积核的数量。
  • kernel_size:卷积核的大小,可以是整数或元组,如 3(3, 3)
  • stride:卷积核在输入图像上滑动的步长。
  • padding:在图像边界填充的像素数。
三维卷积nn.Conv3d适用于处理三维数据,如视频数据(包含时间维度)、医学影像(如 CT 扫描数据)等。在视频分析中,可提取视频在时间和空间上的特征。
  • in_channels:输入数据的通道数。
  • out_channels:输出的通道数。
  • kernel_size:卷积核的大小,可以是整数或三维元组,如 3(3, 3, 3)
  • stride:卷积核在三个维度上的滑动步长。
  • padding:在三个维度边界填充的数量。
转置卷积(反卷积)nn.ConvTranspose2d常用于将低分辨率的特征图上采样为高分辨率的特征图,在图像生成、语义分割等任务中经常使用。例如在图像生成网络中,将随机噪声通过转置卷积逐步生成高分辨率的图像。
  • in_channels:输入特征图的通道数。
  • out_channels:输出特征图的通道数。
  • kernel_size:卷积核的大小。
  • stride:卷积核在输入特征图上的步长。
  • padding:输入特征图边界填充的数量。
  • output_padding:输出特征图额外增加的尺寸。
分组卷积nn.Conv2d(使用 groups 参数)将输入通道和输出通道分别分成若干组,每组独立进行卷积操作,最后将结果拼接起来。可以减少模型的参数数量,提高计算效率。在一些轻量级的神经网络中经常使用。
  • 除了常规的 in_channelsout_channelskernel_size 等参数外,groups 参数指定分组的数量,要求 in_channelsout_channels 都能被 groups 整除。
http://www.lryc.cn/news/581686.html

相关文章:

  • 零基础,使用Idea工具写一个邮件报警程序
  • Solidity——什么是状态变量
  • 计算机网络:(七)网络层(上)网络层中重要的概念与网际协议 IP
  • Kafka “假死“现象深度解析与解决方案
  • UI前端大数据可视化进阶:交互式仪表盘的设计与应用
  • 数据驱动实时市场动态监测:让商业决策跑赢时间
  • 【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
  • 黑马点评系列问题之实战篇02短信登录 利用资料中的mysql语句创建数据表时报错
  • 关于 栈帧变化完整流程图(函数嵌套)
  • Java 双亲委派机制笔记
  • QML 使用QtObject定义私有变量
  • 基于Flask和机器学习开发的米其林餐厅数据可视化平台
  • 单片机:STM32F103的开发环境搭建
  • 单片机物联网应用中的 Pogopin、串口与外围模组通信技术解析
  • ABP VNext + Tye:本地微服务编排与调试
  • 基于udev规则固定相机名称
  • [netty5: WebSocketServerHandshaker WebSocketServerHandshakerFactory]-源码分析
  • 桥梁桥拱巡检机器人cad+【4张】设计说明书+绛重+三维图
  • 力扣 hot100 Day36
  • webUI平替应用,安装简单,功能齐全
  • LeetCode 75. 颜色分类(荷兰国旗问题)
  • 服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
  • 11.进程间通信
  • VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于Raspberry Pico RP2040)
  • 2.线性神经网络--Softmax回归
  • 算法分析与设计实验1:实现两路合并排序和折半插入排序
  • 3.8 java连接数据库
  • Vue2 day07
  • 工业相机和镜头
  • 基于Java+SpringBoot的医院信息管理系统