【PyTorch快速入门教程】03 PyTorch基础知识

news2025/2/26 22:54:03

在PyTorch中,最小的计算单元是张量(tensor)。因此关于张量的学习还是至关重要的。通过本章节学习,希望你对张量有一个更清晰的了解。

文章目录

  • 1 什么是Tensor
  • 2 PyTorch中Tensor使用
    • 2.1 创建Tensor
      • 2.1.1 直接创建Tensor
      • 2.1.2 间接创建Tensor
      • 2.1.3 内置函数创建Tensor
  • 3 Tensor的广播机制
  • 4 PyTorch自动求导机制
  • 5 参考

1 什么是Tensor

那什么是Tensor呢?按我的理解就是多维矩阵,只不过在此基础上添加了求导操作。
在这里插入图片描述

因此,tonsor支持所有矩阵运算操作,我们可以方便地使用PyTorch中的内置函数完成。同时,PyTorch有自己的数据类型,包括torch.int64torch.uint64torch.float64等。在PyTorch中,我们只能使用PyTorch已定义的数据类型,并不支持自定义数据类型。

如果你想要了解更改tensor内容,参考官网网址:https://pytorch.org/docs/stable/tensors.html

2 PyTorch中Tensor使用

2.1 创建Tensor

创建Tensor有很多种方法,比如直接给定数据创建tensor、通过numpy创建tensor、通过内置函数创建tensor。下面分别对这三种方法讲解。

2.1.1 直接创建Tensor

tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False) -> Tensor

参数说明

  • data: 数据
  • dtype:数据类型。常见数据类型有torch.int8、torch.long、torch.float。更多数据类型请看: torch.Tensor
  • device:指定Tensor运算设备。可指定 CPU 或者单个/多个 GPU。
  • requires_grad:是否需要求导。
  • pin_menory:是否常驻内存。这需要你在内存资源和运行速度之间做权衡。

示例

# 创建tensor,用dtype指定类型。注意类型要匹配
a = torch.tensor(1.0, dtype=torch.float)
b = torch.tensor(1, dtype=torch.long)
c = torch.tensor(1.0, dtype=torch.int8)
print(a, b, c)
-------------输出---------------
tensor(1.) tensor(1) tensor(1, dtype=torch.int8)

2.1.2 间接创建Tensor

间接创建指的是已经存在一个矩阵,需要转成Tensor。一般Tensor创建的来源有两个:list 和 array,但我们可以只用一个函数搞定。

as_tensor(data, dtype=None, device=None) -> Tensor
  • List →Tensor
    l = [[1, 2], [3, 4]]
    t = torch.as_tensor(l)
    print(t)
    ----------------------输出----------------------
    tensor([[1, 2],
        	[3, 4]])
    
  • Array → Tensor
    g = np.array([[1, 2, 3], [4, 5, 6]])
    i = torch.from_numpy(g)
    print(i)
    ---------------------输出------------------------
    tensor([[1, 2, 3],
       	    [4, 5, 6]], dtype=torch.int32)
    

注意:torch.tensor创建得到的张量和原数据是不共享内存的,张量对应的变量是独立变量。
而torch.from_numpy()和torch.as_tensor()从numpy array创建得到的张量和原数据是共享内存的,张量对应的变量不是独立变量,修改numpy array会导致对应tensor的改变。

2.1.3 内置函数创建Tensor

对于比较规则的Tensor可以通过PyTorch的内置函数进行创建。

# 常见的构造Tensor的函数
k = torch.rand(2, 3)
l = torch.ones(2, 3)
m = torch.zeros(2, 3)
n = torch.arange(0, 10, 2)
print(k, "\n", l, "\n", m, "\n", n)
----------------------输出-----------------------------
tensor([[0.4003, 0.3830, 0.0535],
        [0.6541, 0.4363, 0.7456]]) 
 tensor([[1., 1., 1.],
        [1., 1., 1.]]) 
 tensor([[0., 0., 0.],
        [0., 0., 0.]]) 
 tensor([0, 2, 4, 6, 8])

3 Tensor的广播机制

在数学上,如果两个矩阵维度不符合运算原则是不允许运算的。但在PyTorch中,有一种情况例外,这就涉及到矩阵的广播机制。

矩阵的广播机制是指让两个不同shape的数组能够做一些运算,需要对参与运算的两个数组做一些处理或者说扩展,最终是参与运算的两个数组的shape一样,然后广播计算(对应位置数据进行某运算)得到结果。

当我们在进行元素级运算时常常会使用广播机制来提高代码可读性。

规则

