深度学习项目实战——“年龄预测”

简介: 学了那么多深度学习的基本知识,还在发愁没有地方展示自己学过的知识?来试试这个简单的实际问题吧!

更多深度文章,请关注:https://yq.aliyun.com/cloud


介绍:

你可以通过阅读或者观看视频/MOOC来学习数据科学,接着你就必须将学到的知识应用到解决问题当中来。你需要完成这两件事才能有效地完成你的学习计划。接下来这篇文章旨在向你介绍深度学习如何应用到一个有趣的问题。

今天我们将用深度学习来解决年龄检测问题

如果你是刚刚想要进入深度学习领域的new boy。请先阅读下面的文章,它们能帮你了解并且快速进入深度学习领域:

如果你已经花了几天或者几个月的时间来学习深度学习,并且正在寻找新的方式来提高你的深度学习技能,练习解决实际问题的例子无疑是最佳选择。我这样说是因为他们为你提供从头开始解决问题的经验,而且他们也不是很难。

以下是你应该选择几个实践问题练习的原因:

  • 花时间建立基础:我一直建议,我们应该始终建立一个正确的基础(思考问题陈述和探索数据集),并练习很多。但我仍然看到人们一开始就编码,而不考虑问题和理解数据。在这种方法中,你实际上不是在探索问题和数据,因为你正在专注于算法。
  • 同行学习(论坛/博客):在实践中,参与者在论坛或博客上分享他们的方法,并随时准备讨论新的方法。这实际上就是一种开源的学习方式。
  • 练习:这些实践问题就像你的练习课,在出山和解决现实生活中的问题之前。你应该首先多多练习,然后评估你的表现。相信熟能生巧,这句话。
  • 测试你的知识:这是一个伟大的方式,尝试练习你学到的东西,这将是非常有益。结果并不重要,因为这是一个练习问题。

让我们进入正题:如何用深度学习来预测年龄:

我假设你已经安装了numpyscipypandasscikit-learnkeras 。如果没有,请安装它们。以上文章可以帮助你。

第一件事 让我们下载数据并将其加载到我们的jupyter笔记本中!这里是实践问题的链接https://datahack.analyticsvidhya.com/contest/practice-problem-age-detection/

在建立模型之前,我希望你解决这个简单的练习:

你可以写一个脚本,随机地将图像加载到jupyter笔记本中并打印出来吗?(PS:不要看下面的答案!)。在这个讨论主题中发布你的代码。这是我实践的方法和往常一样,我先导入所有必要的模块,

% pylab inline
import os
import random
import pandas as pd
from scipy.misc import imread

然后我加载了csv文件,这样可以更容易找到文件

root_dir = os.path.abspath('.')
data_dir = '/mnt/hdd/datasets/misc'
train = pd.read_csv(os.path.join(data_dir, 'train.csv'))
test = pd.read_csv(os.path.join(data_dir, 'test.csv'))

然后我写了一个脚本来随机选择一个图像并打印出来

i = random.choice(train.index)
img_name = train.ID[i]
img = imread(os.path.join(data_dir, 'Train', img_name))
imshow(img)
print(‘Age: ‘, train.Class[i])

这是我得到的:AgeYOUNG

2ef03ad77e4f2d7b7c3d87c270bbbe0c5c7debde

上述实践的练习的动机是让你能随机的访问到数据集,并且帮助发现你在建立模型时可能遇到的问题。

这里有几个我从上述实践中分析到的可能在建立模型时要面对的问题的假设。

1.形状变化:一个图像是(66,46),而另一个图像是(102,87)。

2.多个方向:我们的图像可能是多个方向的,这里有些例子:

侧面图

a8b69c11918293e077edf41bb5a04a1f4fc85b4a

正视图

2ef03ad77e4f2d7b7c3d87c270bbbe0c5c7debde

3.图像质量:一些图像的质量可以太差了点,例如下面这张:

fdf3e9ea7e5a48eb5075d5f7ba84f854aff433f7

4.亮度和对比度差异:检查下面的图像, 他们似乎是故意来捣乱的,但是,这种现象在实际生活中确实存在。

现在,让我们先关注一个问题,即如何处理形状的变化?

d466f37d35f7cc2266b0f978f9eda54868531ae2

我们可以通过简单地调整图像大小来做到这一点。让我们加载所有的图像,并将它们调整为单个numpy数组

from scipy.misc import imresize
temp = []
for img_name in train.ID:
    img_path = os.path.join(data_dir, 'Train', img_name)
    img = imread(img_path)
    img = imresize(img, (32, 32))
    img = img.astype('float32') # this will help us in later stage
    temp.append(img)
train_x = np.stack(temp)

对于测试图像也是如此

temp = []
for img_name in test.ID:
    img_path = os.path.join(data_dir,'Test',img_name)
    img = imread(img_path)
    img = imresize(img,(32,32))
    temp.append(img.astype( 'FLOAT32'))
