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