PyTorch大白话解释算子二

目录

一、reshape

1. 什么是 Reshape?

2. Reshape 的核心作用

​① 数据适配

​② 维度对齐

​③ 特征重组

3. Reshape 的数学表示

 4.代码示例

5.permute()方法

 6.view()方法

7. Reshape 的注意事项

​① 数据连续性

​② 维度顺序

​③ 性能优化

 二、sequenze 和 unequenze

1. Sequence(序列)是什么?

2. Unsequence(非序列)是什么?

1. 填充(Padding)​

三、concat、stack、expand 和 flatten

1. concat(拼接)​

​功能​

关键点​

2. stack(堆叠)​

​功能​

关键点​

3. expand(扩展)​

​功能​

关键点​

4. flatten(展平)​

​功能​

关键点​

5. 对比总结

四、pointwise

五、split和slice


一、reshape

返回一个具有与输入相同的数据和元素数量,但具有指定形状的张量。如果可能的话,返回的张量将是输入的视图。否则,它将是一个副本。连续的输入和具有兼容步幅的输入可以进行重塑而无需复制,但您不应依赖于复制与视图行为。

1. 什么是 Reshape?

  • 核心功能:改变张量的维度(形状),但不改变其元素内容和存储顺序。
  • 数学本质:通过重新排列索引,将原张量映射到新的形状空间。

2. Reshape 的核心作用

① 数据适配
  • 将数据转换为模型输入要求的形状(如 [batch_size, channels, height, width])。
  • 示例:将 [100, 784](MNIST 图像展平)转换为 [100, 1, 28, 28]
② 维度对齐
  • 在矩阵乘法、卷积等操作中,确保输入张量的维度匹配。
  • 示例:将 [3, 5, 5] 转换为 [3, 1, 5, 5] 以适配卷积层。
③ 特征重组
  • 提取特定维度的特征(如将 [batch, height, width, channels] 转换为 [batch, channels, height, width])。

3. Reshape 的数学表示

  • 输入形状(N, C_in, H_in, W_in)
  • 输出形状(N, C_out, H_out, W_out)
  • 关键约束:N×Cin​×Hin​×Win​=N×Cout​×Hout​×Wout​即总元素数量必须保持不变。

 4.代码示例

# 输入:[2, 3, 5, 5]
x = torch.randn(2, 3, 5, 5)

# Reshape to [2, 15, 5]
y = x.reshape(2, -1, 5)
print(y.shape)  # torch.Size([2, 15, 5])

5.permute()方法

  • 功能:重新排列张量的轴顺序(不改变元素值)。
# 输入:[batch=2, channels=3, height=5, width=5]
x = torch.randn(2, 3, 5, 5)

# 将 channels 和 height 交换
y = x.permute(0, 2, 1, 3)  # 输出形状:[2, 5, 3, 5]
print(y.shape)

 6.view()方法

  • 功能:返回一个与原张量共享内存的新视图(需数据连续)。
import torch

# 输入:[batch=2, channels=3, height=5, width=5]
x = torch.randn(2, 3, 5, 5)

# Reshape to [2, 15, 5](3 * 5=15)
y = x.view(2, -1, 5)  # -1 表示自动计算剩余维度
print(y.shape)  # torch.Size([2, 15, 5])

7. Reshape 的注意事项

① 数据连续性
  • view():要求原张量数据连续,否则会报错。
  • reshape():允许非连续数据,但会复制内存,可能影响性能。
② 维度顺序
  • 使用 permute() 时需明确指定轴顺序,避免逻辑错误。
③ 性能优化
  • 尽量使用 view() 而非 reshape() 以复用内存。

 二、sequenze 和 unequenze

1. Sequence(序列)是什么?

  • 定义:按顺序排列的数据,每个元素之间存在时间或逻辑上的依赖关系。
  • 常见场景
    • 自然语言处理(NLP)​:句子、单词序列。
    • 时间序列分析:股票价格、传感器数据。
    • 语音识别:音频信号帧序列。
  • 数学形式:X=[x1​,x2​,...,xT​],其中 T 是序列长度。

2. Unsequence(非序列)是什么?

  • 定义:无顺序依赖的数据,元素之间是独立或空间相关的。
  • 常见场景
    • 图像分类:二维像素矩阵。
    • 无监督聚类:客户分群、文档分类。
    • 图神经网络(GNN)​:节点间无固定顺序的图结构。

 3. 序列 vs 非序列的核心差异

维度序列非序列
数据依赖时间/逻辑顺序敏感无顺序依赖
典型任务文本生成、语音识别、时间序列预测图像分类、目标检测、聚类
常用模型RNN、LSTM、TransformerCNN、GCN、全连接层
输入形状[batch, T, ...](T为序列长度)[batch, C, H, W](C为通道数)

 4. 序列数据的处理方法

1. 填充(Padding)​
  • 目的:将不同长度的序列统一到相同长度。
import torch.nn.utils.rnn as rnn_utils

