从零实现 Transformer:第 0 部分 - 基础( Foundations)view 重塑形状 和 transpose 交换维度顺序

从零实现 Transformer:第 0 部分 - 基础( Foundations)view 重塑形状 和 transpose 交换维度顺序

flyfish

view 复用原张量同一块底层内存数据,只是换了一种维度解读方式,不会在内存中创建物理副本。

cpp 复制代码
import torch

x = torch.arange(1,13).view(6,2)
print(x)

y = torch.arange(0,12).view(2,2,3)
print(y)
cpp 复制代码
tensor([[ 1,  2],
        [ 3,  4],
        [ 5,  6],
        [ 7,  8],
        [ 9, 10],
        [11, 12]])
cpp 复制代码
tensor([[[ 0,  1,  2],
         [ 3,  4,  5]],

        [[ 6,  7,  8],
         [ 9, 10, 11]]])
cpp 复制代码
import torch

# ===================== 1. 原始张量(对应图顶部的一维数据) =====================
print("===== 原始一维张量 =====")
x = torch.arange(1, 13)  # 生成 [1,2,...,12]
print(x)
# ===================== 2. view(6,2) 连续张量(对应图左侧) =====================
print("===== view(6,2) → 连续张量 =====")
x_contiguous = x.view(6, 2)
print(x_contiguous)
print(f"是否连续: {x_contiguous.is_contiguous()}")
print("-"*50)

# ===================== 3. transpose(0,1) 非连续张量(对应图右侧) =====================
print("===== transpose(0,1) → 非连续张量 =====")
x_non_contiguous = x_contiguous.transpose(0, 1)
print(x_non_contiguous)
print(f"是否连续: {x_non_contiguous.is_contiguous()}")

输出

cpp 复制代码
tensor([[ 1,  2],
        [ 3,  4],
        [ 5,  6],
        [ 7,  8],
        [ 9, 10],
        [11, 12]])
是否连续: True
--------------------------------------------------
===== transpose(0,1) → 非连续张量 =====
tensor([[ 1,  3,  5,  7,  9, 11],
        [ 2,  4,  6,  8, 10, 12]])
是否连续: False

transpose

  1. transpose(dim0, dim1)仅交换两个指定维度,不复制数据
  2. 二维transpose(0,1) = 矩阵转置,等价于 .t()
  3. 视图特性:和原张量共享内存,修改任意一个都会同步变化
  4. 连续性transpose 会把连续张量变成非连续张量

示例

cpp 复制代码
import torch

# ===================== 示例1:二维张量转置(最常用,矩阵转置) =====================
print("===== 1. 二维张量 transpose =====")
x = torch.arange(1, 7).view(2, 3)  # 2行3列
print("原始张量:\n", x)
# 交换维度0和维度1(行和列)
y = torch.transpose(x, 0, 1)
print("转置后(3行2列):\n", y)
# 简写:x.t() 等价于 x.transpose(0,1)
print("简写x.t():\n", x.t())
print("-"*50)

# ===================== 示例2:三维张量交换维度 =====================
print("===== 2. 三维张量 transpose =====")
x = torch.randn(2, 3, 4)  # 形状 [2,3,4]
print("原始形状:", x.shape)
# 交换维度1和维度2
y = x.transpose(1, 2)
print("交换dim1和dim2后形状:", y.shape)  # [2,4,3]
# 交换维度0和维度1
z = x.transpose(0, 1)
print("交换dim0和dim1后形状:", z.shape)  # [3,2,4]
print("-"*50)

# ===================== 示例3:验证transpose是视图(共享内存) =====================
print("===== 3. transpose 共享内存(修改一个,全变) =====")
x = torch.tensor([[1,2],[3,4]])
y = x.transpose(0, 1)
print("原x:\n", x)
print("转置y:\n", y)

# 修改转置后的张量
y[0, 1] = 999
print("\n修改y后,x自动变化:\n", x)
print("修改y后,y:\n", y)
print("-"*50)

# ===================== 示例4:transpose 生成非连续张量 =====================
print("===== 4. transpose 与连续性 =====")
x = torch.arange(1, 13).view(2, 6)
print("是否连续:", x.is_contiguous())  # True

y = x.transpose(0, 1)
print("转置后是否连续:", y.is_contiguous())  # False
print("转置步幅:", y.stride())

# 非连续张量转连续
z = y.contiguous()
print("contiguous()后是否连续:", z.is_contiguous())  # True

输出

cpp 复制代码
===== 1. 二维张量 transpose =====
原始张量:
 tensor([[1, 2, 3],
        [4, 5, 6]])
转置后(3行2列):
 tensor([[1, 4],
        [2, 5],
        [3, 6]])
简写x.t():
 tensor([[1, 4],
        [2, 5],
        [3, 6]])
--------------------------------------------------
===== 2. 三维张量 transpose =====
原始形状: torch.Size([2, 3, 4])
交换dim1和dim2后形状: torch.Size([2, 4, 3])
交换dim0和dim1后形状: torch.Size([3, 2, 4])
--------------------------------------------------
===== 3. transpose 共享内存(修改一个,全变) =====
原x:
 tensor([[1, 2],
        [3, 4]])
转置y:
 tensor([[1, 3],
        [2, 4]])

修改y后,x自动变化:
 tensor([[  1,   2],
        [999,   4]])
修改y后,y:
 tensor([[  1, 999],
        [  2,   4]])
--------------------------------------------------
===== 4. transpose 与连续性 =====
是否连续: True
转置后是否连续: False
转置步幅: (1, 6)
contiguous()后是否连续: True
相关推荐
程序猿编码16 小时前
零依赖纯手写:C++ 实现完整神经网络,张量反向传播全打通
c++·神经网络·transformer·大模型推理
书源丶17 小时前
Qwen3-Embedding-0.6B 纯 CPU
网络·语言模型·embedding·llama
高洁011 天前
大模型的幻觉怎么治
人工智能·深度学习·django·transformer·tornado
大江东去浪淘尽千古风流人物1 天前
【RoboDojo】机器人操作通用策略统一评估基准:42仿真+18现实任务×异构并行深度解析
机器人·transformer·具身智能·机器人学习·视觉表示·patch policy·robodojo
高洁012 天前
孪生不止在工厂:能源、医疗与农业
人工智能·深度学习·transformer·知识图谱·tornado
布吉岛的石头2 天前
Java 程序员第 48 阶段15:Transformer 架构总览与自注意力直觉,注意力权重可视化:用 Java 打印注意力矩阵理解模型在看什么
人工智能·深度学习·transformer
richard_first2 天前
第3章 PTQ:不用重新训练也能量化 LLM
人工智能·深度学习·语言模型·自然语言处理·transformer
Allen_LVyingbo3 天前
三甲医院医疗AI代码库管理系统研究(上)
网络·transformer·知识图谱·健康医疗
JAI科研4 天前
YOLO 完全指南(七):YOLO识别工程化 (上)
人工智能·深度学习·神经网络·yolo·目标检测·计算机视觉·transformer
程序猿编码4 天前
扔掉 Python!纯 C++ 本地跑扩散 TTS,GGML 加持,支持 RK3588 NPU 加速
c++·计算机视觉·大模型·transformer·rk3588·推理·ggml