当前位置: 首页 > article >正文

2025-04-23 Python深度学习3——Tensor

文章目录

  • 1 张量
    • 1.1 数学定义
    • 1.2 PyTorch中的张量
  • 2 创建 Tensor
    • 2.1 直接创建
      • **`torch.tensor()`**
      • **`torch.from_numpy()`**
    • 2.2 依据数值创建
      • **`torch.zeros() / torch.zeros_like()`**
      • **`torch.ones() / torch.ones_like()`**
      • **`torch.full() / torch.full_like()`**
      • **`torch.arange() / torch.linspace`**
      • **`torch.eye()`**
    • 2.3 依概率分布创建张量
      • **`torch.normal()`**
      • **`torch.rand() / torch.rand_like()`**
      • **`torch.randint() / torch.randint_like()`**
      • **`torch.randperm()`**
      • **`torch.bernoulli()`**
  • 3 张量操作
    • 3.1 拼接
      • **`torch.cat()`**
      • **`torch.stack()`**
    • 3.2 切分
      • **`torch.chunk()`**
      • **`torch.split()`**
    • 3.3 索引
      • **`torch.index_select()`**
      • **`torch.masked_select()`**
    • 3.4 变换
      • **`torch.reshape()`**
      • **`torch.transpose()`**
      • **`torch.t()`**
      • **`torch.squeeze()`**
      • **`torch.unsqueeze()`**
  • 4 线性回归案例

本文环境:

  • Pycharm 2025.1
  • Python 3.12.9
  • Pytorch 2.6.0+cu124

1 张量

1.1 数学定义

  • 张量是多维数组的泛化形式,涵盖标量(0维)、向量(1维)、矩阵(2维)及更高维结构。
  • 示例:
    • RGB 图像用三维张量表示,维度为 (高度, 宽度, 通道数),其中通道对应红、绿、蓝三色。
image-20250422113009830

1.2 PyTorch中的张量

​ PyTorch 中的张量不仅是多维数组,还是自动求导(Autograd)的核心组件。PyTorch 0.4.0 之前,Variable类型封装张量以实现自动求导;0.4.0后合并到Tensor中,简化了API。

Variable

​ Variable 是 torch.autograd 中的数据类型,主要用于封装 Tensor,进行自动求导。

  • data:被包装的 Tensor。
  • grad:data 的梯度。
  • grad_fn:创建 Tensor 的 Function,是自动求导的关键。
  • requires_grad:指示是否需要梯度。
  • is leaf:指示是否是叶子结点(张量)。
image-20250422113219061

​ PyTorch0.4.0 版开始,Variable 并入 Tensor。

  • dtype:张量的数据类型,如 torch.FloatTensortorch.cuda.FloatTensor
  • shape:张量的形状,如 (64, 3, 224, 224)。
  • device:张量所在设备,GPU/CPU,是加速的关键。
image-20250422113342736

数据类型分类

  • 浮点型:torch.float16torch.float32(常用)、torch.float64
  • 整型:torch.int8torch.uint8torch.int16torch.int32torch.int64(标签常用)。
  • 布尔型:torch.bool

2 创建 Tensor

2.1 直接创建

torch.tensor()

image-20250422114533426

​ 功能:直接创建张量。

  • data:输入数据(列表或 NumPy 数组)。
  • dtype:数据类型(默认与输入一致)。
  • device:设备(如cuda:0)。
  • requires_grad:是否需要梯度(默认False)。
  • pin_memory:是否锁页内存(通常False)。
import torch
import numpy as nparr = np.ones((3, 3))
t = torch.tensor(arr, device='cuda:0', requires_grad=True)t
image-20250422114441567

torch.from_numpy()

image-20250422115234275

​ 功能:从 numpy 创建 tensor。

​ 特点:与 NumPy 数组共享内存,修改一方会影响另一方。

image-20250422114702598
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)arr, t
image-20250422114920132

​ 修改 arr 中的数据后,t 中的数据也发生变化。

arr[0, 0] = -1arr, t
image-20250422114954710

2.2 依据数值创建

torch.zeros() / torch.zeros_like()

image-20250422115801857 image-20250422120030828

​ 功能:依 size 创建全 0 张量 / 依 input 形状创建全 0 张量。

  • torch.zeros()

    • size:张量的形状,如(3,3)、(3, 224, 224)。

    • out:将输出张量赋值给哪个张量。

    • layout:内存中布局形式,有 strided,sparse_coo 等。

  • torch.zeros_like()

    • input:创建与 input 同形状的全 0 张量。
    • memory_format:张量的内存格式,默认为 torch.preserve_format
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t)  # out_t会被覆盖为全零t, out_t, id(t), id(out_t)  # out_t和t内存一致
image-20250422115440671

