Fréchet Inception Distance
基本思想:直接考虑生成数据和真实数据在feature层次的距离,即衡量生成图片和真实图片的距离。
众所周知,预训练好的神经网络在高层可以提取图片的抽象特征。FID使用Inception Net-V3全连接前的2048维向量作为图片的feature。
直观感受,FID是反应生成图片和真实图片的距离,数据越小越好。专业来说,FID是衡量两个多元正态分布的距离,其公式如下
F I D = ∣ ∣ μ r − μ g ∣ ∣ 2 + T r ( ∑ r + ∑ g − 2 ∑ r ∑ g 1 / 2 ) FID = ||\mu_r-\mu_g||^2+Tr(\begin{matrix} \sum_r \end{matrix}+\begin{matrix} \sum_g\end{matrix}-2\begin{matrix} \sum_r\sum_g\end{matrix}^{1/2}) FID=∣∣μr−μg∣∣2+Tr(∑r+∑g−2∑r∑g1/2)
特点:
几种叫法:
Cited from TFGAN:
(3) Video-level FID: Features of the penultimate layer are extracted from 3D Resnet-50 model trained on the entire Kinetics dataset [Kay et al., 2017], and the FID score is computed between the real and generated videos. Note that lower the FID scores, better are the models.
Kay et al., 2017. The kinetics human action video dataset.
为了验证度量标准的有效性,研究人员计算了通过向基线添加噪声而创建的数据集的度量标准值。期望随着噪声的增加,分数会增加。
基本思想:相当于把FID的图像特征提取网络换成视频特征提取网络。
来源论文:GODIVA
使用论文:TFGAN、GODIVA、NVWA、make-a-video
CLIPSIM metric, which incorporates a CLIP [29] model to calculate the semantic simi- larity between input text and the generated image. For a fair comparison, all the models use the resolution of 256 × 256. We generate 60 images for each text and select the best one by CLIP[29].
来源论文:T2V&TFGAN,用于Kinetic数据集
使用论文:T2V、TFGAN、NVWA
基本思想:相当于IS指标的变种
参考链接:轻量级神经网络
区分:
如何计算FLOPs
对于卷积层而言,FLOPs的计算公式如下:
F L O P s = 2 H W ( C i n K 2 + 1 ) C o u t FLOPs = 2HW( C_{in}K^2+ 1 )Cout FLOPs=2HW(CinK2+1)Cout
其中的Cin是指卷积层输入tensor的通道数,Cout指的是卷积层输出tensor的通道数。K指的是卷积核大小。
而后把常数项去掉,简化小操作:
F L O P s = H W ( C i n K 2 ) C o u t FLOPs = HW( C_{in}K^2 )Cout FLOPs=HW(CinK2)Cout
而在实际中,我们不可能自己计算FLOPs,所以,本着能找库就找库的聪明才能,查了一下,还真有相关计算FLOPs的库,现查到的有两个库,一个是torchstat以及thop。经过测试,基本上两个可以对齐的,所以说,任意选择一个就好。具体用法写两个小demo吧。
而在实际中,我们不可能自己计算FLOPs,所以,本着能找库就找库的聪明才能,查了一下,还真有相关计算FLOPs的库,现查到的有两个库,一个是torchstat以及thop。经过测试,基本上两个可以对齐的,所以说,任意选择一个就好。具体用法写两个小demo吧。
对于torchstat:
from torchstat import stat
import torchvision.models as models
model = model.densenet121()
stat(model, (3, 224, 224))
对于thop:
from torchvision.models import densenet121
from thop import profile
model = densenet121()
input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(input, ))
例2
pip install thop # 安装thop库
import torch
from thop import profile
net = model() # 定义好的网络模型
img1 = torch.randn(1, 3, 512, 512)
img2 = torch.randn(1, 3, 512, 512)
img3 = torch.randn(1, 3, 512, 512)
macs, params = profile(net, (img1,img2,img3))
print('flops: ', 2*macs, 'params: ', params)
为什么不能只用FLOPs作为指标呢?
作者认为有如下几个原因:
1)FLOPs没有考虑几个对速度有相当大影响的重要因素。
2)计算平台的不同。
3) FLOPs没有考虑几个对速度有相当大影响的重要因素:MAC和并行度
net = model() # 定义好的网络模型
total = sum([param.nelement() for param in net.parameters()])
print("Number of parameter: %.2fM" % total)
这是网上很常见的直接用自带方法计算params,基本不会出错。胜在简洁。
例2
#model = 你自己的模型,eg:CNN() ResNet() SegNet()....
params = list(model.parameters())
k = 0
for i in params:
l = 1
print("该层的结构:" + str(list(i.size())))
for j in i.size():
l *= j
print("该层参数和:" + str(l))
k = k + l
print("总参数数量和:" + str(k))
对比inference speeds
这个值怎么获取没弄懂
相关论文里也没有讲解,待更新…