【深度学习】Pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~四维张量;conv3d~五维张量)

文章目录

  • 一、前言
  • 二、实验环境
  • 三、PyTorch数据结构
    • 1、Tensor(张量)
      • 1. 维度(Dimensions)
      • 2. 数据类型(Data Types)
      • 3. GPU加速(GPU Acceleration)
    • 2、张量的数学运算
      • 1. 向量运算
      • 2. 矩阵运算
      • 3. 向量范数、矩阵范数、与谱半径详解
      • 4. 一维卷积运算
      • 5. 二维卷积运算
      • 6. 高维张量
        • torch.matmul VS torch.mul
        • 乘法计算原则
        • 二维卷积conv2d(四维张量)
        • 三维卷积conv3d(五维张量)

一、前言

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

二、实验环境

  本系列实验使用如下环境

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. 一维卷积运算

【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)

5. 二维卷积运算

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

6. 高维张量

torch.matmul VS torch.mul
  1. torch.matmul:用于执行两个张量的矩阵乘法操作,它要求两个张量的维度需要满足矩阵乘法的规则,例如对于两个三维张量,torch.matmul将在最后两个维度上执行矩阵乘法。
import torch

# 创建两个张量
tensor1 = torch.randn(3, 4) 
tensor2 = torch.randn(4, 5)  

# 矩阵乘法
result = torch.matmul(tensor1, tensor2) 
print(result.shape) 
  1. torch.mul:用于对两个张量进行逐元素相乘,即*运算符,会将两个张量的每个元素进行相乘。要求两个张量的形状需要一致或者满足广播规则。

  2. 对比

import torch


tensor1 = torch.tensor([[1, 2, 3],
                        [4, 5, 6]])  # shape: (2, 3)

tensor2 = torch.tensor([[7, 8],
                        [9, 10],
                        [11, 12]])  # shape: (3, 2)

# 使用 torch.matmul 进行矩阵乘法
result_matmul = torch.matmul(tensor1, tensor2)  # 结果为 shape (2, 2)
print("Matmul result:")
print(result_matmul)

# 使用 torch.mul 进行逐元素相乘
result_mul = torch.mul(tensor1, tensor2.T)  # 结果为逐元素相乘后的张量
print("\nMul result:")
print(result_mul)

在这里插入图片描述

乘法计算原则
  1. 张量的维度匹配:两个张量进行乘法操作时,需要保证它们的维度匹配。例如,两个张量的维度分别为(a,b,c)和(c,d),那么它们可以进行乘法操作。

  2. 批量乘法:如果两个张量的维度不完全匹配,但它们在最后一维上相符,那么可以进行批量乘法。这意味着两个张量的前面维度需要匹配,并且其中一个张量的维度需要和另一个张量的倒数第二个维度相匹配。

import torch


tensor1 = torch.randn(3, 4, 5)  # 维度为 (3, 4, 5)
tensor2 = torch.randn(3, 5, 6)  # 维度为 (3, 5, 6)
result = torch.matmul(tensor1, tensor2)

print(result.size())  # 输出为 (3, 4, 6),说明两个张量进行了批量乘法
  1. 广播机制:如果两个张量的维度不完全匹配,但是可以通过广播机制进行维度的扩展以匹配,那么可以进行乘法操作。广播机制会自动将维度较小的张量扩展到维度较大的张量上。
import torch


tensor1 = torch.tensor([[1, 2, 3],
                        [4, 5, 6]])  # shape: (2, 3)

tensor2 = torch.tensor([[7, 8],
                        [9, 10],
                        [11, 12]])  # shape: (3, 2)

tensor3 = torch.cat([tensor1, tensor1], dim=1)

# 通过 unsqueeze 添加新的维度来复制成三维张量
# tensor1_3d = tensor1.unsqueeze(0)  # 在第一个维度上添加新的维度
# print(tensor1_3d.shape)  # 输出:(1, 2, 3)
tensor1_3d = tensor1.expand(2, 2, 3)  # 扩展维度
print(tensor1_3d.shape)  # 输出:(2, 2, 3)
print(tensor1_3d)

