SI and FID

from: https://zhuanlan.zhihu.com/p/54213305

source code:https://github.com/mseitzer/pytorch-fid

https://zhuanlan.zhihu.com/p/54146307

Inception Score 的問題

首先回顧一下 Inception Score 的兩個假設:

  1. 越真實的圖片,輸入預訓練的 Inception V3 ,分類的結果越明確。即在1000維的輸出向量中,某一維很大,其餘維很小。也就是說,輸出的概率分佈函數圖越尖銳。
  2. 生成的圖片多樣性越強,那麼類別的邊緣分佈就越平均,邊緣分佈的概率函數圖像就越平整。

Inception Score 通過計算 1 和 2 中兩個概率分佈的散度,來衡量生成模型的表現。

我們乍一看這兩條假設,不難發現最明顯的兩個問題:

  1. 針對第一個假設,是否越真實的圖片,分類網絡輸出的概率分佈函數越尖銳?顯然是不見得的,如果某一個物體所屬的類別在分類網絡中並不存在,那麼它的分佈函數依然尖銳嗎?
  2. 針對第二個假設,是否輸出圖片均勻地覆蓋每個類別,就意味着生成模型不存在 mode collapse?Inception net 輸出 1000 類,假設生成模型在每類上都生成了 50 個圖片,那麼生成的圖片的類別邊緣分佈是嚴格均勻分佈的,按照 Inception Score 的假設,這種模型不存在 mode collapse,但是,如果各類中的50個圖片,都是一模一樣的,仍然是 mode collapse。Inception Score 無法檢測這種情況。

除了上面最直觀的兩個硬傷,本文開頭提到的文章中對 Inception Score 缺點做了詳細分析。其中涉及到:使用 IS 時,分類模型應該和生成模型在同一個訓練集上訓練,否則分類模型計算的邊緣分佈將不準確,而分類模型對單個圖片的預測,也將不能真實反映圖片的清晰程度。

出現這一問題的本質原因是:計算 IS 時只考慮了生成樣本,沒有考慮真實數據,即 IS 無法反映真實數據和樣本之間的距離,IS 判斷數據真實性的依據,源於 Inception V3 的訓練集: ImageNet,在 Inception V3 的“世界觀”下,凡是不像 ImageNet 的數據,都是不真實的,都不能保證輸出一個 sharp 的 predition distribution。

Fréchet Inception Distance

而 Fréchet Inception Distance (FID) 則是計算了真實圖片和假圖片在 feature 層面的距離,因此顯得更有道理一點。FID 的公式如下:

[公式]

衆所周知,預訓練好的神經網絡頂層可以提取圖片的高級信息,一定程度能反映圖片的本質。因此,FID 的提出者通過預訓練的 Inception V3 來提取全連接層之前的 2048 維向量,作爲圖片的特徵。公式 (1) 中:

[公式] :真實圖片的特徵的均值

[公式] :生成的圖片的特徵的均值

[公式] : 真實圖片的特徵的協方差矩陣

[公式] : 生成圖片的特徵的協方差矩陣

FID 用以衡量兩個多元正態分佈的距離,具體的來源見論文:

The Fréchet distance between multivariate normal distributions​www.sciencedirect.com圖標

我數學能力有限,實在讀不懂,好在最後的距離公式還是比較簡單的,直接套進去就能用了。

FID 只把 Inception V3 作爲特徵提取器,並不依賴它判斷圖片的具體類別,hang因此不必擔心 Inception V3 的訓練數據和生成模型的訓練數據不同。同時,由於直接衡量生成數據和真實數據的分佈之間的距離,也不必擔心每個類別內部只產生一模一樣的圖片這種形式的 mode collapse。完美避開了很多 Inception Score 的缺陷。

總結

綜上所述,對比 IS,FID 有如下優點:

  1. 生成模型的訓練集和 Inception V3 的訓練集可以不同。
  2. 計算 FID 時同時用到了生成的數據和真實數據,比起 IS 來更靈活。可以理解成,IS 判斷真實性與否,是把生成數據和 ImageNet 數據做比較,而 FID 是把生成數據和訓練數據做比較,因此更 reasonable。
  3. 以優化 FID 爲目標,不會產生對抗樣本。因爲優化的是 lantent space feature,不是最終的輸出圖片,不會導致最終的生成圖片失真。

但是基於我的上篇文章 尹相楠:Inception Score 的原理和侷限性,FID 仍然存在一些和 IS 同樣的問題:

  1. FID 只是某一層的特徵的分佈,是否足以衡量真實數據分佈與生成數據分佈的距離?同時,提出 FID 公式計算的是多元正態分佈的距離,顯然神經網絡提取的特徵並不是多元正態分佈。
  2. 針對同一個生成模型,不同框架下預訓練的 Inception V3 算出的 FID 差別是否可以忽略?
  3. FID 無法反映生成模型過擬合的情況,如果某個生成模型只是簡單拷貝訓練數據,FID 會非常小,認爲這是一個完美的生成模型,因此,使用 FID 時同時也要通過別的手段證明生成模型沒有過擬合。

代碼實現

下面的鏈接是基於 pytorch 的計算 FID 的代碼。

mseitzer/pytorch-fid​github.com圖標

 

~~注意作者在源碼中並沒有加載 Inception V3 的權重,因此千萬不要直接套用。建議讀者自己繼承一下 pytorch Inception V3 的類,修改 forward 函數,讓它返回全連接層前面的 2048 維向量,這樣就可以直接加載 pytorch 官方的Inception V3 的權重了。~~

之前沒有仔細看代碼貿然提了個 issue,發現作者其實加載了 Inception V3 的權重,在inception.py文件的第 60 行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章