學習GAN模型量化評價,先從掌握FID開始吧

2021-01-08 機器之心Pro

選自machinelearningmastery

作者:Jason Brownlee

機器之心編譯

編譯:高璇,Geek AI

要說誰是當下最火的生成模型,GAN 當之無愧!然而,模式坍塌、訓練不穩定等問題嚴重製約著 GAN 家族的發展。為了提圖像質量、樣本多樣性的角度量化評價 GAN 模型的性能,研究者們提出了一系列度量指標,其中 FID 就是近年來備受關注的明星技術,本文將詳細介紹如何在 python 環境下實現 Frechet Inception 距離(FID)。

Frechet Inception 距離得分(Frechet Inception Distance score,FID)是計算真實圖像和生成圖像的特徵向量之間距離的一種度量。

FID 從原始圖像的計算機視覺特徵的統計方面的相似度來衡量兩組圖像的相似度,這種視覺特徵是使用 Inception v3 圖像分類模型計算的得到的。分數越低代表兩組圖像越相似,或者說二者的統計量越相似,FID 在最佳情況下的得分為 0.0,表示兩組圖像相同。

FID 分數被用於評估由生成性對抗網絡生成的圖像的質量,較低的分數與較高質量的圖像有很高的相關性。

在本教程中,你將了解如何通過 FID 評估生成的圖像。

同時你還將了解:

FID 綜合表徵了相同的域中真實圖像和生成圖像的 Inception 特徵向量之間的距離。如何計算 FID 分數並在 NumPy 環境下實現 FID。如何使用 Keras 深度學習庫實現 FID 分數並使用真實圖像進行計算。

在本文作者有關 GAN 的新書中,讀者可以了解到如何使用 Keras 開發 DCGAN、條件 GAN、Pix2Pix、CycleGAN 等對抗生成網絡,書中還提供 29 個詳細教程和完整原始碼。

下面進入正文部分:

教程概述

本教程分為五個部分,分別是:

何為 FID?如何計算 FID?如何通過 NumPy 實現 FID?如何通過 Keras 實現 FID?如何計算真實圖像的 FID?

機器之心整理了前三部分的代碼,感興趣的讀者可以在原文中查看 Keras 的 FID 實現和計算真實圖像 FID 的方法。

何為 FID?

Frechet Inception 距離(FID)是評估生成圖像質量的度量標準,專門用於評估生成對抗網絡的性能。