test_x = np.stack(temp)

我们可以做另外一件事情,帮助我们建立一个更好的模型:即我们可以标准化我们的图像,标准化图像将使我们的训练更快。

train_x = train_x / 255.
test_x = test_x / 255.

现在我们来看看我们的目标变量。我有一个问题:我们数据中类的分布是什么?你能说这是一个非常不平衡的问题吗?

这是我的尝试:

train.Class.value_counts(normalize=True)
 MIDDLE    0.542751
 YOUNG     0.336883
 OLD       0.120366
 Name: Class, dtype: float64

在分拣数据的基础上,我们可以创建一个简单的提交。我们看到大多数演员都是中年人。所以我们可以说我们测试数据集中的所有演员都是中年了!

在提交页面上上传这个文件,看看结果!

test['Class'] = 'MIDDLE'
test.to_csv(‘sub01.csv’, index=False)

让我们解决问题!第2部分:建立更好的模型

在建立模型之前,让我们为目标变量引进形状。我们将目标转换为虚拟列,以便我们的模型更容易吸收。

import keras
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
train_y = lb.fit_transform(train.Class)
train_y = keras.utils.np_utils.to_categorical(train_y)

现在是开始建立模型!由于问题与图像处理相关,使用神经网络来解决问题更为明智。我们也将为这个问题建立一个简单的前馈神经网络。

首先我们应该指定我们将在神经网络中使用的所有参数:

input_num_units = (32,32,3)
hidden_num_units = 500
output_num_units = 3
epochs = 5
batch_size = 128

然后我们将导入必要的keras模块

from keras.models import Sequential
from keras.layers import Dense, Flatten, InputLayer

之后,我们将定义我们的网络

model = Sequential([
  InputLayer(input_shape=input_num_units),
  Flatten(),
  Dense(units=hidden_num_units, activation='relu'),
  Dense(units=output_num_units, activation='softmax'),
])

看看我们的模型的效果如何:让它打印

model.summary()

60d42cc6cbd7910ea80b16eefc1801674a70eca7

现在让我们编译我们的网络并且让它训练一段时间

model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=batch_size,epochs=epochs,verbose=1)

2ae598481ffb349398257f630916e5f547ff37aa

好像已经训练好了!但是我们还没有验证它。如果我们想要确保我们的模型在对其进行培训的数据和新的测试数据上都能表现良好,验证是非常必要的。

让我们调整一下代码来验证它。

model.fit(train_x,train_y,batch_size = batch_size,epochs = epochs,verbose = 1,validation_split = 0.2)

f26e5ee842f26b05142f6d658d6dda69ab76fffc

该模型看起来比第一个模型表现要好。让我们提交结果。

pred = model.predict_classes(test_x)
pred = lb.inverse_transform(pred)
test ['Class'] = pred
test.to_csv('sub02.csv',index = False)

实际检查我们的预测(实际检验)

这是另一个简单的练习,打印你在模型中训练的图像。最好在你的训练数据集上进行此操作,以便你可以与真实的图像进行对比

i = random.choice(train.index)
img_name = train.ID[i]
img = imread(os.path.join(data_dir, 'Train', img_name)).astype('float32')
imshow(imresize(img, (128, 128)))
pred = model.predict_classes(train_x)
print('Original:', train.Class[i], 'Predicted:', lb.inverse_transform(pred[i]))
Original: MIDDLE Predicted: MIDDLE

f6937bf4541f94e5dd00b3b7cea18dd15f2734d5

下一步是什么?

我们已经建立了一个具有简单模型的基准解决方案。我们还能做些什么?

这里是我的一些建议:

  • 一个好的神经网络模型可以帮你取得更大的进步。你可以尝试使用更适合图像相关问题的卷积神经网络。这是一个简单的CNN供你参考
6945335e226494408bb02066318439bb3d972974

希望这个简单的年龄检测实践问题能够帮助到你!

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Hands on with Deep Learning -Solution for Age Detection Practice Problem》,

作者:Faizan Shaikh,数据科学爱好者,深度学习的新秀 译者:袁虎 审阅:

文章为简译,更为详细的内容,请查看原文

