PyTorch张量数值计算

news2024/12/23 16:58:42

文章目录

  • 1、张量基本运算
  • 2、阿达玛积
  • 3、点积运算
  • 4、指定运算设备⭐
  • 5、解决在GPU运行PyTorch的问题

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、张量基本运算

PyTorch 计算的数据都是以张量形式存在
可以在 CPU 中运算, 也可以在 GPU 中运算.
基本运算中,包括 add、sub、mul、div、neg 等函数,
以及这些函数的带下划线的版本 add_、sub_、mul_、div_、neg_,
其中带下划线的版本为修改原数据。

操作类型函数示例代码代码解释
创建张量torch.randintdata = torch.randint(0, 10, [2, 3])生成一个2x3的随机整数张量,范围在0到9之间。
不修改原数据addnew_data = data.add(10)将每个元素加上10,生成一个新张量。
修改原数据add_data.add_(10)将每个元素加上10,直接修改原数据。
减法subdata.sub(100)将每个元素减去100,生成一个新张量。
乘法muldata.mul(100)将每个元素乘以100,生成一个新张量。
除法divdata.div(100)将每个元素除以100,生成一个新张量。
取反negdata.neg()将每个元素取反,生成一个新张量。

代码:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/16 1:25

# 导入PyTorch库
import torch


# 定义测试函数
def test():
    # 生成一个2x3的随机整数张量,范围在0到9之间
    data = torch.randint(0, 10, [2, 3])
    print(data)
    print('-' * 50)

    # 1. 不修改原数据
    # 使用add函数将每个元素加上10,生成一个新张量
    new_data = data.add(10)  # 等价 new_data = data + 10
    print(new_data)
    print('-' * 50)

    # 2. 直接修改原数据
    # 注意: 带下划线的函数为修改原数据本身
    # 使用add_函数将每个元素加上10,直接修改原数据
    data.add_(10)  # 等价 data += 10
    print(data)

    # 3. 其他函数
    # 使用sub函数将每个元素减去100,生成一个新张量
    print(data.sub(100))
    # 使用mul函数将每个元素乘以100,生成一个新张量
    print(data.mul(100))
    # 使用div函数将每个元素除以100,生成一个新张量
    print(data.div(100))
    # 使用neg函数将每个元素取反,生成一个新张量
    print(data.neg())

效果:
image.png

2、阿达玛积

阿达玛积(Hadamard Product),又称为元素积(element-wise product),是指两个相同尺寸的矩阵对应元素相乘得到的新矩阵。

阿达玛积与矩阵乘法不同,矩阵乘法是行与列的点积,而阿达玛积只是简单的元素相乘。

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/16 2:25
import torch


def test():
    data1 = torch.tensor([[1, 2], [3, 4]])
    data2 = torch.tensor([[5, 6], [7, 8]])
    # 第一种方式
    data = torch.mul(data1, data2)
    print(data)
    print('-' * 50)
    # 第二种方式
    data = data1 * data2
    print(data)
    print('-' * 50)


if __name__ == '__main__':
    test()

image.png

3、点积运算

点积(Dot Product)是向量计算中的一种基本运算,它将两个向量对应元素相乘并求和。
点积在机器学习和深度学习中广泛应用于各种计算,如向量相似性、神经网络中的加权和计算等。

image.png
点积运算要求第一个矩阵 shape: (n, m),
第二个矩阵 shape: (m, p),
两个矩阵点积运算 shape 为: (n, p)。

  1. 运算符 @ 用于进行两个矩阵的点乘运算
  2. torch.mm 用于进行两个矩阵点乘运算, 要求输入的矩阵为2维
  3. torch.bmm 用于批量进行矩阵点乘运算, 要求输入的矩阵为3维
  4. torch.matmul 对进行点乘运算的两矩阵形状没有限定.
    1. 对于输入都是二维的张量相当于 mm 运算.
    2. 对于输入都是三维的张量相当于 bmm 运算
    3. 对数输入的 shape 不同的张量, 对应的最后几个维度必须符合矩阵运算规则

三维矩阵:
image.png

torch.randn(3, 4, 5)参数个数不限,从左到右依次是维度。

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/16 2:35
import torch


# 1. 点积运算
def test01():
    # 创建两个张量,data1 为 3x2 矩阵,data2 为 2x2 矩阵
    data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
    data2 = torch.tensor([[5, 6], [7, 8]])
    # 第一种方式:使用 @ 运算符进行矩阵乘法(点积运算)
    data = data1 @ data2
    print(data)
    print('-' * 50)
    # 第二种方式:使用 torch.mm 函数进行矩阵乘法
    data = torch.mm(data1, data2)
    print(data)
    print('-' * 50)
    # 第三种方式:使用 torch.matmul 函数进行矩阵乘法
    data = torch.matmul(data1, data2)
    print(data)
    print('-' * 50)


