天天看點

ResNet告訴我,我是不是世界上最美的人?

什麼?!顔值“客觀化”要進行實質性推進了?

幾個月前,華南理工大學釋出了一篇關于“顔值評估”的論文及其資料集。

這個資料集包括5500人,每人的長相被從1-5分進行打分。

資料的下載下傳位址如下:

https://github.com/HCIILAB/SCUT-FBP5500-Database-Release

讓文摘菌來舉個栗子,你就知道這個資料是咋回事啦。

ResNet告訴我,我是不是世界上最美的人?
資料集中還包括一些明星。這張Julia Roberts的照片平均得分為3.78:
ResNet告訴我,我是不是世界上最美的人?
這張以色列著名模特Bar Refaeli的照片獲得了3.7分。
ResNet告訴我,我是不是世界上最美的人?

這些分數可能看起來有點低,但3.7分已經代表你的顔值比資料集中約80%的人高了。

在這個資料集上,作者訓練了多個模型,試圖根據人臉圖檔評估顔值。

在這篇文章中,我要複現他們的結果,并測一下自己的顔值。

原始論文構造了一系列不同的模型,包括使用人工構造特征的經典ML模型和3種深度學習模型:AlexNet、ResNet18和ResNext50,我希望盡可能簡化我的工作(我不想從頭開始訓練Resnet神經網絡模型),我想對現有的模型進行調優。在keras中,有一個稱為application的子產品,它包含各種不同的預訓練過的模型。resnet50就是其中之一。 不幸的是,在keras.applications中沒有ResNet18或ResNext50,是以我不能完全複現研究人員之前的研究過程,不過利用resnet50也能足夠接近之前的工作。

from keras.applications import ResNet50           

ResNet是一個由微軟開發的深度卷積網絡,它赢得了2015 年的ImageNet圖像分類任務競賽。

在keras中,當我們初始化resnet50模型時,我們建立了一個ResNet50結構的模型,并且下載下傳了在ImageNet資料集上訓練的權重。

論文的作者沒并有提到他們究竟是如何訓練模型的,不過我會盡力做到最好。

我想删除最後一層(“softmax”層)并添加一個沒有激活函數的全連接配接層來做回歸。

resnet = ResNet50(include_top=False, pooling=’avg’)

model = Sequential()

model.add(resnet)

model.add(Dense(1))



model.layers[0].trainable = False



print model.summary()



# Output:

Layer (type) Output Shape Param # ================================================================= resnet50 (Model) (None, 2048) 23587712 
_________________________________________________________________ dense_1 (Dense) (None, 1) 2049 ================================================================= Total params: 23,589,761 

Trainable params: 23,536,641 

Non-trainable params: 53,120           

你可以看到我把第一層(resnet模型)設定為不可訓練的,是以我隻有2049個可訓練的參數,而不是23589761個參數。

我的計劃是訓練最後的全連接配接層,然後以較小的學習率訓練整個網絡。

model.compile(loss='mean_squared_error', optimizer=Adam())

model.fit(batch_size=32, x=train_X, y=train_Y, epochs=30)           

之後,我将第一層改為可訓練的,編譯模型,并再把模型訓練30輪。

在這裡,train_X代表照片,也就是形狀為(350,350,3)的numpy矩陣,train_Y是圖像被标記的分數。

結論

論文使用2種方法訓練模型:5折交叉驗證和以6:4的比例将資料集分割為訓練集和測試集。他們使用皮爾遜相關系數(PC),平均絕對誤差(MAE)和均方根誤差(RMSE)來測評估模型的結果。以下是他們使用5折交叉驗證得到的結果:

ResNet告訴我,我是不是世界上最美的人?

這些是他們使用6:4分割資料集獲得的結果:

ResNet告訴我,我是不是世界上最美的人?

我以8:2的比例分割資料集,是以它類似于執行1折交叉驗證。

我得到的結果如下:

非常好的結果。另外,也可以看看散點圖和直方圖:

ResNet告訴我,我是不是世界上最美的人?

原始分數分布(标準化後的):

ResNet告訴我,我是不是世界上最美的人?

預測分數分布(标準化後的):

ResNet告訴我,我是不是世界上最美的人?

結果看起來不錯。現在在我身上試試這個這個神經網絡。我首先使用這張照片:

ResNet告訴我,我是不是世界上最美的人?

我的分數是2.85,這意味着我的顔值比資料集中52%的人高。不得不說我有點失望,我以為我的分數會高一些,是以我試圖提高我的分數。

我拍了很多照片,最終我得到了3.15分,這意味着我比資料集中64%的人更具吸引力。

ResNet告訴我,我是不是世界上最美的人?

這比之前好很多了,不過我必須誠實地說,我希望還能更高:)

最後一點,我使用Google Colaboratory建構和調整了這個模型,簡而言之,Google Colaboratory能為你提供一個免費使用GPU的python notebook!

原文釋出時間為:2018-04-24

本文作者:文摘菌

本文來自雲栖社群合作夥伴“

大資料文摘

”,了解相關資訊可以關注“

”。

繼續閱讀