# 输入序列:batch=2, 最大长度=5
sequences = [
    torch.randn(3),    # 序列1(长度3)
    torch.randn(5)     # 序列2(长度5)
]

# 填充到长度5,用0填充
padded = rnn_utils.pad_sequence(sequences, batch_first=True)
print(padded.shape)  # torch.Size([2, 5, ...])

2.打包(Packing)​

  • 目的:仅保留有效数据,忽略填充部分,提升计算效率。
# 输入序列和长度掩码
lengths = [3, 5]
packed = rnn_utils.pack_padded_sequence(sequences, lengths, batch_first=True)

# 解包输出
output, output_lengths = rnn_utils.unpack_packed_sequence(packed)

三、concat、stack、expand 和 flatten

1. concat(拼接)​

功能

沿指定维度将多个张量连接成一个更大的张量,不改变原有维度

import torch

# 定义两个二维张量
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])

# 沿第0维(行方向)拼接
concatenated = torch.cat([a, b], dim=0)
print(concatenated)
# 输出:
# tensor([[1, 2],
#        [3, 4],
#        [5, 6],
#        [7, 8]])
关键点
  • 输入张量的其他维度必须一致。
  • 结果形状:(N+M, ...), 其中 N 和 M 是拼接张量的大小。

2. stack(堆叠)​

功能

沿新维度将多个张量堆叠成更高维度的张量,新增一个维度

import torch

a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])

# 沿新维度(第1维)堆叠
stacked = torch.stack([a, b], dim=1)
print(stacked)
# 输出:
# tensor([[[1, 2],
#          [3, 4]],
#         [[5, 6],
#          [7, 8]]])
关键点
  • 所有输入张量的形状必须完全相同。
  • 结果形状:(K, ...,),其中 K 是堆叠的张量数量。

3. expand(扩展)​

功能

通过广播机制,将张量在指定维度上重复元素,不复制数据​(仅创建视图)。

import torch

# 原始张量:[1, 2]
x = torch.tensor([1, 2])

# 在第0维扩展2倍,得到 [1, 2, 1, 2]
expanded = x.expand(2, -1)
print(expanded)  # tensor([1, 2, 1, 2])

# 在第1维扩展3倍,得到 [[1,1,1], [2,2,2]]
expanded_2d = x.unsqueeze(1).expand(-1, 3)
print(expanded_2d)
# tensor([[1, 1, 1],
#        [2, 2, 2]])
关键点
  • expand 的参数需满足:new_dim_size >= original_dim_size
  • 需先通过 unsqueeze 创建新维度才能扩展。

4. flatten(展平)​

功能

将多维张量压缩为一维或指定维度的连续数组,忽略其他维度

import torch

# 原始张量:[2, 3, 4]
x = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 展平为一维
flattened = x.flatten()
print(flattened)
# 输出:
# tensor([1, 2, 3, 4, 5, 6, 7, 8])

# 展平到指定维度(保留第0维,合并后两维)
flattened_2d = x.flatten(start_dim=1)
print(flattened_2d)
# 输出:
# tensor([[1, 2, 3, 4],
#        [5, 6, 7, 8]])
关键点
  • start_dim 指定从哪个维度开始展平,默认为 0
  • 展平后张量的总元素数不变。

5. 对比总结

操作核心功能是否改变维度内存消耗典型场景
concat沿指定维度拼接张量否(保持原有维度)低(共享数据)数据合并(如特征拼接)
stack新增维度堆叠张量是(维度+1)中(复制数据)多模型输出堆叠(如图像分割)
expand广播机制扩展元素可能改变维度极低(仅视图)扩展特征图尺寸(如上采样)
flatten压缩多维张量为低维是(降维)低(共享数据)全连接层输入适配

四、pointwise

        Tensor 中逐元素进行的操作,也叫element wise 操作,大部分的activation 算子以及 add、sub、mul、div、sqrt 等都属于pointwise 类别。操作和numpy数组差不多

五、split和slice

将张量分割成多个块。每个块都是原始张量的视图。

import torch
# 创建一个示例张量
tensor = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 对张量进行切片
slice_tensor = tensor[2:7]  # 从索引2到索引6(不包含7)
print(slice_tensor)  # 输出: tensor([3, 4, 5, 6, 7])
# 使用步长对张量进行切片
step_slice_tensor = tensor[1:9:2]  # 从索引1到索引8(不包含9),步长为2
print(step_slice_tensor)  # 输出: tensor([2, 4, 6, 8])
# 省略起始索引和结束索引来选择整个张量
full_tensor = tensor[:]
print(full_tensor)  # 输出: tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

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

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

相关文章

KVM虚拟机磁盘创建探究-1

在使用 virt-install 命令时,像 --disk path/var/lib/libvirt/images/vm1.qcow2,size20 这样的参数配置会自动创建指定路径和大小的磁盘镜像文件,不需要再单独使用 qemu-img 去创建。 详细解释 当你使用 virt-install 并指定 --disk 参数时&#xff0c…

第三十三:6.3. 【mitt】 任意组件通讯