# 2. torch.mm 和 torch.matmul 的区别
def test02():
    # matmul 可以处理不同维度的张量
    # 第一个张量的形状为 (3, 4, 5)
    # 第二个张量的形状为 (5, 4)
    # torch.mm 只能处理二维矩阵的乘法,而 matmul 可以处理高维度张量的乘法
    print(torch.randn(3, 4, 5))
    print(torch.matmul(torch.randn(3, 4, 5), torch.randn(5, 4)).shape)
    # 反转张量的顺序,第二个张量的形状为 (3, 4, 5)
    # 第一个张量的形状为 (5, 4)
    # 结果形状仍然符合矩阵乘法规则
    print(torch.matmul(torch.randn(5, 4), torch.randn(3, 4, 5)).shape)


# 3. torch.bmm 函数的用法
def test03():
    # 批量点积运算
    # 第一个维度为 batch_size
    # data1 的形状为 (3, 4, 5)
    # data2 的形状为 (3, 5, 8)
    # torch.bmm 可以处理批量的矩阵乘法
    data1 = torch.randn(3, 4, 5)
    data2 = torch.randn(3, 5, 8)
    # 进行批量矩阵乘法运算,结果形状为 (3, 4, 8)
    data = torch.bmm(data1, data2)
    print(data.shape)

image.png
image.png

4、指定运算设备⭐

PyTorch 默认会将张量创建在 CPU 控制的内存中, 即: 默认的运算设备为 CPU。
我们也可以将张量创建在 GPU 上, 能够利用对于矩阵计算的优势加快模型训练。
将张量移动到 GPU 上有两种方法:

  1. 使用 cuda 方法
  2. 直接在 GPU 上创建张量
  3. 使用 to 方法指定设备
指定设备的方式示例代码代码解释
使用 cuda 方法python data = torch.tensor([10, 20, 30]) data = data.cuda() 使用 cuda() 方法将张量从 CPU 移动到 GPU。
在创建张量时指定设备python data = torch.tensor([10, 20, 30], device='cuda:0') 在创建张量时,通过 device 参数直接指定设备为 GPU。
使用 to 方法python data = torch.tensor([10, 20, 30]) data = data.to('cuda:0') 使用 to() 方法将张量从 CPU 移动到 GPU。
使用 cpu 方法python data = data.cpu() 使用 cpu() 方法将张量从 GPU 移动到 CPU。
使用 torch.devicepython device = torch.device("cuda" if torch.cuda.is_available() else "cpu") tensor = torch.randn(3, 4, 5, device=device) 使用 torch.device 动态选择设备,并在创建张量时指定设备。
# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/16 2:58
import torch
import torchvision


# 1. 使用 cuda 方法
def test01():
    data = torch.tensor([10, 20, 30])
    print('存储设备:', data.device)
    # 如果安装的不是 gpu 版本的 PyTorch
    # 或电脑本身没有 NVIDIA 卡的计算环境
    # 下面代码可能会报错
    data = data.cuda()
    print('存储设备:', data.device)
    # 使用 cpu 函数将张量移动到 cpu 上
    data = data.cpu()
    print('存储设备:', data.device)
    # 输出结果:
    # 存储设备: cpu
    # 存储设备: cuda:0
    # 存储设备: cpu


# 2. 直接将张量创建在 GPU 上
def test02():
    data = torch.tensor([10, 20, 30], device='cuda:0')
    print('存储设备:', data.device)
    # 使用 cpu 函数将张量移动到 cpu 上
    data = data.cpu()
    print('存储设备:', data.device)
    # 输出结果:
    # 存储设备: cuda:0
    # 存储设备: cpu


# 3. 使用 to 方法
def test03():
    data = torch.tensor([10, 20, 30])
    print('存储设备:', data.device)
    data = data.to('cuda:0')
    print('存储设备:', data.device)
    # 输出结果:
    # 存储设备: cpu
    # 存储设备: cuda:0


# 4. 存储在不同设备的张量不能运算
def test04():
    data1 = torch.tensor([10, 20, 30], device='cuda:0')
    data2 = torch.tensor([10, 20, 30])
    print(data1.device, data2.device)
    # RuntimeError: Expected all tensors to be on the same device,
    # but found at least two devices, cuda:0 and cpu!
    data = data1 + data2
    print(data)


def test05():
    # 检查CUDA是否可用,并选择设备
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # device = "cpu"
    print("Using device:", device)
    # 构建一个形状为 (3, 4, 5) 的随机张量,并指定设备
    tensor = torch.randn(3, 4, 5, device=device)
    print("Tensor:", tensor)
    print("Shape:", tensor.shape)
    print("Device:", tensor.device)
    data = torch.randn(5, 4, device=device)
    print(torch.matmul(tensor, data))


def test06():
    print("PyTorch版本: ", torch.__version__)  # 打印PyTorch版本
    print("torchvision版本 ", torchvision.__version__)  # 打印torchvision版本
    print("CUDA是否可用: ", torch.cuda.is_available())  # 检查CUDA是否可用


if __name__ == '__main__':
    test04()

5、解决在GPU运行PyTorch的问题

请参考我的这篇文章:https://xzl-tech.blog.csdn.net/article/details/140478985

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

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

相关文章

计算机的错误计算(三十二)

