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

文章目录

  • 一、前言
  • 二、实验环境
  • 三、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给出在图像处理中几种常用的滤波器,以及其对应的特征映射.图中最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的滤波器可以用来提取边缘特征
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营第四节课作业

基础作业 fintune过程 这里要注意下。 合并完参数的模型再进行网页部署时,需要用到InternLM源码,教程里面忽略了需要commit版本。通过以下命令转到所需版本,然后就可以看到web_demo.py。 cd InternLM git checkout 3028f07cb79e5b1d7342f4…

Servlet实现图片的上传和显示

本篇文章是在上一篇文章上改进而来 一、图片上传需要引用的jar包 链接:https://pan.baidu.com/s/17FLjlWlNEG5YnS_dl3C8WA 提取码:wbis 二、最后的结果 三、更改数据库增加图片路径字段path 四、前端页面增加图片上传按钮,和上传的复选框 代码 上传…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么? ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人,它基于强大的语言处理模型 GPT(Generative Pre-trained Transformer)构建。它能够理解人类语言,可以为我们解决实际的问题。 1.模型规模…

vue+node.js美食分享推荐管理系统 io551

,本系统采用了 MySQL数据库的架构,在开始这项工作前,首先要设计好要用到的数据库表。该系统的使用者有二类:管理员和用户,主要功能包括个人信息修改,用户、美食类型、美食信息、订单信息、美食分享、课程大…

Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案

文章目录 1、问题描述2、原因分析3、解决方案3.1、方案一:降低mysql版本3.2、方案二:增加nullCatalogMeansCurrent参数(推荐) 4、总结 1、问题描述 需要在docker中,部署Camunda流程引擎。通过启动脚本camunda-platfor…

【LeetCode-337】打家劫舍III(动态规划)

目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“…

JVM内存随着服务器内存的升高而升高问题排查

一、故障描述 公司测试环境和线上环境,都会有:JVM内存随着服务器内存的升高而升高 这种问题 二、排查 1、linux服务器上使用htop查看java项目内存占比,给最大最小推内存300m,但是实际上超出一倍 2、排查方案 a、通过后面的学习…

Games 103 作业四

Games 103 作业四 第四次作业就是流体模拟了,作业中给了若干的实现步骤,以及一些模板代码。 首先第一步,在update函数的开头,加载水面mesh的高度,然后在update的结束时,把计算后的高度更新到mesh中。这个很…

CSDN原力值怎么提升?

文章目录 前言一、原力值怎么看二、提升原力值的方法1.原力值↑2.原力值↓提示!!!禁止在csdn网站内进行违规行为!!! 结束语 前言 在前面一篇文章中,我讲了付费收看的条件,有需要的先把网址收藏起来! https://blog.csdn.net/m0_69481332/arti…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis,一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中&#xf…

【Java面试系列】Nginx

目录 为什么要用Nginx?为什么Nginx性能这么高?Nginx 是如何实现高并发的? Nginx怎么处理请求的?Nginx的工作流程 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日…

前沿科技速递——YOLOv9

随着YOLO系列的不断迭代更新,前几天,YOLO系列也迎来了第九个大型号的更新!YOLOv9正式推出了!附上原论文链接。 arxiv.org/pdf/2402.13616.pdf 同样是使用MS COCO数据集进行对比比较,通过折线图可看出AP曲线在全方面都…

2024比较赚钱的项目是什么?亲身经历,月入过万!

我是电商珠珠 年后找项目这件事,成为了部分人所焦虑的一点,有的想要兼职,有的在考虑全职。至于做什么还没有一丝头绪。大家都知道短视频很火,于是有直播能力的人就吃上了流量红利,开始做达人带货,拍视频接…

Linux下“一切皆文件”

“Linux下一切皆文件” Linux 下一切皆文件这个说法是指 Linux 系统中的一种设计理念,即将所有设备、资源和进程等抽象为文件或文件夹的形式。这种设计理念的好处在于统一了对待不同类型资源的方式,提供了统一的接口和工具来进行管理和操作。 Linux 下…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点,thumbShape默认样式是RoundSliderThumbShape,如果想要使用其它的样式就需要自定义一下thumbShape; 例如需要一个上图样式的(圆点半透明圆形边框&#xff09…

freeswitch 权威指南 --- 高级篇

官网文档:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程:https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》:目录:https://juejin.cn/post/702058079…

2024全国水科技大会暨流域水环境治理与水生态修复论坛(六)

论坛召集人 冯慧娟 中国环境科学研究院流域中心研究员 刘 春 河北科技大学环境与工程学院院长、教授 一、会议背景 为深入贯彻“山水林田湖是一个生命共同体”的重要指示精神,大力实施生态优先绿色发展战略,积极践行人、水、自然和谐共生理念&…

软件游戏报错d3dcompiler_43.dll缺失,提供多个方法修复d3dcompiler_43.dll

当电脑系统缺失 d3dcompiler_43.dll 文件时,尝试打开依赖于该文件的软件时,通常会遇到以下几种情况: 启动失败: 软件在启动过程中可能会立即停止响应或弹出错误消息,指出“找不到 d3dcompiler_43.dll”、“无法启动此…

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展,视觉检测在生产线中扮演着越来越重要的角色,尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性,难以满足当前生产需求的高速和高精度要求。为此&#xf…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑,您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法: 一、使用内置 macOS 功能(屏幕共享) 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享;选中“屏幕共享”…