【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

news2024/11/17 5:44:51

文章目录

  • 一、前言
  • 二、实验环境
  • 三、PyTorch数据结构
    • 1、Tensor(张量)
      • 1. 维度(Dimensions)
      • 2. 数据类型(Data Types)
      • 3. GPU加速(GPU Acceleration)
    • 2、张量的数学运算
      • 1. 向量运算
      • 2. 矩阵运算
      • 3. 向量范数、矩阵范数、与谱半径详解
      • 4. 一维卷积运算
      • 5. 二维卷积运算
        • a. 数学原理
        • b. torch.nn.functional.conv2d
        • c. 步长&零填充
        • d. 图像处理~特征提取

一、前言

  卷积运算是一种在信号处理、图像处理和神经网络等领域中广泛应用的数学运算。在图像处理和神经网络中,卷积运算可以用来提取特征、模糊图像、边缘检测等。在信号处理中,卷积运算可以用来实现滤波器等操作。

二、实验环境

  本系列实验使用如下环境

conda create -n DL python==3.11
conda activate DL
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

三、PyTorch数据结构

1、Tensor(张量)

  Tensor(张量)是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。

1. 维度(Dimensions)

  Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。在PyTorch中,可以使用size()方法获取张量的维度信息,使用dim()方法获取张量的轴数。

在这里插入图片描述

2. 数据类型(Data Types)

  PyTorch中的张量可以具有不同的数据类型:

  • torch.float32或torch.float:32位浮点数张量。
  • torch.float64或torch.double:64位浮点数张量。
  • torch.float16或torch.half:16位浮点数张量。
  • torch.int8:8位整数张量。
  • torch.int16或torch.short:16位整数张量。
  • torch.int32或torch.int:32位整数张量。
  • torch.int64或torch.long:64位整数张量。
  • torch.bool:布尔张量,存储True或False。

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)

3. GPU加速(GPU Acceleration)

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

2、张量的数学运算

  PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。

1. 向量运算

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

2. 矩阵运算

【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)

3. 向量范数、矩阵范数、与谱半径详解

【深度学习】Pytorch 系列教程(五):PyTorch数据结构:2、张量的数学运算(3):向量范数(0、1、2、p、无穷)、矩阵范数(弗罗贝尼乌斯、列和、行和、谱范数、核范数)与谱半径详解

4. 一维卷积运算

  在离散的情况下,给定两个函数 f ( n ) f(n) f(n) g ( n ) g(n) g(n),它们的卷积运算定义为:
( f ∗ g ) ( n ) = ∑ i ( f ( i ) ⋅ g ( n − i ) ) (f * g)(n) = \sum_{i} (f(i) \cdot g(n-i)) (fg)(n)=i(f(i)g(ni))这里的 ∗ * 代表卷积运算, n n n 代表离散的变量。具体地, f ( n ) f(n) f(n) g ( n ) g(n) g(n)的卷积运算 ( f ∗ g ) ( n ) (f * g)(n) (fg)(n)表示在 n n n位置上的加权求和,其中每个加权项是 f ( i ) f(i) f(i) g ( n − i ) g(n-i) g(ni)的乘积, i i i是自由变量。
【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)

import torch


input_signal = torch.tensor([1, 1, 2, -1, 1, -3, 1], dtype=torch.float)
conv_kernel = torch.tensor([-1, 0, 1], dtype=torch.float)

# 反转卷积核~定义
conv_kernel_flipped = torch.flip(conv_kernel, [0])
K = conv_kernel.numel()
print(f"K:{K}")
# 零填充输入信号
padded_input = torch.nn.functional.pad(input_signal, (K - 1, K - 1), 'constant', 0)
print(f"输入信号:{padded_input}")
# 执行卷积运算
output1 = torch.nn.functional.conv1d(padded_input.view(1, 1, -1), conv_kernel_flipped.view(1, 1, -1))
# 输出结果
print(f"卷积运算:{output1}")
# 互相关运算
output2 = torch.nn.functional.conv1d(padded_input.view(1, 1, -1), conv_kernel.view(1, 1, -1))
# 输出结果
print(f"互相关运算:{output2}")