torch.ones() / torch.ones_like()

​ 功能:依 size 创建全 1 张量 / 依 input 形状创建全 1 张量。

​ 与 torch.zeros() / torch.zeros_like() 类似。

torch.full() / torch.full_like()

image-20250422120651090

​ 功能:依 size 创建全 fill_value 张量 / 依 input 形状创建全 fill_value 张量。

  • size:张量的形状,如 (3, 3)。
  • fill_value:张量的值。

torch.arange() / torch.linspace

image-20250423152230993 image-20250423152712595
  • torch.arange

    创建等差数列,区间为 [start, end),公差为 step

    torch.arange(2, 10, 2)
    
    image-20250423152806179
  • torch.linspace

    创建均分数列,区间为 [start, end],个数为 steps

    torch.linspace(2, 10, 9)
    
image-20250423152833851

torch.eye()

image-20250423153028584

​ 功能:创建单位对角矩阵(2维张量),默认为方阵。

  • n:每阵行数。
  • m:矩阵列数。
torch.eye(3, 5)
image-20250423153058152

2.3 依概率分布创建张量

torch.normal()

image-20250423154413627

​ 功能:生成正态分布(高斯分布)

  • mean:均值。
  • std:标准差。

依据 meanstd 的类型,可分为四种模式:

  1. mean为标量,std为标量(需指定size

    torch.normal(0, 1, size=(4, 1))
    
    image-20250423154002271
  2. mean为标量,std为张量(输出形状与std一致)

    mean = 1
    std = torch.arange(1, 5, dtype=torch.float)
    t = torch.normal(mean, std)mean, std, t
    
    image-20250423154251810
  3. mean为张量,std为标量(输出形状与mean一致)

    mean = torch.arange(1, 5, dtype=torch.float)
    std = 1
    t = torch.normal(mean, std)mean, std, t
    
    image-20250423154157605
  4. mean为张量,std为张量(每个元素从不同分布采样)

    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t = torch.normal(mean, std)mean, std, t
    
    image-20250423153711349

torch.randn() / torch.randn_like()

image-20250423154807318

​ 功能:生成标准正态分布 / 依 input 形状生成标准正态分布(均值为 0,方差为 1)。

  • size:张量的形状。
  • generator:用于采样的为随机数生成器。
torch.randn((3, 2))
image-20250423155502756

torch.rand() / torch.rand_like()

image-20250423155600645

​ 功能:在区间 [0, 1) 上,生成均匀分布。

torch.rand((3, 2))
image-20250423155534966

torch.randint() / torch.randint_like()

image-20250423155736068

​ 功能:区间 [low, high) 生成整数均匀分布。

  • low:区间左值。

  • high:区间右值。

  • size:张量的形状。

torch.randint(0, 10, (3, 2))
image-20250423155852375

torch.randperm()

image-20250423160121915

​ 功能:生成生成从 0 到 n-1 的随机排列。

  • n:张量的长度。
torch.randperm(8)
image-20250423160100807

torch.bernoulli()

image-20250423160237544

​ 功能:以 input 为概率,生成伯努力分布(0-1 分布,两点分布)

  • input:表示概率值的张量。
t, torch.bernoulli(t)
image-20250423160224724

3 张量操作

3.1 拼接

torch.cat()

image-20250423161029534

​ 功能:将张量按维度 dim 进行拼接,需要保证其他维度大小相同。

  • tensors:张量序列。
  • dim:要拼接的维度。
t = torch.ones((2, 3))t_0 = torch.cat([t, t], dim=0)
t_1 = torch.cat([t, t], dim=1)t_0, t_1
image-20250423161009976

torch.stack()

image-20250423161830867

​ 功能:在新创建的维度 dim 上进行堆叠,所有输入张量的形状必须一致。

  • tensors:张量序列。
  • dim:要堆叠的维度。
t1 = torch.tensor([1, 2])
t2 = torch.tensor([3, 4])
t_stack = torch.stack([t1, t2], dim=0)
t_stack, t_stack.shape
image-20250423161814422

3.2 切分

torch.chunk()

image-20250423162040909

​ 功能:将张量按维度 dim 进行平均切分。

​ 返回值:张量列表。

​ 注意事项:若不能整除,最后一份张量小于其他张量。

  • input:要切分的张量。
  • chunks:要切分的份数。
  • dim:要切分的维度。
t = torch.ones((2, 5))
list_t = torch.chunk(t, 2, dim=1)
list_t
image-20250423162102727

torch.split()

image-20250423162403459

​ 功能:将张量按维度 dim 进行切分。

​ 返回值:张量列表。

  • tensor:要切分的张量。
  • split_size_or_sections
    • 为 int 时,表示每一份的长度;
    • 为 list 时,list 中每个元素表示切割的长度,list 中元素之和与维度不等时报错。
  • dim:要切分的维度。
t = torch.ones((2, 5))
list_t = torch.split(t, 2, dim=1)
list_t
image-20250423162343432

3.3 索引

torch.index_select()

image-20250423162741366

​ 功能:在维度 dim 上,按 index 索引数据。

​ 返回值:依 index 索引数据拼接的张量。

  • input:要索引的张量。
  • dim:要索引的维度。
  • index:要索引数据的序号,类型需要为 long。
t = torch.randint(0, 9, size=(3, 3))
t_index = torch.tensor([0, 2])
t_select = torch.index_select(t, dim=1, index=t_index)t, t_select
image-20250423162726699

torch.masked_select()

image-20250423163607734

​ 功能:按 mask 中的 True 进行索引。

​ 返回值:一维张量。

  • input:要索引的张量。
  • mask:与 input 同形状的布尔类型张量。
t = torch.randint(0, 9, size=(3, 3))
t_mask = t.ge(5)  # ge is mean greater than or equal
t_select = torch.masked_select(t, mask=t_mask)t_mask, t_select
image-20250423163251997

3.4 变换

torch.reshape()

image-20250423163854660

​ 功能:变换张量形状。

​ 注意事项:当张量在内存中是连续时,新张量与 input 共享数据内存。

  • input:要变换的张量。
  • shape:新张量的形状。
t = torch.randperm(8)t, t.reshape((2, -1))  # -1 表示自动计算,(2, -1) 等价于 (2, 4)
image-20250423163834368

torch.transpose()

image-20250423164713625

​ 功能:交换张量的两个维度。

  • input:要变换的张量。
  • dim0:要交换的维度。
  • dim1:要交换的维度。
t = torch.rand((2, 3, 4))
t_transpose = torch.transpose(t, dim0=1, dim1=2)t, t_transpose
image-20250423164640828

torch.t()

image-20250423165304285

​ 功能:2 维张量转置,对矩阵而言,等价于 torch.transpose(input, 0, 1)

torch.squeeze()

image-20250423165757804

​ 功能:压缩长度为 1 的维度(轴)

  • dim
    • 若为 None,移除所有长度为 1 的轴;
    • 若指定维度,当且仅当该轴长度为 1 时,可以被移除。
t = torch.rand((1, 2, 3, 1))
t_sq = torch.squeeze(t)
t_sq0 = torch.squeeze(t, dim=0)
t_sq1 = torch.squeeze(t, dim=1)t.shape, t_sq.shape, t_sq0.shape, t_sq1.shape
image-20250423165653890

torch.unsqueeze()

image-20250423165825448

​ 功能:依据 dim 扩展维度。

  • dim:扩展的维度。

4 线性回归案例

import torch
import matplotlib.pyplot as plt# 生成随机数据点,x为0-10之间的随机数
x = torch.rand(20) * 10
# y基于x线性生成,并添加一些噪声
y = 2 * x + torch.randn(20) * 3# 初始化权重w和偏置b,requires_grad=True表示它们在后续计算中需要梯度
w = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)# 定义学习率
lr = 0.01# 迭代200次进行梯度下降
for i in range(200):# 计算预测值y_pred = w * x + b# 计算损失,均方误差的一半loss = torch.mean(0.5 * (y_pred - y) ** 2) / len(x)# 反向传播计算梯度loss.backward()# 更新权重w和偏置b,注意使用.no_grad()确保更新操作不被跟踪w.data -= lr * w.gradb.data -= lr * b.grad# 清零梯度,为下一次迭代做准备w.grad.zero_()b.grad.zero_()# 每20次迭代显示一次当前的数据分布和拟合直线if (i + 1) % 20 == 0:plt.rcParams['figure.figsize'] = (2.0, 1.6)# 绘制散点图plt.scatter(x.numpy(), y.numpy(), s=3)# 绘制当前拟合的直线plt.plot(x.numpy(), y_pred.detach().numpy(), 'r-', lw=0.5)# 显示当前的损失plt.text(2, 15, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 8, 'color': 'red'})plt.title('Iteration: {:d}'.format(i + 1))# 暂停0.5秒,以便观察变化plt.pause(0.5)
image-20250423220954285

