pytorch 张量的unfold方法介绍

在 PyTorch 中,unfold 是张量的一种操作方法,用于将张量的一个维度展开为多个重叠的窗口。这在处理滑动窗口操作(如卷积、时间序列分片等)时非常有用。

方法签名

复制代码
Tensor.unfold(dimension, size, step)

参数说明

  • dimension: 要展开的维度索引(从 0 开始)。
  • size: 每个窗口的大小。
  • step: 每个窗口之间的步幅。

返回值

返回一个新的张量,其中指定的维度被替换为一个新的维度,该维度包含了从原始维度中抽取的滑动窗口。

用法示例

示例 1: 基本用法
复制代码
import torch

# 创建一个一维张量
x = torch.arange(10)
print("原始张量:", x)

# 使用 unfold 创建滑动窗口
y = x.unfold(dimension=0, size=3, step=2)
print("展开后的张量:\n", y)

输出

复制代码
原始张量: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
展开后的张量:
 tensor([[0, 1, 2],
         [2, 3, 4],
         [4, 5, 6],
         [6, 7, 8]])

解释

  • 在第 0 维(行)上展开,窗口大小为 3,步幅为 2。
  • 展开的每个窗口是连续的 3 个元素,相邻窗口之间跳过 2 个元素。
示例 2: 二维张量的展开
复制代码
# 创建一个二维张量
x = torch.arange(1, 17).view(4, 4)
print("原始张量:\n", x)

# 在维度 1 上展开
y = x.unfold(dimension=1, size=2, step=1)
print("展开后的张量:\n", y)

输出

复制代码
原始张量:
 tensor([[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12],
         [13, 14, 15, 16]])
展开后的张量:
 tensor([[[ 1,  2],
          [ 2,  3],
          [ 3,  4]],
         [[ 5,  6],
          [ 6,  7],
          [ 7,  8]],
         [[ 9, 10],
          [10, 11],
          [11, 12]],
         [[13, 14],
          [14, 15],
          [15, 16]]])

解释

  • 在第 1 维(列)上展开,窗口大小为 2,步幅为 1。
  • 每一行的每个窗口是连续的 2 个元素,相邻窗口之间跳过 1 个元素。
示例 3: 高维张量的展开

对于高维张量,unfold 操作也类似,只需指定正确的维度即可。例如:

复制代码
x = torch.randn(2, 3, 4)  # 一个 3 维张量
y = x.unfold(dimension=2, size=2, step=1)
print("高维张量展开后形状:", y.shape)

输出

复制代码
高维张量展开后形状: torch.Size([2, 3, 3, 2])

注意事项

  1. 边界问题:如果剩余的元素不足以填满窗口,则这些元素会被忽略。
  2. 效率unfold 是一个视图操作,不会拷贝数据,但其返回值是一个新的张量,需要额外注意内存管理。

常见应用

  • 图像处理中的滑动窗口操作。
  • 自定义卷积操作或池化操作。
  • 时间序列数据的分片处理。
相关推荐
有Li2 分钟前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
小大宇11 分钟前
Python 集成 Conda
开发语言·python·conda
小刘BlandNew13 分钟前
AI核心概念大串联
人工智能
墨染天姬16 分钟前
【AI】自驱动智能体
人工智能
D2aZXN3FhrDa7e21232 分钟前
佛山乐从低预算实体店如何选择?看美诚AI自动化获客方案
运维·人工智能·自动化·佛山美诚科技有限公司
初学者,亦行者38 分钟前
利用Pyecharts绘制堆叠柱状图
python·信息可视化·数据分析
林泽毅1 小时前
PyTRIO:当强化学习不再需要本地GPU
人工智能·python·深度学习·机器学习
颜酱1 小时前
# 02 | 搭骨架:用 LangGraph 编排 12 步工作流(思路)
前端·人工智能·后端
颜酱1 小时前
02 | 搭骨架:用 LangGraph 编排 12 步工作流
前端·人工智能·后端
码上解惑1 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai