前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用深度学习对你的颜值打分

使用深度学习对你的颜值打分

作者头像
计算机与AI
发布2020-12-14 15:22:50
2.3K1
发布2020-12-14 15:22:50
举报
文章被收录于专栏:计算机与AI计算机与AI

华南理工大学曾发表了一篇关于“面部美容预测”的论文和数据集。你可以在找到它。数据集包括5500人,他们的吸引力在1至5分之间。

以下是文中的一些示例:

集合中还有几个名人。朱莉娅·罗伯特(Julia Robert)的照片平均得分为3.78:

以色列著名模特Bar Refaeli的这张照片得到3.7分:

这些看起来像是低分,但是3.7分意味着bar比数据集中约80%的人颜值更高。

与数据集一起,作者训练了多个模型,这些模型试图根据面部图片预测一个人的颜值。

在这篇文章中,我将重现他们的结果。

原始论文实现了许多不同的模型,包括具有手工功能的经典ML模型和3种深度学习模型:AlexNet,ResNet18和ResNext50。 我想让我的工作尽可能简单(我不想resnet从头开始实现和训练整个网络),我想微调一些可以完成工作的现有模型。在中keras,有一个名为的模块applications,该模块是不同的预训练模型的集合。其中之一是resnet50。不幸的是,由于没有ResNet18或ResNext50,keras.applications因此我将无法复制完全相同的作品,但是我应该足够接近resnet50

代码语言:javascript
复制
from keras.applications import ResNet50

ResNet是由Microsoft开发并赢得2015年ImageNet竞赛的深度卷积网络,这是图像分类任务。 在启动resnet50 模型时keras,我们将使用ResNet50架构创建一个模型,并下载ImageNet数据集上已训练的权重。

该论文的作者没有提及他们如何精确训练模型,因此我将尽力而为。我想删除最后一层(“ softmax”层)并添加没有激活功能的全连接层来执行回归。

代码语言:javascript
复制
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。

我的计划是训练最终的Dense层,然后以较小的学习率训练整个网络。

代码语言:javascript
复制
model.compile(loss='mean_squared_error', optimizer=Adam())
model.fit(batch_size=32, x=train_X, y=train_Y, epochs=30)

在那之后,我将第一层更改为可训练,编译并拟合模型以适应另外30 epochs。

这里train_X是照片,即,numpy形状的阵列(350, 350, 3),和train_Y是图像的分数作为被标记。

结果

论文使用两种技术训练了模型:5倍交叉验证和60%-40%训练测试拆分。他们使用Pearson相关(PC),平均绝对误差(MAE)和均方根误差(RMSE)来测量结果。这些是他们使用5倍交叉验证得到的结果:

这些是他们使用60%-40%的训练测试划分获得的结果:

我将进行80%-20%的训练测试拆分,因此类似于执行其交叉验证部分的1倍。

我得到以下结果:

代码语言:javascript
复制
RMSE:0.301799791952313
MAE:0.2333630505619627
PC:0.9012570266136678

非常好。另外,最好查看散点图和分数的直方图:

原始分数分布(标准化):

预测分数分布(标准化):

结果看起来不错。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机与AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档