比较两个数组的shape,从shape的尾部开始一一比对。

  1. 如果两个数组的维度相同,对应位置上轴的长度相同或其中一个的轴长度为1,广播兼容,可在轴长度为1的轴上进行广播机制处理。

  2. 如果两个数组的维度不同,那么给低维度的数组前扩展提升一维,扩展维的轴长度为1,然后在扩展出的维上进行广播机制处理。

比如下面这个例子,A矩阵是二维矩阵 [[1], [2], [3], [4], [5], [6]],B矩阵是一维矩阵 [2, 3]

  1. B 矩阵升维成二维矩阵 [[2, 3]]
  2. A 矩阵拓展 [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]
  3. B 矩阵拓展 [[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]]
  4. A + B
    在这里插入图片描述
a = torch.arange(1, 7).view(6, 1)
print(a)
b = torch.arange(2, 4)
print(b)
print(a + b)
----------------------输出-----------------------------
tensor([[1],
        [2],
        [3],
        [4],
        [5],
        [6]])
tensor([2, 3])
tensor([[3, 4],
        [4, 5],
        [5, 6],
        [6, 7],
        [7, 8],
        [8, 9]])

4 PyTorch自动求导机制

torch.Tensor 是这个包的核心类。如果设置它的属性 .requires_grad 为 True,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用 .backward(),来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad属性。

这里将通过一个简单的函数 y = x 1 + 2 ∗ x 2 y=x_1+2*x_2 y=x1+2x2 来说明PyTorch自动求导的过程

import torch

x1 = torch.tensor(1.0, requires_grad=True)
x2 = torch.tensor(2.0, requires_grad=True)
y = x1 + 2 * x2
print(y)

## 反向传播后看导数大小, 导数是会累积的,重复运行相同命令,grad会增加
# 所以每次计算前需要清除当前导数值避免累积,这一功能可以通过pytorch的optimizer实现。或者调用zero_()
x1.grad.data.zero_()
x2.grad.data.zero_()
y.backward()
print(x1.grad.data)
print(x2.grad.data)
--------------------------输出------------------------
tensor(5., grad_fn=<AddBackward0>)
tensor(1.)
tensor(2.)

5 参考

  1. torch.Tensor - PyTorch, 2023
  2. NumPy广播机制详解 - Python学习园, 2024
  3. 2.2 自动求导 - ZhikangNiu, 深入浅出PyTorch, 2024

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

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

相关文章

anaconda上安装pytorch

1、选择anaconda prompt 2、创建虚拟环境 3、激活进入虚拟环境 4、安装pytorch 怎么得到上面的这串命令&#xff1f; 输入nvidia-smi&#xff0c;查看cuda的版本号为11.7 我这里选择安装cuda的版本号为11.3&#xff0c;满足向下兼容即可。 在安装深度学习环境时&#xff0c;要…

探索《黑神话·悟空》背后的AI技术支持:英伟达全景光线追踪技术、DLSS 3.5 与帧生成

引言 2023 年&#xff0c;游戏《黑神话悟空》以其震撼的视觉效果和深度沉浸的游戏体验&#xff0c;成为全球玩家热议的焦点。这款游戏在发布初期就取得了惊人的销量&#xff1a;预售阶段便突破 120 万套&#xff0c;而发售首日更是达到 450 万份的惊人成绩。这个现象级作品背后…

走进 “星星的孩子” 的世界:理解与关爱儿童自闭症

在这个充满生机与活力的世界里&#xff0c;有一群特殊的孩子&#xff0c;他们仿佛来自遥远的星球&#xff0c;沉浸在自己的独特世界中&#xff0c;难以与外界进行有效的沟通和互动。他们是自闭症儿童&#xff0c;也被称为 “星星的孩子”。 自闭症&#xff0c;又称孤独症谱系障…

Linux 软件编程 数据库

1. 大批量数据存储和管理时使用数据库 2.创建表 create table 表名称(列1 数据类型, 列2 数据类型, ...); 3.插入表 insert into 表名称 values(值1, 值2, ...); 4.查看表 select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc; 5.删除表 delete from …

种田RPG游戏(五)

一、重新设置物品栏 1、打开Scripts-Inventory文件新建 ItemSlotData.cs using System.Collections; using System.Collections.Generic; using UnityEngine;[System.Serializable] //单独的类 public class ItemSlotData {public ItemData itemData;//ItemData对象&#xff…

Java 入门指南:Queue 接口

Collection 接口 Collection 接口提供了一系列用于操作和管理集合的方法&#xff0c;包括添加、删除、查询、遍历等。它是所有集合类的根接口&#xff0c;包括 List、Set、Queue 等。 Collection 接口常见方法 add(E element)&#xff1a;向集合中添加元素。 addAll(Collecti…

