GAN-评价指标IS以及FID、KID

GAN网络评价指标主要有两种,IS以及FID
IS(Inception Score)
顾名思义:基于Inception网络的score计算方法。
Inception网络是图片分类器,基于ImageNet数据库进行训练,该数据库共有1.2M个RGB图片,分为1000类。Inception网络作为经典网络,在很多框架中都有集成,直接拿来用即可。
参考:https://zhuanlan.zhihu.com/p/54146307
评价生成模型,主要两方面性能:1、生成图片是否清晰2、生成的图片是否多样。是否清晰说明生成模型表现是否良好;是否多样检测生成模型是否只能生成有限的几种清晰图片,陷入了所谓的mode collapse,这样的模型也不是好的模型。
IS指标是这样进行检测的:
1、清晰度:将生成的图片X输入到Inception V3网络中,将输出的1000维向量y(即属于各类的概率)。假设对于一个清洗的图片,它属于某一类的概率应该非常大,而属于其他类的概率非常小(该假设本身存在问题,清晰度和可分类度并不强相关,有可能有些图片很清晰,但是具体属于哪个类却是模棱两可的)。用专业术语说, [公式] 的熵应该很小(熵代表混乱度,均匀分布的混乱度最大,熵最大。也就是说,输出的概率分布函数图越尖锐。
2、多样性:多样性:如果一个模型能生成足够多样的图片,那么它生成的图片在各个类别中的分布应该是平均的,假设生成了 10000 张图片,那么最理想的情况是,1000类中每类生成了10张。转换成术语,就是生成图片在所有类别概率的边缘分布p(y)熵很大(均匀分布)。具体计算时,可以先用生成器生成 N 张图片,然后计算经验分布。但是,如果各类中的10个图片,都是一模一样的,仍然是 mode collapse。Inception Score 无法检测这种情况
在这里插入图片描述
因此IS的公式可以写为:在这里插入图片描述
本质上就是分别计算输入x的概率分布以及所有图片的边缘分布,之后计算KL散度。
综合起来,只要p(y|x)和 p(y)的距离足够大,就能证明这个生成模型足够好。因为前者是一个很尖锐的分布,后者是一个均匀分布,这俩距离本就应该很大。
在这里插入图片描述
具体代码可参考:sbarratt/inception-score-pytorch
缺陷:计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集: ImageNet,在 Inception V3 的“世界观”下,凡是不像 ImageNet 的数据,都是不真实的,都不能保证输出一个 sharp 的 predition distribution。

FIDFID计算的是特征层面的距离
在这里插入图片描述
本质上使用的是真实图片与生成图片提取特征向量之后之间的均值,协方差的距离评价。当生成图片和真实图片特征越相近时,均值之差的平方越小,协方差也越小,则之和(FID)也越小。
FID指标只是使用InceptionV3作为特征提取器,而不依赖图片的具体类别,也不必担心每个类别内部只产生一模一样的图片导致IS中多样性判别失效,无法预测mode collapse的问题。

综上所述,对比 IS,FID 有如下优点:
生成模型的训练集和 Inception V3 的训练集可以不同。
计算 FID 时同时用到了生成的数据和真实数据,比起 IS 来更灵活。可以理解成,IS 判断真实性与否,是把生成数据和 ImageNet 数据做比较,而 FID 是把生成数据和训练数据做比较,因此更 reasonable。
以优化 FID 为目标,不会产生对抗样本。因为优化的是 lantent space feature,不是最终的输出图片,不会导致最终的生成图片失真。
FID缺陷
FID 只是某一层的特征的分布,是否足以衡量真实数据分布与生成数据分布的距离?同时,提出 FID 公式计算的是多元正态分布的距离,显然神经网络提取的特征并不是多元正态分布。
针对同一个生成模型,不同框架下预训练的 Inception V3 算出的 FID 差别是否可以忽略?
FID 无法反映生成模型过拟合的情况,如果某个生成模型只是简单拷贝训练数据,FID 会非常小,认为这是一个完美的生成模型,因此,使用 FID 时同时也要通过别的手段证明生成模型没有过拟合。

KID
Kernel Inception Distance (KID)。与FID类似,KID[1]通过计算Inception表征之间最大均值差异的平方来度量两组样本之间的差异。此外,与所说的依赖经验偏差的FID不同,KID有一个三次核[1]的无偏估计值,它更一致地匹配人类的感知。

<think>嗯,用户想用PyTorch自带的包来计算FIDKID指标。首先,我需要回忆一下PyTorch是否有官方的库支持这些指标。根据之前的了解,PyTorch本身并没有直接内置FIDKID的计算函数,但可能有一些社区实现的包,比如pytorch-fid。不过用户特别提到要使用PyTorch自带的包,可能需要确认是否有新版本支持。 先检查引用内容。引用[1]提到pytorch-fid项目,但这是一个第三方库,不是PyTorch官方的一部分。引用[4]详细讲解了FID的公式,并指出需要预训练的Inception网络。用户可能希望在不依赖第三方库的情况下实现这些指标。 接下来,我需要思考PyTorch是否有相关的模块。PyTorch的torchmetrics库提供了FIDKID的实现,但需要确认是否属于PyTorch官方包。torchmetrics是一个PyTorch生态系统中的库,可能需要额外安装。如果用户接受使用torchmetrics,那就可以提供示例代码。否则,可能需要手动实现,但这比较复杂。 根据用户的问题,他们可能希望使用PyTorch自带的包,可能包括torchmetrics。所以步骤应该是安装torchmetrics,加载预训练的Inception模型,然后使用其中的FIDKID类。需要确保代码正确,比如输入图像的格式是否正确归一化到[0,1]或[-1,1],并且调整大小到299x299。 另外,要注意设备的选择,比如使用GPU加速,如引用[2]中提到的设置device为cuda。在示例代码中,需要将真实图像和生成图像移动到对应的设备上。 可能的问题包括版本兼容性,比如torchmetrics的版本是否支持,以及图像预处理是否正确。此外,需要提醒用户计算这些指标时需要大量的内存,特别是处理大规模数据集时。 总结步骤:安装torchmetrics,导入相应模块,准备数据,创建度量对象,更新数据,计算结果。同时,引用相关的参考文献,特别是关于FID公式的引用[4]和GPU使用的引用[2]。</think>以下是使用PyTorch生态工具计算FIDKID指标的分步说明: ### 1. 安装必要库 PyTorch官方生态中的`torchmetrics`库提供了FIDKID实现: ```bash pip install torchmetrics[image] ``` ### 2. 核心代码实现 ```python import torch from torchmetrics.image.fid import FrechetInceptionDistance from torchmetrics.image.kid import KernelInceptionDistance # 选择GPU设备[^2] device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 初始化度量对象 fid = FrechetInceptionDistance(feature=2048).to(device) kid = KernelInceptionDistance(subset_size=50).to(device) # 假设真实图像和生成图像都是归一化到[0,255]范围的uint8张量 # 形状为(N, 3, 299, 299),N为批量大小 real_images = torch.randint(0, 255, (100, 3, 299, 299), dtype=torch.uint8).to(device) fake_images = torch.randint(0, 255, (100, 3, 299, 299), dtype=torch.uint8).to(device) # 更新度量状态 fid.update(real_images, real=True) fid.update(fake_images, real=False) kid.update(real_images, real=True) kid.update(fake_images, real=False) # 计算结果 fid_score = fid.compute() kid_mean, kid_std = kid.compute() print(f"FID: {fid_score.item():.3f}") print(f"KID: {kid_mean.item():.5f} ± {kid_std.item():.5f}") ``` ### 3. 关键参数说明 - **图像预处理**: - 必须缩放到299x299分辨率 - 像素值范围应为[0, 255]的uint8类型 - 通道顺序为(RGB) - **FID计算原理**: 基于Fréchet距离比较特征分布: $$ FID^2 = ||\mu_1 - \mu_2||^2 + Tr(\Sigma_1 + \Sigma_2 - 2(\Sigma_1\Sigma_2)^{1/2}) $$ [^4] - **GPU加速**: 通过`.to(device)`将计算转移到GPU,可提升10倍以上速度 ### 4. 注意事项 - 建议至少使用10000张图像计算可靠指标 - 不同框架的InceptionV3实现可能产生微小差异 - KID默认使用多项式核$k(x,y) = (x^Ty / d + 1)^3$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值