概述:与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信。 // 引入mitt import mitt from "mitt";// 创建emitter const emitter mitt()/*// 绑定事件emitter.on(abc,(value)>{console.log(abc事件被触发,…

Android Stuido 调整左侧文件导航栏文字大小

Android Studio左侧文件导航栏文字大小默认比较小,这里记录下调整的路径: File-->Settings-->Appearance & Behavior-->Appearance-->勾上“Use custom font:” 就可以调整文字大小了,然后确定就好了。

大模型学习笔记------LLM模型开发流程

大模型学习笔记------LLM模型开发流程 1、总体开发流程2、各部分说明3、总结 LLM(Large Language Model)模型,即大型语言模型是大模型中极其重要的分支。它包含了GPT、BERT、Gemini、Qwen、Llama等,这些大模型衍生了相当多的各种改进版本。这些大模型的开…

剑指 Offer II 040. 矩阵中最大的矩形

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20040.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2/README.md 剑指 Offer II 040. 矩阵中最大的矩形 题目描述 给定一个由 …

【含文档+PPT+源码】基于SpringBoot+Vue医药知识学习与分享平台的设计与实现

项目介绍 本课程演示的是一款 基于SpringBootVue医药知识学习与分享平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运…

基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)

摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响,导致在真实临床环境中诊断不可靠。领域泛化(Domain Generalization, DG)方法旨在通过多领域训练提升模型在未知领域的性能,但…

【监督学习】支持向量机步骤及matlab实现

支持向量机 (四)支持向量机1.算法步骤2. MATLAB 实现参考资料 (四)支持向量机 支持向量机(Support Vector Machine, SVM)是一种用于分类、回归分析以及异常检测的监督学习模型。SVM特别擅长处理高维空间的…

数据集/API 笔记:湿球黑球温度(WBGT)观测数据

data.gov.sg WBGT是一个综合指标,考虑了气温、湿度、风速和太阳辐射,与气温不同。 报告的WBGT是过去15分钟内的平均值,每15分钟更新一次。 API 调用 curl --request GET \--url https://api-open.data.gov.sg/v2/real-time/api/weather …

基于 DataEase 的企业数据分析实践

1. 前言 在上一篇《基于 Selenium 实现的必应企业信息抓取工具》中,成功实现了对企业信息的批量抓取与导出。接下来,将对这些数据进行深入分析,包括地区分布、所属行业、规模大小等维度。其中,最直接的需求是统计每个省份的企业数…

教资信息技术之数据库技术

一、概述 1.1 基本概念 数据:描述事物的符号记录称为数据 数据库:长期存储在计算机内、有组织的、可共享的大量数据的集合。 数据库管理系统:位于用户和操作系统之间的一层数据管理软件 数据库系统:数据库系统是由数据库、数据…

JavaAPI(反射)

反射机制简介 获取一个类的实例对象,一般用new关键字来调用构造器获取实例,但是使用new有优点也有缺点。 优点: 性能高,JVM已经对这种调用进行了优化。不需要额外的权限检查、直接调用构造器获取实例、简单方便 缺点&#xff…

零信任沙箱:为网络安全筑牢“隔离墙”

在数字化浪潮汹涌澎湃的今天,网络安全如同一艘船在波涛汹涌的大海中航行,面临着重重挑战。数据泄露、恶意软件攻击、网络钓鱼等安全威胁层出不穷,让企业和个人用户防不胜防。而零信任沙箱,就像是一座坚固的“隔离墙”,…

开源嵌入式实时操作系统NuttX介绍

一、NuttX RTOS的发展历程:从个人项目到Apache顶级开源项目 NuttX 是一款轻量级、可扩展的实时操作系统(RTOS),其发展历程堪称开源社区的经典案例。 起源与初创(2003-2007) NuttX 由 Gregory Nutt 于2003…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

清华大学AI赋能医药代表销售培训讲师专家培训师唐兴通Deepseek医药数字化营销大健康数字化转型医药新媒体营销

唐兴通 数字商业创新实践专家、数字营销与销售顾问 沃顿商学院特邀演讲嘉宾|美国营销协会艾菲奖评委 核心专长: AI商业化应用、新药上市、数字化转型、医药数字营销创新、医药新销售能力体系打造、 教学经历:从教20年,执教12所…

关于后端使用Boolean或boolean时前端收到的参数的区别

当后端使用的是Boolean时,调用的方法是setIsLoginUser,前端收到的参数的参数名是isLoginUser 而当后端使用的是boolean时,调用的方法是setLoginUser,前端收到的参数的参数名是loginUser 封装类和基本数据类型在使用时需要注意这…

【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】

最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…

Docker安装Postgres_16数据库

PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统(RDBMS),以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能,适用于各种规模的应用程序; 适用传…

Linux系统管理操作

一、关闭防火墙 默认端口号是22,其他端口用不了,这时候就引出关闭防火墙 1.1、systemctl 1.1.1、基本语法 systemctl start | stop | restart | status 服务名 //启动、关闭、重启、查看状态 1.1.2、查看服务的方法 查看/usr/lib/systemd/syst…