什麼?!顔值“客觀化”要進行實質性推進了?
幾個月前,華南理工大學釋出了一篇關于“顔值評估”的論文及其資料集。
這個資料集包括5500人,每人的長相被從1-5分進行打分。
資料的下載下傳位址如下:
https://github.com/HCIILAB/SCUT-FBP5500-Database-Release
讓文摘菌來舉個栗子,你就知道這個資料是咋回事啦。
資料集中還包括一些明星。這張Julia Roberts的照片平均得分為3.78: 這張以色列著名模特Bar Refaeli的照片獲得了3.7分。這些分數可能看起來有點低,但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折交叉驗證得到的結果:
這些是他們使用6:4分割資料集獲得的結果:
我以8:2的比例分割資料集,是以它類似于執行1折交叉驗證。
我得到的結果如下:
非常好的結果。另外,也可以看看散點圖和直方圖:
原始分數分布(标準化後的):
預測分數分布(标準化後的):
結果看起來不錯。現在在我身上試試這個這個神經網絡。我首先使用這張照片:
我的分數是2.85,這意味着我的顔值比資料集中52%的人高。不得不說我有點失望,我以為我的分數會高一些,是以我試圖提高我的分數。
我拍了很多照片,最終我得到了3.15分,這意味着我比資料集中64%的人更具吸引力。
這比之前好很多了,不過我必須誠實地說,我希望還能更高:)
最後一點,我使用Google Colaboratory建構和調整了這個模型,簡而言之,Google Colaboratory能為你提供一個免費使用GPU的python notebook!
原文釋出時間為:2018-04-24
本文作者:文摘菌
本文來自雲栖社群合作夥伴“
大資料文摘”,了解相關資訊可以關注“
”。