589 字
3 分钟
生成网络评价指标
https://blog.csdn.net/weixin_44966641/article/details/126614844
图形生成的要求
对于生成模型,主要考虑以下两点
- 生成的图像是否清晰?
- 生成的图像是否多样? 当然也可以考虑下面 2 点
- 生成的图片是否和原始图片相似?
- 生成图片是否可以平滑的变化?
Inception Score
基本思想
Inception Net-V3 是图片分类器,在 ImageNet 数据集上训练。ImageNet 是由 120 多万张图片,1000 个类别组成的数据集。Inception Net-V3 可以对一副图片输出一个 1000 分类的概率。
- 清晰度
生成的图片分类,得到一个一千分类的向量,我们希望他某一维接近 1,其他维度小,也就是 的熵很小 - 多样性: 我们希望生成的图片均匀分布,也就是 的熵很大 具体指标如下:
这个指标越大约好,衡量了 y 的边缘概率 (也就是总体分布) 和每个的分布的相似度
FID
FID 反应了生成图片和真实图片的距离,越小越好,专业来说,FID 是衡量两多元正态分布的距离,公示如下:
: 真实图片的特征均值
: 生成图片的特征均值
: 真实图片的协方差矩阵
: 生成图片的协方差矩阵
: 迹
$
这里的特征也是用 Inception network 网络来提取,但是不经过分类层, 得到一个 2048 维向量,假如这个分布服从正态分布,那么这个分布可以用一个均值和方差来确定.这里是多维度,那么就可以用协方差矩阵来衡量多个维度之间的关系.,那么用均值和协方差矩阵就可以衡量两个高维分布之间的距离.
numpy 代码如下
# calculate frechet inception distance
def calculate_fid(act1, act2):
mu1, sigma1 = act1.mean(axis=0), cov(act1, rowvar=False)
mu2, sigma2 = act2.mean(axis=0), cov(act2, rowvar=False)
ssdiff = numpy.sum((mu1 - mu2)**2.0)
covmean = sqrtm(sigma1.dot(sigma2))
if iscomplexobj(covmean):
covmean = covmean.real
fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
return fid
act1 = random(10*2048)
act1 = act1.reshape((10,2048))
act2 = random(10*2048)
act2 = act2.reshape((10,2048))
# fid between act1 and act1
fid = calculate_fid(act1, act1)
print('FID (same): %f' % fid)
# fid between act1 and act2
fid = calculate_fid(act1, act2)
print('FID (different): %f' % fid)