相关文章:

2025-04-23 Python深度学习3——Tensor

文章目录 1 张量1.1 数学定义1.2 PyTorch中的张量 2 创建 Tensor2.1 直接创建**torch.tensor()****torch.from_numpy()** 2.2 依据数值创建**torch.zeros() / torch.zeros_like()****torch.ones() / torch.ones_like()****torch.full() / torch.full_like()****torch.arange() …...

在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理

在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理 在内网环境中,直接访问外部资源可能会受到限制,这时候配置APT和GIT的代理就显得尤为重要。本文将详细介绍如何在统信UOS和麒麟Kylin OS操作系统中配置APT和GIT的代理。 为什么需要配置APT和GIT代理&…...

spring,spring boot, spring cloud三者区别

Spring Framework vs Spring Boot vs Spring Cloud 1. Spring Framework 定位:基础框架,提供核心的IoC容器、AOP、事务管理、数据访问、Web MVC等能力。特点: 模块化设计:可单独使用某些模块(如仅用Spring JDBC&…...

第十七讲、Isaaclab中使用操作空间控制器

0 前言 官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/05_controllers/run_osc.html IsaacsimIsaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm1001.2014.3001.5502 有时候,仅使用…...

基于SpringBoot的校园二手商品在线交易系统+含项目运行说明文档

基于SpringBoot的校园二手商品在线交易系统含项目运行说明文档 专注校园二手交易平台是一个基于Java的在线市场,专为学生设计,便于买卖二手商品。平台提供全面的用户管理功能,包括学生、管理员和二手商品卖家账户管理。商品管理功能允许用户…...

电商行业下的Java核心、Spring生态与AI技术问答

电商行业下的Java核心、Spring生态与AI技术问答 在互联网大厂求职的Java程序员马架构,今天参加了一场关于电商行业的技术面试。以下是面试官和马架构之间的5轮提问和回答。 第一轮提问 问题1:请简要描述一下电商系统中的高并发处理方案。问题2&#x…...

面向电力变压器的声纹智能诊断系统简析

面向电力变压器的声纹智能诊断系统是一种利用声纹识别技术对电力变压器运行状态进行实时监测和故障诊断的系统。以下是其简要分析: 系统组成 感知层:主要由声纹传感器和振动传感器组成。声纹传感器一般采用高灵敏度麦克风,用于采集变压器向…...

《浔川AI翻译v6.1.0问题已修复公告》

《浔川AI翻译v6.1.0问题已修复公告》 尊敬的浔川AI翻译用户: 感谢您对浔川AI翻译的支持与反馈!我们已针对 **v6.1.0** 版本中用户反馈的多个问题进行了全面修复,并优化了系统稳定性。以下是本次修复的主要内容: 已修复问题 ✅…...

详解springcloud gateway工作原理、断言、filter、uri、id、全局跨域、globalfilter等以及关键源码实现

1.gateway概念 网关就是当前微服务项目的"统一入口"程序中的网关就是当前微服务项目对外界开放的统一入口所有外界的请求都需要先经过网关才能访问到我们的程序提供了统一入口之后,方便对所有请求进行统一的检查和管理 2. 网关的主要功能 将所有请求统一经过网关网…...

C++面向对象特性之继承篇

C语音是面向过程的语言,而C在其之上多了面向对象的特性,面向对象三大特性:封装性、继承性、多态性。今天主包来讲讲自己学到的关于C继承特性的知识。 一、继承是什么 继承是提高代码复用的一种重要手段。正如C的模版、泛型编程等等都是为了实现代码复用…...

【Java设计模式及实践学习-第4章节-结构型模式】

第4章节-结构型模式 笔记记录 1. 适配器模式2. 代理模式3. 装饰器模式4. 桥接模式5. 组合模式6. 外观模式7. 享元模式8. 总结 1. 适配器模式 2. 代理模式 3. 装饰器模式 4. 桥接模式 5. 组合模式 6. 外观模式 7. 享元模式 Java语言中的String字符串就使用了享元模式&…...

【AI News | 20250423】每日AI进展

AI Repos 1、suna Suna是一款完全开源的AI助手,旨在通过自然对话帮助用户轻松完成现实世界的任务。它作为您的数字伙伴,提供研究、数据分析和日常问题解决等功能,并结合强大的能力与直观的界面,理解您的需求并交付成果。Suna的工…...

大数据利器Kafka

大数据利器Kafka:从入门到实战的全面指南 在大数据的世界里,Kafka就像是一个高效的“数据快递员”,负责在不同的系统之间快速、可靠地传递数据。今天,咱们就一起来深入了解一下这个强大的工具。Kafka是由LinkedIn开发的分布式发布…...

.NET、java、python语言连接SAP系统的方法

💡 本文会带给你 可用哪些技术与Sap系统连接怎样用Rfc技术连接SAP一. SAP系统与外部系统集成技术 SAP系统提供了多种方式供Java、.NET、Python等外部编程语言进行连接和集成。 1. RFC (Remote Function Call) 连接 适用语言:Java, .NET, Python, 其他支持RFC的编程语言 …...

【学习准备】算法和开发知识大纲

1 缘起 今年(2025年)的职业升级结果:不通过。没办法升职加薪了。 需要开始完善学习,以应对不同的发展趋势,为了督促自己学习,梳理出相关学习大纲。 分为算法和开发两部分。 算法,包括基础算法和…...

【Nova UI】七、SASS 全局变量体系:组件库样式开发的坚固基石

序言 咱们已经实现了 SASS 中一系列实用的函数和混入,可它们究竟如何在实际的组件库样式开发里大展身手,尤其是在构建全局变量体系这一关键环节呢🧐?这篇文章将为你揭晓答案,带你深入了解怎样利用这些工具实现 SASS 全…...

第七篇:linux之基本权限、进程管理、系统服务

第七篇:linux之基本权限、进程管理、系统服务 文章目录 第七篇:linux之基本权限、进程管理、系统服务一、基本权限1、什么是权限?2、为什么要有权限?3、权限与用户之间的关系?4、权限对应的数字含义5、使用chmod设定权…...

Windows 同步技术-一次性初始化

组件通常设计为在首次调用时执行初始化任务,而不是加载它们时。 一次性初始化函数可确保此初始化仅发生一次,即使多个线程可能尝试初始化也是如此。 Windows Server 2003 和 Windows XP: 应用程序必须使用 互锁函数 或其他同步机制提供自己的…...

爬虫案例-爬取某企数据

文章目录 1、准备要爬取企业名称数据表2、爬取代码3、查看效果 1、准备要爬取企业名称数据表 企业名称绍兴市袍江王新国家庭农场绍兴市郑杜粮油专业合作社绍兴市越城区兴华家庭农场绍兴市越城区锐意家庭农场绍兴市越城区青甸畈家庭农场绍兴市袍江王新国家庭农场绍兴市袍江月明…...

VAE-LSTM异常检测模型复刻报告

VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法,用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下: Python 3.…...

学习笔记—C++—string(一)

目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器(二) string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…...

OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…...

GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)

