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 torcha = 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])

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【银河麒麟高级服务器操作系统实际案例分享】数据库资源重启现象分析及处理全过程

更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…

C++ Primer 拷贝、赋值与销毁

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

Java面经

Java 知识点总结 1. 封装,继承和多态 封装: “高内聚,低耦合”,隐藏内部实现细节,只通过接口开放部分使用权限给外部。继承: 主要是提高代码复用性,通过子类继承父类,来增加功能扩…

常见的限流算法有哪些?

好的,关于这个问题,我会从几个方面来回答。 首先,限流算法是一种系统保护策略,主要是避免在流量高峰导致系统被压垮,造成系统不可用的问题。 常见的限流算法有 5 种。 1. (如图)计数器限流&a…

GitHub获取token

获取token clone代码 git clone https://$tokengithub.com/*****/*****.git

公司网络安全组织结构

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 第17章 网络安全应急响应技术原理与应用 17.1 网络安全应急响应概述 居安思危,思则有备,有备无患。网络安全应急响应是针对潜在发生的网络…

《深度学习进阶》第7集:深度实战 通过训练一个智能体玩游戏 来洞察 强化学习(RL)与决策系统

深度学习进阶 | 第7集:深度实战 通过训练一个智能体玩游戏 来洞察 强化学习(RL)与决策系统 在深度学习的广阔领域中,强化学习(Reinforcement Learning, RL)是一种独特的范式,它通过智能体与环境…

【web前端开发】CSS--CSS简介及其编写位置(上)

1、CSS简介 (1)CSS的全称为:层叠式样式表(Cascading Style Sheets) (2)CSS也是一种标记语言,用于给HTML结构设置样式,例如:文字大小、颜色、元素宽度等等…

计算机视觉|Swin Transformer:视觉 Transformer 的新方向

一、引言 在计算机视觉领域的发展历程中,卷积神经网络(CNN) 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等,CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而,CNN 在捕捉全…

UE4 组件 (对话组件)

制作一个可以生成对话气泡,显示对话台词的简单组件。这个组件要的变量:台词(外部传入)。功能:开始对话(生成气泡UI) ,结束对话。 一、对话组件创建 二、开始对话事件 1、注意这里获…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Vue3自定义hooks

Vue3自定义hooks 什么是自定义hooks 把一个功能的所有数据和方法写到同一个ts文件里。 命名规范:useXxx,小驼峰。 在每一个hooks中,都可以写onMounted、computed等属性,互不干扰。 体现出了组合式AI的优势,一个功能的…

Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册

一、写在前面:为什么你需要这份教程? 当电脑频繁蓝屏、系统崩溃甚至无法开机时,重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点: ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 一、简单介绍 二、Docker 下载安…

外键 FK enable constraints enq:TM lock

ALTER TABLE X ENABLE NOVALIDATE CONSTRAINT XX; 如果referenced 表在DML 就会出现 enq:TM lock

深度学习语义分割数据集全景解析

一、语义分割任务概述 语义分割是计算机视觉领域的核心任务之一,目标是通过算法将图像中的每个像素精准划分到对应的语义类别(如道路、车辆、行人等)。高质量标注数据集是推动该领域发展的关键因素。本文将系统梳理主流数据集的技术特征与适…

【芯片设计】处理器芯片大厂前端设计工程师面试记录·20250307

面试问题和ds的参考答案 好的,我现在需要处理用户的请求,他们希望我扩展之前的回答,使其更详细、更丰富。首先,我需要回顾之前的回答,看看哪些部分可以进一步展开。用户提到“回答多说一些!”,这意味着他们希望每个问题的回答内容更深入,包含更多的技术细节、实际案例…

C++特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 构造函数私有化: 析构函数私有化: 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 设计模式: 单例模式: 饿汉模式: 懒汉模式: 线程…

Linux系统之配置HAProxy负载均衡服务器

Linux系统之配置HAProxy负载均衡服务器 前言一、HAProxy介绍1.1 HAProxy简介1.2 主要特点1.3 使用场景二、本次实践介绍2.1 本次实践简介2.2 本次实践环境规划三、部署两台web服务器3.1 运行两个Docker容器3.2 编辑测试文件3.3 访问测试四、安装HAProxy4.1 更新系统软件源4.2 安…