Ratio 列是指在某个 Top-1 或 Top-5 准确率阈值下,模型的 FLOPs(Floating Point Operations) 与 ImageNet 验证集中的图片数量的比值。FLOPs 是模型运算量的指标,越高则意味着模型的计算成本也越高。

在深度学习领域中,为了评估不同模型的性能,通常会使用准确率和 FLOPs 作为评价指标,因为这两个指标可以同时评估模型的精度和速度。Ratio 一列就是这两个指标的结合,用来衡量模型在针对 ImageNet 数据集的训练中,性价比的好坏。

具体实现方式方面,很多框架一般都有相应的 API 可以轻松计算模型的 FLOPs,并结合测试数据集的规模,计算 Ratio。以 PyTorch 为例,可以使用第三方库 FLOPs Counter 计算模型的 FLOPs,然后通过下面的代码计算 Ratio:

import numpy as np

def ratio(acc, flops, data_size):
    threshold = [0.75, 0.8, 0.85, 0.9, 0.95]
    ratio_list = []
    for t in threshold:
        n = int(t * data_size)
        max_acc = np.argmax(acc >= n)  # 阈值对应的最大准确率下标
        max_flops = np.argmax(flops[max_acc:] * n >= flops * data_size)  # 精度超过阈值的最小 FLOPs 下标
        ratio_list.append(flops[max_acc+max_flops] * t / data_size)
    return ratio_list

这个函数接收三个参数:准确率、FLOPs、数据集大小。其中,准确率和 FLOPs 都是一维数组,长度应该分别等于模型在测试集上得出的不同 Top-k 准确率和 FLOPs 数量;数据集大小则是 ImageNet 验证集的图片数量。函数最终返回一个包含五个元素的列表,分别对应五个不同的阈值下的 Ratio。

使用 FLOPs Counter 计算 FLOPs 数量的代码如下:

from thop import profile

input = torch.randn(1, 3, 224, 224)
model = torchvision.models.resnet18()

flops, params = profile(model, inputs=(input,))

其中,inputs 参数需要传入一个元组形式的输入张量,同时 profile 函数会返回模型的 FLOPs 和参数数量。由于此函数依赖于 PyTorch 和 torchvision 包,所以需要先安装它们:

pip install torch torchvision
pip install thop