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 是一个视图操作,不会拷贝数据,但其返回值是一个新的张量,需要额外注意内存管理。

常见应用

  • 图像处理中的滑动窗口操作。
  • 自定义卷积操作或池化操作。
  • 时间序列数据的分片处理。
相关推荐
数据智能老司机2 分钟前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机2 分钟前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机3 分钟前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i12 分钟前
drf初步梳理
python·django
每日AI新事件13 分钟前
python的异步函数
python
这里有鱼汤1 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
aneasystone本尊2 小时前
学习 Chat2Graph 的知识库服务
人工智能
IT_陈寒2 小时前
Redis 性能翻倍的 7 个冷门技巧,第 5 个大多数人都不知道!
前端·人工智能·后端
databook11 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室11 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python