5. 二维卷积运算

a. 数学原理

  二维卷积运算是信号处理和图像处理中常用的一种运算方式,当给定两个二维离散信号或图像 f ( x , y ) f(x, y) f(x,y) g ( x , y ) g(x, y) g(x,y),其中 f ( x , y ) f(x, y) f(x,y) 表示输入信号或图像, g ( x , y ) g(x, y) g(x,y) 表示卷积核。二维卷积运算可以表示为: h ( x , y ) = ∑ m ∑ n f ( m , n ) ⋅ g ( x − m , y − n ) h(x, y) = \sum_{m}\sum_{n} f(m, n) \cdot g(x-m, y-n) h(x,y)=mnf(m,n)g(xm,yn)其中 ∑ m ∑ n \sum_{m}\sum_{n} mn 表示对所有 m , n m, n m,n 的求和, h ( x , y ) h(x, y) h(x,y) 表示卷积后的输出信号或图像。

  在数学上,二维卷积运算可以理解为将输入信号或图像 f ( x , y ) f(x, y) f(x,y) 和卷积核 g ( x , y ) g(x, y) g(x,y) 进行对应位置的乘法,然后将所有乘积值相加得到输出信号或图像 h ( x , y ) h(x, y) h(x,y)。这个过程可以用于实现一些信号处理和图像处理的操作,例如模糊、边缘检测、图像增强等。
  二维卷积运算在实际应用中有着广泛的应用,如卷积神经网络(CNN)中的卷积层就是利用了二维卷积运算来提取特征。因此,理解二维卷积运算的数学原理对于深度学习和图像处理有着重要的意义。
在这里插入图片描述

b. torch.nn.functional.conv2d
import torch
import torch.nn.functional as F


# 一个batch,一个通道,5x5的输入
# 一个通道,3x3的卷积核
input_signal = torch.tensor([[1, 1, 1, 1, 1],
                             [-1, 0, -3, 0, 1],
                             [2, 1, 1, -1, 0],
                             [0, -1, 1, 2, 1],
                             [1, 2, 1, 1, 1]
                             ], dtype=torch.float).view(1, 1, 5, 5)
conv_kernel = torch.tensor([[1, 0, 0],
                            [0, 0, 0],
                            [0, 0, -1]], dtype=torch.float).view(1, 1, 3, 3)
# 反转卷积核~定义
conv_kernel_flipped = torch.flip(conv_kernel, [2, 3])
# 使用conv2d进行卷积运算
# 通过view将形状变为合适的(batch, channel, height, width)
output1 = F.conv2d(input_signal, conv_kernel_flipped)
print(f"卷积运算:\n{output1}")
# 互相关运算
output2 = F.conv2d(input_signal, conv_kernel)
print(f"互相关运算:\n{output2}")

  在 torch.flip 函数中,参数 [2, 3] 指示了在每个维度上进行翻转的操作,[2, 3] 表示对张量的第3维和第4维进行翻转操作。这里卷积核是一个四维张量,第3维表示高度,第4维表示宽度。

在这里插入图片描述

c. 步长&零填充

  在卷积的标准定义基础上,还可以引入卷积核的滑动步长零填充来增加卷积的多样性,可以更灵活地进行特征抽取
在这里插入图片描述
输出形状的计算公式:
  设输入的二维矩阵形状为 I H × I W I_H \times I_W IH×IW,卷积核形状为 K H × K W K_H \times K_W KH×KW,步长为 S S S,零填充为 P P P,输出的二维矩阵形状为 O H × O W O_H \times O_W OH×OW

则输出矩阵的高度 O H O_H OH 和宽度 O W O_W OW 可以通过以下公式计算得到: O H = I H − K H + 2 P S + 1 O_H = \frac{I_H - K_H + 2P}{S} + 1 OH=SIHKH+2P+1 O W = I W − K W + 2 P S + 1 O_W = \frac{I_W - K_W + 2P}{S} + 1 OW=SIWKW+2P+1

import torch
import torch.nn.functional as F


# 一个batch,一个通道,5x5的输入
# 一个通道,3x3的卷积核
input_signal = torch.tensor([[1, 1, 1, 1, 1],
                             [-1, 0, -3, 0, 1],
                             [2, 1, 1, -1, 0],
                             [0, -1, 1, 2, 1],
                             [1, 2, 1, 1, 1]
                             ], dtype=torch.float).view(1, 1, 5, 5)
conv_kernel = torch.tensor([[1, 0, 0],
                            [0, 0, 0],
                            [0, 0, -1]], dtype=torch.float).view(1, 1, 3, 3)
# 反转卷积核~定义
conv_kernel_flipped = torch.flip(conv_kernel, [2, 3])
# 使用conv2d进行卷积运算
# 通过view将形状变为合适的(batch, channel, height, width)
output1 = F.conv2d(input_signal, conv_kernel_flipped)
print(f"卷积运算:\n{output1}")
# 互相关运算
output2 = F.conv2d(input_signal, conv_kernel)
print(f"互相关运算:\n{output2}")

output3 = F.conv2d(input_signal, conv_kernel, stride=1, padding=0)
output4 = F.conv2d(input_signal, conv_kernel, stride=2, padding=0)
output5 = F.conv2d(input_signal, conv_kernel, stride=1, padding=1)
output6 = F.conv2d(input_signal, conv_kernel, stride=2, padding=1)
print(f"步长1,零填充0:\n{output3}")
print(f"步长2,零填充0:\n{output4}")
print(f"步长1,零填充1:\n{output5}")
print(f"步长2,零填充1:\n{output6}")

在这里插入图片描述

d. 图像处理~特征提取

  在图像处理中,卷积经常作为特征提取的有效方法.一幅图像在经过卷积操作后得到结果称为特征映射(Feature Map)。图5.3给出在图像处理中几种常用的滤波器,以及其对应的特征映射.图中最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的滤波器可以用来提取边缘特征
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1467392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TESTLINK 测试用例数据结构解析

一、node_types 测试组件信息表 我们查询表 select * from testlink.node_types; 得到如下结果 二、nodes_hierarchy 测试用例目录层次表 我们以下图的项目为例,来讲解 1、测试项目 首先,我们有个Train的项目,存在表testprojects中&#…

动态获取 微信小程序appid / 自定义启动命令

官网:https://uniapp.dcloud.net.cn/collocation/package.html#%E7%94%A8%E6%B3%95 小程序开发完成之后需要一套代码多个小程序使用,每次都需要在manifest.json文件中手动修改,大大增加了开发的复杂度。 官网:https://uniapp.dcl…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理(一):设置 Flink 进程内存 1.配置 Total Memory2.JVM 参数3.根据比例限制的组件(Capped Fractionated Components) Apache Flink 通过严格控制各种组件的内存使用,在 JVM 上提供高效的工作负…

测试计划、测试方案、测试策略、测试用例的区别

一 测试计划 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、各阶段的测试任务、时间进度安排,谁执行任务和风险控制等,可以包括测试策略。 二 测试方案 测试方案是指描述需要测试的特性、测试的方…

Android 输入法框架简介

每种平台都有自己的输入法框架. GNU/Linux 桌面环境有多种输入法框架, 比如 ibus, fcitx 等. 但是 Android 操作系统只有一种, 是统一提供的输入法框架. 相关链接: 《ibus 源代码阅读 (1)》 https://blog.csdn.net/secext2022/article/details/136099328https://developer.and…

【Pytorch】从MoCo看无监督对比学习;从SupCon看有监督对比学习

目录 无监督对比学习:Moco文章内容理解代码解释 有监督对比学习:Supervised Contrastive Learning文章内容理解 无监督对比学习:Moco 文章内容理解 以下内容全部来自于:自监督学习-MoCo-论文笔记. 侵删 论文:Momentu…

ShardingSphere5.x 分库分表

一、shardingSphere介绍 1、官网:Apache ShardingSphere 2、开发文档: 概览 :: ShardingSphere 3、shardingsphere-jdbc ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库&#x…

Vue3+TS+ElementPlus 001 环境配置

