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

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

相关推荐
初晴~9 分钟前
【动态规划】打家劫舍类问题
java·数据结构·c++·python·算法·leetcode·动态规划
翔云API36 分钟前
PHP开发示例-vin码识别接口-引领汽车行业数字化新风向
开发语言·php
ac-er888836 分钟前
如何对PHP的API接口权限认证
开发语言·php
菜鸟、小高37 分钟前
从0开始学PHP面向对象内容之(常用魔术方法续一)
开发语言·php
yezipi耶不耶1 小时前
Rust 所有权机制
开发语言·后端·rust
将心ONE1 小时前
RandomWords随机生成单词
python
古城小栈3 小时前
Spring Security 认证流程,长话简说
java·python·spring
六月悉茗3 小时前
【C语言 - 简易架构】
c语言·开发语言
用一个不重复的昵称3 小时前
python数据写入excel文件
python·excel·pandas
中科院提名者3 小时前
常用的Anaconda Prompt命令行指令
python