python的负数索引理解

在 Python 中,负数索引用于从序列(如列表、元组或张量)的末尾开始计数。负数索引的理解方式如下:

  • -1 表示序列的最后一个元素。
  • -2 表示序列的倒数第二个元素。
  • 以此类推。

例子:

假设我们有一个列表 list

python 复制代码
lst = [10, 20, 30, 40, 50]

使用负数索引可以访问列表中的元素:

  • lst[-1] 返回 50,即列表的最后一个元素。
  • lst[-2] 返回 40,即列表的倒数第二个元素。
  • lst[-3] 返回 30,即列表的倒数第三个元素。

在 Layer Normalization 的实现中,负数索引用于计算需要进行归一化的维度索引。

假设 self.normalized_shape[3, 4],则 len(self.normalized_shape)2

因此,range(len(self.normalized_shape)) 生成 [0, 1]

对于每个 i,计算 -(i+1)

  • i = 0 时,-(i+1) = -1,表示最后一个维度。
  • i = 1 时,-(i+1) = -2,表示倒数第二个维度。

因此,dims 的值为 [-1, -2],表示需要在最后两个维度上进行归一化。

结合实例讲解

假设我们有一个输入张量 x,其形状为 [2, 3, 4],即批量大小为 2,通道数为 3,每个通道有 4 个元素。我们希望在通道和空间维度上进行归一化。

python 复制代码
import torch

x = torch.randn(2, 3, 4)  # 输入张量的形状为 [2, 3, 4]
normalized_shape = [3, 4]

# 计算需要进行 LN 的维度索引 dims
dims = [-(i+1) for i in range(len(normalized_shape))]
print(dims)  # 输出 [-1, -2]

# 计算特征图对应维度的均值和方差
mean = x.mean(dim=dims, keepdims=True)
mean_x2 = (x**2).mean(dim=dims, keepdims=True)
var = mean_x2 - mean**2

# 对输入 x 进行归一化
x_norm = (x - mean) / torch.sqrt(var + 1e-5)
print(x_norm)

这个例子中:

  • dims 的值为 [-1, -2],表示需要在最后两个维度上进行归一化。
  • meanvar 分别是特征图对应维度的均值和方差。
  • x_norm 是归一化后的张量。

通过使用负数索引,我们可以方便地指定需要进行归一化的维度,而不需要显式地计算维度的索引。

相关推荐
用户556918817531 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱15 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei18 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用