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 是归一化后的张量。

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

相关推荐
databook4 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室4 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三6 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
用户2519162427119 小时前
Python之语言特点
python
刘立军9 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机13 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i15 小时前
django中的FBV 和 CBV
python·django
c8i15 小时前
python中的闭包和装饰器
python
这里有鱼汤18 小时前
小白必看:QMT里的miniQMT入门教程
后端·python