FID 分數由 Martin Heusel 等人於 2017 年在論文「GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium」(https://arxiv.org/abs/1706.08500017)中提出並使用。

該分數作為對現有的 Inception 分數(IS)的改進而被提出。

為了評估 GAN 在圖像生成任務中的性能,我們引入了「Frechet Inception Distance」(FID),它能比 Inception 分數更好地計算生成圖像與真實圖像的相似性。——「GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium」(https://arxiv.org/abs/1706.08500), 2017.

Inception 分數基於目前性能最佳的圖像分類模型 Inception v3 對一組合成圖像的分類情況(將其分類為 1,000 類對象中的一種)來評估圖像的質量。該分數結合了每個合成圖像的條件類預測的置信度(質量)和預測類別的邊緣概率積分(多樣性)。

Inception 分數缺少合成圖像與真實圖像的比較。研發 FID 分數的目的是基於一組合成圖像的統計量與來自目標域的真實圖像的統計量進行的比較,實現對合成圖像的評估。

Inception 分數的缺點是沒有使用現實世界樣本的統計量,並將其與合成樣本的統計量進行比較。——「GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium 」(https://arxiv.org/abs/1706.08500), 2017.

與 Inception 分數一樣,FID 分數也使用了 Inception v3 模型。具體而言,模型的編碼層(圖像的分類輸出之前的最後池化層)被用來抽取輸入圖像的用計算機視覺技術指定的特徵。這些激活函數是針對一組真實圖像和生成圖像計算的。

通過計算圖像的均值和協方差,將激活函數的輸出歸納為一個多變量高斯分布。然後將這些統計量用於計算真實圖像和生成圖像集合中的激活函數。

然後使用 Frechet 距離(又稱 Wasserstein-2 距離)計算這兩個分布之間的距離。

兩個高斯分布(合成圖像和真實圖像)的差異由 Frechet 距離(又稱 Wasserstein-2 距離)測量。——「GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium」(https://arxiv.org/abs/1706.08500), 2017.

使用來自 Inception v3 模型的激活函數輸出來歸納每個圖像,得分即為「Frechet Inception Distance」。

FID 越低,圖像質量越好;反之,得分越高,質量越差,兩者關係應該是線性的。

該分數的提出者表明,當應用系統失真(如加入隨機噪聲和模糊)時,FID 越低,圖像質量越好。

圖像失真程度的提高與高 FID 分數之間的關係。

如何計算 Frechet Inception 距離?

首先,通過加載經過預訓練的 Inception v3 模型來計算 FID 分數。

刪除模型原本的輸出層,將輸出層換為最後一個池化層(即全局空間池化層)的激活函數輸出值。此輸出層有 2,048 維的激活向量,因此,每個圖像被預測為 2,048 個激活特徵。該向量被稱為圖像的編碼向量或特徵向量。

針對一組來自問題域的真實圖像,預測 2,048 維的特徵向量,用來提供真實圖像表徵的參考。然後可以計算合成圖像的特徵向量。

結果就是真實圖像和生成圖像各自的 2,048 維特徵向量的集合。

然後使用以下公式計算 FID 分數:

該分數被記為 d^2,表示它是一個有平方項的距離。

「mu_1」和「mu_2」指的是真實圖像和生成圖像的特徵均值(例如,2,048 維的元素向量,其中每個元素都是在圖像中觀察到的平均特徵)。

C_1 和 C_2 是真實圖像的和生成圖像的特徵向量的協方差矩陣,通常被稱為 sigma。

|| mu_1-mu_2 ||^2 代表兩個平均向量差的平方和。Tr 指的是被稱為「跡」的線性代數運算(即方陣主對角線上的元素之和)。

sqrt 是方陣的平方根,由兩個協方差矩陣之間的乘積給出。

矩陣的平方根通常也被寫作 M^(1/2),即矩陣的 1/2 次方。此運算可能會失敗,由於該運算是使用數值方法求解的,是否成功取決於矩陣中的值。通常,所得矩陣中的一些元素可能是虛數,它們通常可以被檢測出來並刪除。

如何用 NumPy 實現 Frechet Inception 距離?

使用 NumPy 數組在 Python 中實現 FID 分數的計算非常簡單。

首先,讓我們定義一個函數,它將為真實圖像和生成圖像獲得一組激活函數值,並返回 FID 分數。

下面列出的「calculate_fid()」函數實現了該過程。

通過該函數,我們幾乎直接實現了 FID 分數的計算。值得注意的是,TensorFlow 中的官方實現計算元素的順序稍有不同(可能是為了提高效率),並在加入了矩陣平方根附近的額外檢查,以處理可能的數值不穩定性。

如果在自己的數據集上計算 FID 時遇到問題,我建議你查看官方教程並擴展下面的實現,以添加這些檢查。

defcalculate_fid(act1, act2):# calculate mean and covariance statistics mu1, sigma1 = act1.mean(axis=0), cov(act1, rowvar=False) mu2, sigma2 = act2.mean(axis=0), cov(act2, rowvar=False)# calculate sum squared difference between means ssdiff = numpy.sum((mu1 - mu2)*2.0)# calculate sqrt of product between cov covmean = sqrtm(sigma1.dot(sigma2))# check and correct imaginary numbers from sqrtif iscomplexobj(covmean): covmean = covmean.real# calculate score fid = ssdiff + trace(sigma1 + sigma2 - 2.0 covmean)return fid

接下來,我們可以測試這個函數來計算一些人造特徵向量的 Inception 分數。

特徵向量可能包含小的正值,長度為 2,048 個元素。我們可以用包含小隨機數的特徵向量構建兩組圖像(每組 10 幅),如下所示:

act1 = random(102048)act1 = act1.reshape((10,2048))act2 = random(102048)act2 = act2.reshape((10,2048))

一個測試是計算一組激活與其自身之間的 FID,我們期望分數為 0.0。

然後計算兩組隨機激活之間的距離,我們期望它們是一個很大的數字。

fid = calculate_fid(act1, act1)print('FID (same): %.3f' % fid)fid = calculate_fid(act1, act2)print('FID (different): %.3f' % fid)

將所有這些結合在一起,完整的示例如下:

import numpyfrom numpy import covfrom numpy import tracefrom numpy import iscomplexobjfrom numpy.random import randomfrom scipy.linalg import sqrtmdefcalculate_fid(act1, act2):# calculate mean and covariance statistics mu1, sigma1 = act1.mean(axis=0), cov(act1, rowvar=False) mu2, sigma2 = act2.mean(axis=0), cov(act2, rowvar=False)# calculate sum squared difference between means ssdiff = numpy.sum((mu1 - mu2)*2.0)# calculate sqrt of product between cov covmean = sqrtm(sigma1.dot(sigma2))# check and correct imaginary numbers from sqrtif iscomplexobj(covmean): covmean = covmean.real# calculate score fid = ssdiff + trace(sigma1 + sigma2 - 2.0 covmean)return fidact1 = random(102048)act1 = act1.reshape((10,2048))act2 = random(102048)act2 = act2.reshape((10,2048))fid = calculate_fid(act1, act1)print('FID (same): %.3f' % fid)fid = calculate_fid(act1, act2)print('FID (different): %.3f' % fid)

運行這段代碼示例,首先會顯示出激活函數值「act1」和它自己之間的 FID 分數,正如我們所預想的那樣,該值為 0.0(註:該分數的符號可以忽略)

同樣,正如我們所預料的,兩組隨機激活函數值之間的距離是一個很大的數字,在本例中為 358

FID (same): -0.000FID (different): 358.927

原文連結:https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/

相關焦點

  • 如何找到好的主題模型量化評價指標?這是一份熱門方法總結
    但是提取的主題到底質量如何,如何進行量化分析和評價,仍然沒有確定的標準。同時,隨著神經網絡的發展,encoding-decoding, GAN 這種非監督模型開始進入到主題模型的應用中來,如何判斷這些模型產生的主題有效性就更顯得重要了。同時,這些神經網絡本身也可以作為評測的方法之一。
  • 工程之道,深度學習的工業級模型量化實戰
    來源:新浪證券背景近年來隨著邊緣計算和物聯網的興起與發展,許多移動終端(比如手機)成為了深度學習應用的承載平臺,甚至出現了各式各樣專用的神經網絡計算晶片。由於這些設備往往對計算資源和能耗有較大限制,因此在高性能伺服器上訓練得到的神經網絡模型需要進行裁剪以縮小內存佔用、提升計算速度後,才能較好地在這些平臺上運行。
  • 超全的GAN PyTorch+Keras實現集合
    /ccgan.py本論文介紹了一種基於圖像的半監督學習方法,它在繪畫中將使用對抗性損失函數。作者表示模型可以以類別標籤為條件生成 MNIST 手寫數字,同時還展示了如何使用該模型學習多模態模型,並提供了一個應用於圖像標註的簡單示例,他們展示了這種方法如何生成不屬於訓練標註的描述性標籤。
  • 想知道詞根fid什麼意思?看看confident一詞的由來吧!
    fid=believe,trust,表示「相信;信任」。1.confide v.吐露;委託;信賴(con=together「一起;共同」,fid「相信;信任」,e詞尾無實義,一起/彼此信任才能彼此信賴,吐露心聲)例句:The more people trust you, the more they will confide in you.
  • 綜合素質評價的量化路徑
    解決這個問題,量化路徑是一個研究探索方向,其中量化方法成為有的綜合素質評價方案的核心要素。  綜合素質評價的量化研究固然是積極的探索,但在實際操作中,由於理論準備不足,存在一些誤區。例如,有的學校方案規定,學生的前30%劃為「優秀」等級。但是學生群體屬性特徵真的具有這樣確定的比例差別嗎?如果沒有,就會導致對某一部分學生的評價結果帶有較大的偏差。
  • 本座選股談量化投資—隱馬爾可夫模型
    首先這篇文章是寫給沒有什麼基礎人士看的,目的是讓更多可能數學上有些障礙,但是又想要了解量化投資的朋友,無障礙的理解隱馬爾可夫模型框架。此文不適合追求嚴密邏輯和追求簡潔符號建立模型的數學大神。如果您是,請選擇性忽略。
  • 如何使用GAN做一個禿頭生產器
    生成對抗網絡介紹  說到圖像生成,就必須說到GAN,它是一種非監督學習的方式,通過讓兩個神經網絡相互博弈的方法進行學習,該方法由lan Goodfellow等人在2014年提出。生成對抗網絡由一個生成網絡和一個判別網絡組成,生成網絡從潛在的空間(latent space)中隨機採樣作為輸入,其輸出結果需要儘量模仿訓練集中的真實樣本。
  • 量化選股策略——多因子模型(圖)
    [ 多因子模型是量化選股中最重要的一類模型,其基本思想就是找到某些和收益率最相關的指標。並根據該指標,構建一個股票組合,期望該組合在未來的一段時間跑贏或者跑輸指數。  多因子選股模型的建立過程主要分為候選因子的選取、選股因子有效性的檢驗、有效但冗餘因子的剔除、綜合評分模型的建立和模型的評價及持續改進等5個步驟。  候選因子的選取  候選因子的選擇主要依賴於經濟邏輯和市場經驗,但選擇更多和更有效的因子無疑是增強模型信息捕獲能力,提高收益的關鍵因素之一。
  • 半導體材料的裝備技術尚未掌握
    微電子技術發展日新月異,面臨許多未解決的新問題,因此,學習微電子工程技術是一個持久戰。微電子技術這幾年發展如火如荼,受到計算機技術及微軟技術的快速發展等推動,我國微電子技術取得了快速進步,並取得了一系列重大成果,如砷化、質子交換膜等。
  • 生成式對抗網絡GAN的高級議題
    以下是用於執行此文本到圖像條件合成的多條件GAN(MC-GAN)的示例:mc-gan的實現,用於將單詞翻譯成圖像數據擴充GAN像在查看VAE時一樣學習數據生成分布。因此,我們可以從我們的發生器中採樣並生成其他樣本,我們可以使用這些樣本來增強我們的訓練集。因此,GAN提供了另外的方法來執行數據增加(除了旋轉和扭曲圖像之外)。
  • 量化| 模型校正在量化金融中的應用
    原標題:量化 | 模型校正在量化金融中的應用 只做專業交易軟體 | 交易開拓者旗艦版 | TB-Plus | TB-Smart | 定價問題是sin(π/6) = 0.5,把正弦函數看成是個「模型」,那麼與之對應的校正問題就是sin多少等於0.5,校正 (用反正弦argsin(0.5)) 出來的結果是π/6 。 雖然上面兩例「校正」不難,但也比「定價」難吧。
  • GAN(生成對抗網絡)萬字長文綜述
    有了這種距離度量方式,自然就可以使用判別器去指導生成器的學習。 AE 作為判別器,為什麼就可以當做能量函數,用於度量生成樣本離數據流形空間的距離呢?首先,先看 AE 的 loss:使用輔助分類器的半監督學習 上面提及的利用判別器進行半監督學習的模型存在一個問題。判別器既要學習區分正負樣本,也要學習預測標籤。二者目標不一致,容易導致二者都達不到最優。一個直觀的想法就把預測標籤和區分正負樣本分開。
  • 萬字綜述之生成對抗網絡(GAN)
    使用輔助分類器的半監督學習上面提及的利用判別器進行半監督學習的模型存在一個問題。判別器既要學習區分正負樣本,也要學習預測標籤。二者目標不一致,容易導致二者都達不到最優。一個直觀的想法就把預測標籤和區分正負樣本分開。
  • GAN快速入門資料推薦:17種變體的Keras開原始碼,附相關論文
    通過自己動手、探索模型代碼來學習,當然是墜吼的~如果用簡單易上手的Keras框架,那就更贊了。一位GitHub群眾eriklindernoren就發布了17種GAN的Keras實現,得到Keras親爸爸Franois Chollet在Twitter上的熱情推薦。
  • 每日英文小知識—— 詞根 fid
    詞根 fid,fiss = break,spilt 裂開
  • 萬字長文解讀GAN:從基本概念、原理到實際應用
    有了這種距離度量方式,自然就可以使用判別器去指導生成器的學習。AE 作為判別器,為什麼就可以當做能量函數,用於度量生成樣本離數據流形空間的距離呢?首先,先看 AE 的 loss:AE 的 loss 是一個重構誤差。使用 AE 做為判別器時,如果輸入真實樣本,其重構誤差會很小。如果輸入生成的樣本,其重構誤差會很大。
  • 異父異母的三胞胎:CycleGAN, DiscoGAN, DualGAN
    事實上,dualgan這篇paper的出發點就來源於此,並且這三篇文章的中心創新點(cycle consistentcy)就是dual learning中的想法。(雖然cyclegan似乎不知道這篇論文,並沒有引用dual learning)CycleGAN的出發點更抽象。
  • 傳播效果四度評價法公布 品牌傳播效果可量化評估
    傳播效果四度評價法是修宇博士於2018年9月提出的一種傳播效果量化評估體系。傳播效果四度評價法以媒體與用戶、社會之間的關係為研究核心,以媒體對用戶的認知、態度、行為的影響和用戶對媒體的影響為研究對象。傳播效果四度評價法將衡量傳播效果的多種表徵轉化為傳播度、影響度、友好度、互動度這四個方面的可測指標,並賦予不同的權重,形成全面系統的傳播效果量化評估體系,實現評估結果的可比性。
  • 通過friend朋友,快記fid相信,速記系列英語單詞
    混臉熟的已知單詞推詞根:friend朋友,抽出來fid(相信)+ren(人-拼音),相信的人是朋友已知詞根來推記:id指身份,前面我們聊過cid月亮下的身份-月亮下的狼人在「砍,殺」,同理推出fid-朋友的身份「相信」fidget(形同詞混臉熟的):(想一下網絡用語get到)get不到fid信任真的讓人「煩燥」fiddler
  • ResNet壓縮20倍,Facebook提出新型無監督模型壓縮量化方法
    機器之心原創 作者:立早 怎樣用量化方法解決模型壓縮問題?Facebook 近日提出了一個基於向量的量化方法,無需標註數據即可對 ResNet 模型進行20倍壓縮,還能夠獲得很高的準確率。