大模型笔记之-XTuner微调个人小助手认知

前言 使用XTuner 微调个人小助手认知 一、下载模型 #安装魔搭依赖包 pip install modelscope新建download.py内容如下 其中Shanghai_AI_Laboratory/internlm2-chat-1_8b是魔搭对应的模型ID cache_dir/home/aistudio/data/model’为指定下载到本地的目录 from modelscope im…

Stable Diffusion的微调方法原理总结

目录 1、Textural Inversion&#xff08;简易&#xff09; 2、DreamBooth&#xff08;完整&#xff09; 3、LoRA&#xff08;灵巧&#xff09; 4、ControlNet&#xff08;彻底&#xff09; 5、其他 1、Textural Inversion&#xff08;简易&#xff09; 不改变网络结构&…

Ciallo~(∠・ω・ )⌒☆第二十五篇 Redis

Redis 是一个高性能的键值存储数据库&#xff0c;它能够在内存中快速读写数据&#xff0c;并且支持持久化到磁盘。它被广泛应用于缓存、队列、实时分析等场景。 一、启动redis服务器 要打开redis服务器&#xff0c;需要在终端中输入redis-server命令。确保已经安装了redis&…

【Java】/* 链式队列 和 循环队列 - 底层实现 */

一、链式队列 1. 使用双向链表实现队列&#xff0c;可以采用尾入&#xff0c;头出 也可以采用 头入、尾出 (LinkedList采用尾入、头出) 2. 下面代码实现的是尾入、头出&#xff1a; package bageight;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: …

mOTA v2.0

mOTA v2.0 一、简介 本开源工程是一款专为 32 位 MCU 开发的 OTA 组件&#xff0c;组件包含了 bootloader 、固件打包器 (Firmware_Packager) 、固件发送器 三部分&#xff0c;并提供了基于多款 MCU (STM32F1 / STM32F407 / STM32F411 / STM32L4) 和 YModem-1K 协议的案例。基…

【文献及模型、制图分享】2000—2020年中国青饲料播种面积及供需驱动因素的时空格局

文献介绍 高产、优质的青饲料对于国家畜牧业发展和食物供给至关重要。然而&#xff0c;当前对于青饲料播种面积时空变化格局及其阶段性特征、区域差异以及影响因素等尚未清楚。 本文基于省级面板数据分析了2000—2020年青饲料种植的时空格局变化&#xff0c;结合MODIS-NPP产品…

Nginx 405 not allowed

问题原因&#xff1a;nginx不允许静态文件被post请求 解决&#xff1a;添加error_page 405 200 $request_uri;

白酒与家庭:团圆时刻的需备佳品

在中国传统文化中&#xff0c;家庭是社会的基石&#xff0c;是每个人心灵的港湾。而团圆&#xff0c;则是家庭生活中较美好的时刻。在这样一个特殊的日子里&#xff0c;白酒&#xff0c;尤其是豪迈白酒&#xff08;HOMANLISM&#xff09;&#xff0c;成为了团圆时刻的需备佳品。…

了解JS数组元素及属性

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、定义数组并输出2、查询数组的长度3、访问数组的第一个元素4、访问数组中第一个元素的xxx属性5、从数组元素中提取ID并存储到搜索参数对象 提示&#xff1a;以下是…

C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)

饿汉单例模式 程序还没有主动获取实例对象&#xff0c;该对象就产生了&#xff0c;也就是程序刚开始运行&#xff0c;这个对象就已经初始化了。 class Singleton { public:~Singleton(){std::cout << "~Singleton()" << std::endl;}static Singleton* …

KUKA KR C2 中文操作指南 详情见目录

KUKA KR C2 中文操作指南 详情见目录

Selenium + Python 自动化测试22(PO+数据驱动)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架结合起来使用。 本篇文章我们综合一下之前学习的内容&#xff0c;如先将PO模式、数据驱动思想和我们生成HTML报告融合起来&#xff0c;综…

​2024年AI新蓝海:三门生意如何借AI之力,开启变现新篇章

【导语】在这个日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是正逐步渗透到我们生活的方方面面&#xff0c;成为推动产业升级的重要力量。你是否还在为传统行业的未来而忧虑&#xff1f;别担心&#xff0c;AI正以其…

Pandas DataFrame 数据转换处理和多条件查询

工作中需要处理一个比较大的数据&#xff0c;且当中需要分析的日期类型字段为字符串型&#xff0c;需要进行转换&#xff0c;获得一个新的字段用于时间统计。我们应用 datetime.datetime.strptime 函数进行转换。 数据读取与时间列补充代码如下&#xff1a; import pandas as…