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

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

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


介绍:算法

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

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

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

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

如下是你应该选择几个实践问题练习的缘由:dom

 

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

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

我假设你已经安装了numpy,scipypandasscikit-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])

 

这是我获得的:Age:YOUNG

 

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

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

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

 

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

侧面图

 

 

正视图

 

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

 

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

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

 

 

咱们能够经过简单地调整图像大小来作到这一点。让咱们加载全部的图像,并将它们调整为单个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()

 

 

如今让咱们编译咱们的网络而且让它训练一段时间:

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

 

 

好像已经训练好了!可是咱们尚未验证它。若是咱们想要确保咱们的模型在对其进行培训的数据和新的测试数据上都能表现良好,验证是很是必要的。

 

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

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

 

 

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

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

 

 

下一步是什么?

咱们已经创建了一个具备简单模型的基准解决方案。咱们还能作些什么?

 

这里是个人一些建议:

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

 

但愿这个简单的年龄检测实践问题可以帮助到你!

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

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

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

 

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

项目地址

本文由用户为我的学习及研究之目的自行翻译发表,如发现侵犯原做者的版权,请与社区联系处理yqgroup@service.aliyun.com
相关文章
相关标签/搜索