result_matmul1 = torch.matmul(tensor1, tensor2)
print(f"{tensor1.size()}*{tensor2.size()}={result_matmul1.size()}")
print(result_matmul1)

result_matmul2 = torch.matmul(tensor1_3d, tensor2)
print(f"{tensor1_3d.size()}*{tensor2.size()}={result_matmul2.size()}")
print(result_matmul2)

result_matmul3 = torch.matmul(tensor2, tensor1)
print(f"{tensor2.size()}*{tensor1.size()}={result_matmul3.size()}")
print(result_matmul3)

result_matmul4 = torch.matmul(tensor2, tensor1_3d)
print(f"{tensor2.size()}*{tensor1_3d.size()}={result_matmul4.size()}")
print(result_matmul4)

在这里插入图片描述

二维卷积conv2d(四维张量)
import torch
import torch.nn.functional as F

# batch_size=2, channel=3, height=32, width=32
input_tensor = torch.randn(2, 3, 32, 32)

# out_channels=4, in_channels=3, kernel_height=3, kernel_width=3
conv_kernel = torch.randn(4, 3, 3, 3)

# 执行卷积操作
output = F.conv2d(input_tensor, conv_kernel, padding=1)

print(output.size())  # 输出为 (2, 4, 32, 32)
  • 通道匹配:卷积核的输入通道数必须与输入张量的通道数相同( 3 = 3 3=3 3=3),这样才能进行逐通道的卷积操作。

  • 大小匹配:卷积核的大小必须小于或等于输入张量的大小( 3 < 32 3<32 3<32),否则无法在输入张量上进行卷积操作。

  • 卷积参数

    • 步长:卷积时的步长参数需要考虑输入张量的大小;
    • 填充:填充参数可以用来控制卷积操作的输出尺寸,用于保持输入和输出的尺寸一致。
三维卷积conv3d(五维张量)
import torch
import torch.nn.functional as F


#batch_size=2, channel=3, depth=10, height=32, width=32
input_tensor = torch.randn(2, 3, 10, 32, 32)

# out_channels=4, in_channels=3, kernel_depth=3, kernel_height=3, kernel_width=3
conv_kernel = torch.randn(4, 3, 3, 3, 3)
# 执行三维卷积操作
output = F.conv3d(input_tensor, conv_kernel, padding=1)

print(output.size())  # 输出为 (2, 4, 10, 32, 32)

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

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

相关文章

【rust】8、连接数据库:sqlx

sqlx 是 rust 的数据库访问工具&#xff0c; 本身并不是 orm&#xff0c;但常见的 orm 都是基于它实现的。其有如下特点&#xff1a; 支持异步&#xff0c;适合高并发编译时检查&#xff1a;cargo build 时检查执行 sql&#xff0c;校验响应值支持多数据库&#xff1a;mysql、…

Leo赠书活动-17期 《基础软件之路:企业级实践及开源之路》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

学习笔记-Git

Git 问题一描述解决方法注意事项 问题一 描述 在commit和push的时候因为网络太慢了中途强行关闭了进程&#xff0c;而push的内容因为文件过大导致无法正常push 按照原本的流程在push的时候会提示失败&#xff0c;并且需要在解决了大文件之后重新push 而因为中途中断了&#x…

Autosar-Mcal配置详解-MCU

3.6.1创建、配置RAM 1)创建RAM配置 2)配置RAM 以F1KM R7F7016533ABG为例,它的local RAM有512K, global RAM 192K,Retention RAM 64K. Local RAM: local RAM就是程序平常使用的RAM,在DeepStop模式下内容会丢失。 Global RAM:主要用于DMA的源地址和目的地址使用,在Dee…

win电脑截屏的图片在哪里?电脑截屏的图片删了怎么找回来

