pytorch api文档:torch.argmax()返回张量最大值的索引

作用

返回张量中指定维度上最大值所在的索引。

应用场景

分类任务中,模型输出的是各类别的概率/得分,用 argmax 就能找到“预测类别”(得分最高的类别索引);

语法

torch.argmax(input, dim=None, keepdim=False)

参数解释

参数 作用 示例
input 输入张量(必填) 任意维度的张量
dim 指定计算维度(可选) dim=0 按列,dim=1 按行,不指定则展平成一维,再返回全局最大值的索引
keepdim 是否保留原维度(默认False) keepdim=True 时,结果维度和输入一致

注意

  1. argmax 返回的是索引(整数),不是最大值本身;如果要同时获取最大值和索引,用 torch.max();
  2. 如果有多个相同的最大值,argmax 只会返回第一个最大值的索引;
  3. 索引从 0 开始(和Python列表索引规则一致)。

例子

import torch

# 1. 一维张量(向量)
tensor_1d = torch.tensor([3, 1, 4, 2])
argmax_1d = torch.argmax(tensor_1d)
print(f"一维张量: {tensor_1d}")
print(f"全局最大值索引: {argmax_1d.item()}")  # 输出 2(值为4的位置)

# 2. 二维张量(矩阵)
tensor_2d = torch.tensor([
    [1, 5, 3],
    [2, 4, 6]
])
# 2.1 不指定dim:展平后找全局最大值索引
argmax_2d_global = torch.argmax(tensor_2d)
print(f"\n二维张量:\n{tensor_2d}")
print(f"全局最大值索引(展平后): {argmax_2d_global.item()}")  # 输出 5(展平后[1,5,3,2,4,6]中6的位置)

# 2.2 指定dim=0:按列找最大值索引(每列的最大值在第几行)
argmax_2d_dim0 = torch.argmax(tensor_2d, dim=0)
print(f"dim=0(按列)的最大值索引: {argmax_2d_dim0}")  # 输出 [1,0,1]

# 2.3 指定dim=1:按行找最大值索引(每行的最大值在第几列)
argmax_2d_dim1 = torch.argmax(tensor_2d, dim=1)
print(f"dim=1(按行)的最大值索引: {argmax_2d_dim1}")  # 输出 [1,2]

# 3. keepdim=True:保留原维度(结果形状和输入匹配)
argmax_2d_dim1_keep = torch.argmax(tensor_2d, dim=1, keepdim=True)
print(f"\ndim=1且keepdim=True: \n{argmax_2d_dim1_keep}")  # 输出 [[1], [2]](保持2行1列)

输出结果:

一维张量: tensor([3, 1, 4, 2])
全局最大值索引: 2

二维张量:
tensor([[1, 5, 3],
        [2, 4, 6]])
全局最大值索引(展平后): 5
dim=0(按列)的最大值索引: tensor([1, 0, 1])
dim=1(按行)的最大值索引: tensor([1, 2])

dim=1且keepdim=True: 
tensor([[1],
        [2]])

实战场景

这是 torch.argmax 最核心的使用场景——分类任务中的应用,从模型输出中提取预测类别:

# 模拟模型输出(batch_size=3,类别数=4)
# 每一行代表1个样本,每一列代表对应类别的得分
model_output = torch.tensor([
    [0.1, 0.8, 0.05, 0.05],  # 样本1:类别1得分最高
    [0.0, 0.1, 0.9, 0.0],    # 样本2:类别2得分最高
    [0.7, 0.2, 0.05, 0.05]   # 样本3:类别0得分最高
])

# 按行(dim=1)找最大值索引 → 每个样本的预测类别
pred_classes = torch.argmax(model_output, dim=1)
print(f"模型输出得分:\n{model_output}")
print(f"\n每个样本的预测类别索引: {pred_classes}")  # 输出 [1,2,0]

# 结合类别标签映射(比如标签:0=猫,1=狗,2=鸟,3=鱼)
label_map = {0: '猫', 1: '狗', 2: '鸟', 3: '鱼'}
pred_labels = [label_map[idx.item()] for idx in pred_classes]
print(f"预测类别名称: {pred_labels}")  # 输出 ['狗', '鸟', '猫']

与 torch.max() 区别

详见链接

总结

  1. torch.argmax() 核心是返回张量指定维度上最大值的索引,不指定维度则展平后找全局索引;
  2. 分类任务中,常用 torch.argmax(output, dim=1) 从模型输出(batch×类别数)中提取每个样本的预测类别;
  3. 区分 argmax(只返回索引)和 max(返回值+索引),按需选择即可。

原文出处:/show_1GW2erSSlyj2.html