今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试&#xff0c…...

MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)

专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...

zkPass案例实战之合约篇

目录 一、contracts/contracts/ProofVerifier.sol 1. License 和 Solidity 版本 2. 导入依赖 3. 合约声明和默认分配器地址 4. 验证证明 5. 验证分配器签名 6. 验证验证者签名 7. 签名前缀处理 8. 签名恢复 总结 二、contracts/contracts/SampleAttestation.sol 1. …...

15.FineReport动态展示需要的列

1.首先连接自带的sqlite数据库,具体方法参考下面的链接 点击查看连接sqlite数据库 2.文件 – 新建普通报表 3.新建数据库查询 4.查询自带的销售明细表 5.把数据添加到格子中,并设置边框颜色等格式 6.查询新的数据集:column 7.点笔 8.全部添…...

Windows云主机远程连接提示“出现了内部错误”

今天有人反馈说有个服务器突然连不上了,让我看下什么问题,我根据他给的账号密码试了下发现提示“出现了内部错误”,然后就是一通排查 先是查看安全组,没发现特别的问题,因为也没有调过这块的配置 然后通过控制台登录进…...

最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程

大家好,我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作,想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体,以一个销售行业数据为例,可以快速实现自动清洗Exc…...

如何安装Visio(win10)

首先下载下面这些文件 HomeStudent2021Retail.img officedeploymenttool_17531-20046.exe office中文语言包.exe 确保这些文件都在一个文件夹内(我已经上传这些资源,这些资源都是官网下载的) 官网资源下载教程 1.下载Office镜像&#xff0…...

建筑安全员 A 证与 C 证:差异决定职业方向

在建筑行业的职业发展道路上,安全员 A 证和 C 证就像两条不同的岔路,它们之间的差异,在很大程度上决定了从业者的职业方向。 从证书性质和用途来看,A 证是从业资格证书,更像是一把开启安全管理高层岗位的 “金钥匙”。…...