摘要 在计算机的错误计算(二十八)与(三十 一)中,我们探讨了 Visual Studio 对 6个随机exp(x)函数的计算精度问题。根据网友的反馈,本节将展示 Python 对它们的输出:结果几乎与 Visual Studio …

C# —— CRC16 算法

CRC16:即循环冗余校验码。数据通信当中一种常用的查错校验码 其特征信息字段和校验字段的长度可以是任意选定的,对数据进行指定多项式计算 并且将得到的结果附加在帧的后面,接受的设备也执行类似的算法,以保证数据传输的正确性和完整性 crc…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处: ELK 组件在大数据运维系统中,主要可解决的问题如下&…

录取查询老师在哪里制作?

随着考试的落幕,家长们焦急等待的心情终于可以稍微缓解,因为录取结果即将揭晓。然而,对于老师来说,这仅仅是另一项繁重工作的开始。他们需要将每一份录取通知单逐一发送给学生家长,这个过程不仅耗时而且容易出错。面对…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

数据结构 day4

目录 思维导图: 学习内容: 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录 浮点数存储规则 单\双精度浮点数 存储 S、M、E 的布局 有效数字M 和 指数位E 的特殊规定 浮点数在内存中是否存储的S、M、E 浮点数存储规则 根据国际标准IEEE754(电气和电子工程协会)规定:任意一个 浮点数F的二进制 都可以表示成…

19集 两款ESP32开发板如何选择?-《MCU嵌入式AI开发笔记》

19集 两款ESP32开发板我们用哪款?-《MCU嵌入式AI开发笔记》 有两款ESP32的开发板分别是ESP32 S3 和C3的,我们该如何选择? 1、ESP32-S3-BOX-3 在乐鑫官网上,https://www.espressif.com.cn/zh-hans/products/devkits 有ESP32S3 B…

Unity UGUI 之 Canvas画布

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.UGUI是什么 首先官方手册导向了这两个连接,里面是ugui的基本教程 帆布 |U…

【全面升级!短视频运营利器揭秘】短视频矩阵系统

短视频矩阵通常是指一种内容分发策略,它通过构建一个包含多种不同类型、主题或风格短视频的内容平台架构。这个矩阵可能会包括搞笑、教育、音乐、美食、旅游等各种短视频形式,让用户可以根据兴趣选择观看。每个视频可以视为矩阵中的一个节点,…

JVM-垃圾回收与内存分配

目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?(句柄和直接指针) Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word(hashcode、分代、锁标志位)、…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系,两个角色,一个交易场所。 三种关系: 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色: 生产者和消费者 一个交…

记录|C# winform布局学习

目录 前言一、自适应布局Step1. 添加AutoAdaptWindowsSize类Step2. Form中引用Step3. 创建SizeChanged事件函数Step4. 在Fram.Disiger中添加 更新时间 前言 参考视频: C#5分钟winform快速自适应布局 参考文章: 其他参考: 写这篇文章&#xff…

【python学习】python的知识点总结、特点和思考及解答(代码示例)

引言 python 是一种高级编程语言,具有简洁的语法和丰富的库,被广泛应用于Web开发、数据分析、人工智能、科学计算等领域 文章目录 引言一、python知识点总结1.1 基础语法1.1.1 变量和数据类型1.1.2 控制结构1.1.3 函数和模块 1.2 面向对象编程1.2.1 类和…

vue的三大核心知识点

响应式: 监听data属性getter setter(包括数组)模板编译: 模板到render函数再到vnodevdom: patch(elem, vnode)和patch(vnode, newVnode) vue组件初次渲染过程 解析模板为render函数(或在开发环境已完成,vue-loader&a…

Vue 对接海康威视,实现摄像头画面展示

文章目录 需求分析1. 下载2. 安装3. new 一个WebControl 插件相关实例 需求 项目中集成海康威视,实现摄像头画面展示 分析 1. 下载 传送门:官方插件包和文档下载 2. 安装 (1)下载完成后打开 (2)在项…

三款知名的基于RAG技术的智能体平台分析

这篇文章是关于目前市面上三款知名的基于检索增强生成(Retrieval-Augmented Generation, RAG)技术的智能体平台的详细对比分析。这三款产品分别是FastGPT、Dify和Coze。文章从不同维度分析了这些产品的优势和劣势,以供读者参考。 什么是RAG&…

【Qt之·类QRandomGenerator】

系列文章目录 文章目录 前言一、概述1.2. 二、实例演示总结 前言 一、概述 1. 2. 二、实例演示 示例1&#xff1a; #include <QRandomGenerator> #include <QRandomGenerator64> #include <QDebug>int randomInt QRandomGenerator::global()->bound…

ESP8266模块(2)

实例1 查看附近的WiFi 步骤1&#xff1a;进入AT指令模式 使用USB转串口适配器将ESP8266模块连接到电脑。打开串口终端软件&#xff0c;并设置正确的串口和波特率&#xff08;通常为115200&#xff09;。输入以下命令并按回车确认&#xff1a; AT如果模块响应OK&#xff0c;…

TCP状态转换详解

1.什么是TCP的状态转换 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中&#xff0c;连接的状态会随着不同阶段的通信而发生变化&#xff0c;这些变化被称为状…