项目地址

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
机器学习/深度学习 编解码 数据挖掘
# 【深度学习】:《PyTorch入门到项目实战》(十三)卷积神经网络:多通道输入和多通道输出
我们之前已经介绍了单通道的卷积是如何进行填充**padding、stride**的。然而在实际分析中,我们的目标任务往往是**多通道**的。本文介绍一下如何进行**多通道输入和多通道输出。**
# 【深度学习】:《PyTorch入门到项目实战》(十三)卷积神经网络:多通道输入和多通道输出
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》(十二)填充(padding)和步幅(stride)
在之前,我们介绍了卷积核对输入特征的影响。假设输入特征为$n\times n$,核形状为$f\times f$,那么经过卷积核作用后,得到的输出形状为$(n-f+1)\times (n-f+1)$。可以看出,通常情况下输出特征会由于卷积核的作用而减小。而深度神经网络中,由于卷积核的作用,会导致我们的输出过早的变的很小,导致我们无法构建深层的神经网络。本章介绍另外两个影响输出形状的方法,扩充(padding)和步幅(stride)。
# 【深度学习】:《PyTorch入门到项目实战》(十二)填充(padding)和步幅(stride)
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》(十一):卷积层
>之前已经介绍了基本的神经网络知识以及一些处理过拟合欠拟合的概念。现在我们正式进入卷积神经网络的学习。CNN是⼀类强⼤的、为处理图像数据⽽设计的神经⽹络。基于卷积神经⽹络架构的模型在计算机视觉领域中已经占主导地位,当今⼏乎所有的图像识别、⽬标检测或语义分割相关的学术竞赛和商业应⽤都以这种⽅法为基础。对于计算机视觉而言,面临的一个重大挑战就是数据的输入可能会很大。例如,我们有一张64$\times$ 64的图片,假设通道数为3,那么它是数据量相当于是一个$64\times 64\times 3=12288$的特征向量。当我们要操作更大的图片时候,需要进行卷积计算,它是卷积神经网络中非常重要的一部
 # 【深度学习】:《PyTorch入门到项目实战》(十一):卷积层
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》第10天:梯度爆炸、梯度消失、梯度检验
训练神经网络时,尤其是深度神经网络所面临的一个重要问题就是梯度爆炸或梯度消失,也就是我们训练神经网络的时候,导数或梯度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。接下来我们介绍一些什么是梯度爆炸和梯度消失。
# 【深度学习】:《PyTorch入门到项目实战》第10天:梯度爆炸、梯度消失、梯度检验
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》第九天:Dropout实现
上一章我们介绍了L2正则化和权重衰退,在深度学习中,还有一个很实用的方法——Dropout,能够减少过拟合问题。之前我们介绍了我们的目的是要训练一种泛化的模型,那么就要求模型的鲁棒性较强。一个还不错的尝试是在训练神经网络时,让模型的结果不那么依赖某个神经元,因此在训练神经网络过程中,我们每次迭代将隐藏层的一些神经元随机丢弃掉,这样就不会使得我们的模型太依赖某一个神经元,从而使得我们的模型在未知的数据集上或许会有更好的泛化能力。下面我们具体来看dropout的原理。
 # 【深度学习】:《PyTorch入门到项目实战》第九天:Dropout实现
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》第八天:权重衰退(含源码)
前一节我们描述了过拟合的问题,虽然我们可以通过增加更多的数据来减少过拟合,但是成本较高,有时候并不能满足。因此现在我们来介绍一些正则化模型的方法。在深度学习中,权重衰退是使用较为广泛的一种正则化方法。具体原理如下。
# 【深度学习】:《PyTorch入门到项目实战》第八天:权重衰退(含源码)
|
机器学习/深度学习 资源调度 数据挖掘
# 【深度学习】:《PyTorch入门到项目实战》第六天:多层感知机(含代码)
上一章中介绍了如何使用softmax回归来进行多分类问题,对于一些基本线性模型基本介绍完毕,下面正式进入深度神经网络的学习。先介绍一个比较基础的模型,多层感知机,它是神经网络的最基础模型。首先我们来看看感知机
# 【深度学习】:《PyTorch入门到项目实战》第六天:多层感知机(含代码)
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》第五天:从0到1实现Softmax回归
softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签y可以取两个以上的值。本文基于MNIST手写数字数据集来演示如何使用Pytorch实现softmax回归
# 【深度学习】:《PyTorch入门到项目实战》第五天:从0到1实现Softmax回归
|
机器学习/深度学习 算法 数据挖掘
# 【深度学习】:《PyTorch入门到项目实战》从0到1实现logistic回归
`logistic回归`虽然名字是回归,但实际上是一个分类算法,主要处理二分类问题,具体理论部分大家可以看我的这篇文章
# 【深度学习】:《PyTorch入门到项目实战》从0到1实现logistic回归
|
机器学习/深度学习 算法 数据挖掘
# 【深度学习】:《PyTorch入门到项目实战》第三天:简洁代码实现线性神经网络(附代码)
在上一节我们学习了如何使用pytorch从零实现一个线性回归模型。包括生成数据集,构建损失函数,==<corlor>梯度下降==优化求解参数等。和很多其他机器学习框架一样,pytorch中也包含了许多可以自动实现机器学习的包。本章介绍一些如何使用`nn`简便的实现一个线性回归模型
 # 【深度学习】:《PyTorch入门到项目实战》第三天:简洁代码实现线性神经网络(附代码)