在使用Windows操作系统的电脑时&#xff0c;截屏功能是我们经常使用的工具之一。然而&#xff0c;有时我们可能会遇到找不到截屏图片或误删截屏图片的情况。那么&#xff0c;Win电脑截屏的图片究竟存放在哪里&#xff1f;如果误删了截屏图片&#xff0c;我们又该如何找回呢&…

使用Windbg动态调试目标程序去分析异常的两实战案例分享

目录 1、前言 2、案例1&#xff1a;程序退出时弹出报错提示框 2.1、问题说明 2.2、到系统应用程序日志中看系统有没有自动生成dump文件 2.3、将Windbg附加到目标程序上进行动态调试 3、案例2&#xff1a;程序在运行过程中弹出ASSERT断言提示框 3.1、问题说明 3.2、将Wi…

【Python笔记-设计模式】组合模式

一、说明 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。 (一) 解决问题 处理树形结构&#xff1a;可以很好地处理树形结构的数据&#xff0c;使得用户可以统一对待单个对象和对象组合。统一接…

Java零基础 - 逻辑运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

第13讲实现自定义logout处理

默认logout请求实现是有状态的&#xff0c;返回到login请求页面&#xff1b;我们现在是前后端分离处理&#xff0c;所以需要自定义实现logout 新建JwtLogoutSuccessHandler /*** 自定义Logout处理* author java1234_小锋 &#xff08;公众号&#xff1a;java1234&#xff09;…

Python算法题集_岛屿数量

Python算法题集_岛屿数量 题200&#xff1a;岛屿数量1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环递归】2) 改进版一【双层循环迭代】3) 改进版二【双层循环迭代高速双向队列】4) 改进版三【双层循环并查集】 4. 最优算法5. 相关资…

五、分类算法 总结

代码&#xff1a; from sklearn.datasets import load_iris, fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.naive_bayes import MultinomialNB from s…

基于JAVA的班级考勤管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

Kubernetes二进制搭建

目录 1.操作系统初始化配置&#xff08;所有节点同此操作&#xff09; 2.部署etcd集群 etcd概述 准备签发证书环境 在master01节点上操作&#xff08;192.168.88.22&#xff09; 在两个node节点上操作 总结&#xff1a; 3.部署docker引擎 4.部署Master组件 总结&…

学习大数据所需的java基础(5)

文章目录 集合框架Collection接口迭代器迭代器基本使用迭代器底层原理并发修改异常 数据结构栈队列数组链表 List接口底层源码分析 LinkList集合LinkedList底层成员解释说明LinkedList中get方法的源码分析LinkedList中add方法的源码分析 增强for增强for的介绍以及基本使用发2.使…

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

【虚拟仿真】Unity3D中实现3DUI,并且实现Button、InputField、Toggle等事件绑定

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近在项目中需要用到3DUI的展示,之前一般会用TextMeshPro进行展示: 但是,后面又需要添加按钮、Toggle等…

《nvm 安装》nodejs 版本管理工具

一.前言 如果先于 nvm 安装了 node&#xff0c;一定要先卸载&#xff01; 两种卸载方式&#xff1a; 方式一 控制面板 -> 程序和功能 -> nodejs 删除 方式二 下载的 node 安装包有卸载选项 二. 安装 nvm 下载地址 中找到对应的安装包&#xff0c;我本机使用 window…

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…

进度条小程序

文章目录 铺垫回车换行缓冲区概述强制冲刷缓冲区 简单实现倒计时功能进度条小程序版本一实例代码效果展示分析 版本二 铺垫 回车换行 回车和换行是两个独立的动作 回车是将光标移动到当前行的最开始&#xff08;最左侧&#xff09; 换行是竖直向下平移一行 在C语言中&…

图的遍历-----深度优先遍历(dfs),广度优先遍历(bfs)【java详解】

目录 简单介绍&#xff1a;什么是深度、广度优先遍历&#xff1f; 深度优先搜索&#xff08;DFS&#xff0c;Depth First Search&#xff09;&#xff1a; 大致图解&#xff1a; 广度优先搜索&#xff08;BFS&#xff0c;Breadth First Search&#xff09;&#xff1a; 大致图…