1.1 环境准备 1.1.1 安装vue-cli(第一次需要) npm install -g vue/cli 1.1.2 创建vue项目 vue create 项目名称(项目名称尽量不要使用中文) 1.1.3 选择相应的项目 1.1.4 启动项目 npm run serve 2.1 引入element-plus 2.1.1 安装 一个 Vue 3 UI 框…

Linux操作体系结构与功能流程

文章目录 前言一、linux操作系统结构二、操作系统的工作方式三、操作系统内核中各级模块的相互关联四、Linux操作系统结构的独立性 前言 以内核代码 v0.11 和 v3.4.2 版本源码对 Linux 内核相关知识进行学习,由浅入深逐步掌握 Linux 内核。本文记录 Linux 操作系统…

小区视频汇聚与智能监管方案:老破小升级改造与小区智慧化建设

一、需求背景 在当今数字化时代,智慧小区已成为城市建设的必然趋势。加快小区智能化改造,不断完善小区管理和服务,彻底改变粗放型管理方式已经成为当前小区智慧化趋势的重要任务。其中,智能视频监控系统在提高小区安全性和管理效…

ROS查找pkg

要在ROS中查找包名为"joint_state_publisher"的软件包,可以使用以下命令行指令来进行查找: 查找pkg“joint_state_publisher” rospack find joint_state_publisher这将返回该软件包所在的路径。如果结果不存在或者未安装该软件包&#xff0…

Sora 对未来视频创作伦理的挑战和思考

Sora 对未来视频创作伦理的挑战和思考 随着人工智能技术的飞速发展,AI视频模型Sora的出现为视频创作带来了革命性的变革。然而,在技术进步的同时,也带来了一些伦理问题值得我们深思。 1. 真实性和虚假信息: Sora能够生成逼真的视频画面&…

Pytorch 自用 Scheduler 分享

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

C#实用开发(14)--高清晰度字体和窗体分辨率问题。

新建winform程序是,又是会感觉到字体清晰度不够高。还有一种现象就是分辨率的问题,我们平常在自己的电脑开发是用125百分比的分辨率,实际部署的工控机是100,这就会导致分辨率不一致的问题。 可以通过新建应用程序清单,…

宝塔面板安装了mysql5.7和phpMyadmin,但是访问phpMyadmin时提示502 Bad Gateway

操作流程截图如下: 原因是没有选择php版本 选择php版本 下一页找到phpMyAdmin,选择设置 目前只有纯净态,说明没有php环境,前去安装php环境 点击安装,选择版本,这里选择的是7.4版本,编译安…

浅拷贝导致的bug

错误代码: //初始化formTableData的值 const formTableData ref({saleOrderTime:,saleOrderDetails:[] });const showModal async (item) > {//调接口获取后端返回的数据let data (await api.searchSaleOrderById({saleOrderId:item.id})).dataconsole.log(&…

计算机毕业设计 基于SpringBoot的宠物商城网站系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

FreeRtos Queue(三)

本篇主要分析向队列中发送消息 xQueueGenericSend 这个函数。 大致分为两个逻辑: 1、当队列没满的时候的处理 2、当队列没满的时候的处理 主意:整个xQueueGenericSend是在for(;;)中处理的 一、队列没满的case 队列的数据结构图可参考:F…

村镇医院医疗中心污废水如何处理达标

污废水处理是村镇医院医疗中心运营中不可忽视的重要环节。如何有效处理污废水,使其达到相关标准,是保障医疗中心环境卫生的关键之一。 首先,村镇医院医疗中心应建立科学的废水处理系统。该系统应包括预处理、初级处理、中级处理和高级处理等环…

浅析SpringBoot框架常见未授权访问漏洞

文章目录 前言Swagger未授权访问RESTful API 设计风格swagger-ui 未授权访问swagger 接口批量探测 Springboot Actuator未授权访问数据利用未授权访问防御手段漏洞自动化检测工具 CVE-2022-22947 RCE漏洞原理分析与复现漏洞自动化利用工具 其他常见未授权访问Druid未授权访问漏…