走近深度学习——来解决一个年龄检测的问题-36大数据
介绍
通过阅读或观看视频/MOOC来学习数据是一回事,将之应用到具体问题之中又是另一回事了。你需要同时做好才能有效地学习这个主题。今天的文章旨在帮助你将深度学习应用于一个有趣的问题。 如果你在质疑,为什么研究或应用深度学习?你需要从自己的世界里走出来,开始了解这个话题。深度学习已经实现了摄像头上的人脸检测,移动设备上的语音识别以及深度学习汽车的开发。今天我们将用深度学习来解决年龄检测问题。
如果你是深度学习的新手,建议参考以下文章,然后再浏览本教程并提交相关代码。
- https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/
- https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/
- https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/
文章内容
- 为什么参加实践练习(深度学习)?
- 又出了什么问题?
- 让我们解决问题!
- 休息时间:我们首次提交
- 让我们解决问题!第2部分:建立更好的模型
- 休息时间:检查我们的预测
- 下一步是什么?
为什么参加实践练习(深度学习)?
如果你在过去几天/几个月内研究或读到过深度学习,并且正在寻求应用你的新技能,那么练习问题无疑是正确的开始。我这样说是因为他们为你提供从头开始解决问题的经验,而非对你操之过急。
以下是你应该选择几个实践问题的原因:
- 有时间建立basics: 我总是建议,我们应该始终建立一个正确的basics(考虑问题陈述和探索数据集),并进行很多练习。然而,我仍然看到人们不考虑问题和理解数据,就开始编写代码。在这种方法中,你实际上不会探索问题和数据,因为你正在专注于直接利用算法。
- 同行学习(论坛/博客): 在实践中,参与者通过论坛或博客分享他们的方法,并随时准备讨论新的方法。人们不会相互隐瞒,因为这不是很有价值的竞争。
- 实践: 这些练习问题就像你在出门并解决现实生活中的问题之前的实习课程。你应该首先评估你的表现,并尽力做好。你在此期间的主要目标应该是充分利用工具,算法和数据集。
- 测试你的知识: 这是一个尝试你所学的好地方,会让你受益匪浅。结果并不重要,因为这只是一个练习问题。
又出了什么问题?
参与hackathon的第一步是理解问题。在这篇文章中,我们将看一个最近发表的实践问题:印度演员的年龄检测。你可以在hackathon页面上查看问题陈述,但我将在此简单介绍一下。
任务是从他或她的面部特征来预测一个人的年龄。为了简单起见,问题已被转换为分类青年,中年和老年的问题。
似乎第一眼看起来很容易?
如果你真的看到数据,就会知道,这甚至只是一个人都似乎很困难!让我们自己检查一下!以下是我们的数据的一些随机的好例子。
中年
老年
青年
但是你能猜猜这些是什么年龄段的吗?
显然都是中年演员!
要解决这些问题,你需要一个精简的方法。我们将在下一节中看到这一点。
让我们解决问题!
现在你已知晓了这个问题,让我们开始吧。我假设你已经安装了numpy、scipy、pandas、scikit-learn和keras。如果没有,请安装它们。以上article可以帮助你解决问题。
第一件事让我们下载数据并将其加载到我们的jupyter notesbook中!如果你还没有了解,这里是实践问题的链接( https://datahack.analyticsvidhya.com/contest/practice-problem-age-detection/)。
在建立模型之前,我敦促你解决这个简单的练习:
你可以写一个脚本,随机地将图像加载到jupyter notesbook中并打印出来吗?(PS:不要看下面的答案!)。在 这个讨论的主题 中发布你的代码。
这是我练习的方法:和往常一样,我先导入所有必要的模块。
导入必要模块 % matplotlib inline import os import random import pandas as pd from scipy . misc import imread import matplotlib . pyplot as plt random . seed ( 1 ) 运行
然后我加载了csv文件,这样可以更容易定位文件。
导入数据 data_dir = '/mnt/vol0/Funny_Pro/age_detect/' train = pd . read_csv ( os . path . join ( data_dir , 'train/train.csv' )) test = pd . read_csv ( os . path . join ( data_dir , 'test/test.csv' )) 运行
然后我写了一个脚本来随机选择一个图像并打印出来。
随机显示一张图片 i = random . choice ( train . index ) img_name = train . ID [ i ] img = imread ( os . path . join ( data_dir , 'train/Train/' , img_name )) plt . imshow ( img ) print ( 'Age: ' , train . Class [ i ]) 运行
这就是我所得到的:
年龄:青年
这个练习的目的是让你可以随机查看数据集,并检查在构建模型时可能遇到的问题。
这里有几个我们可以面对什么问题的假设:
- 形状变化: 一个图像有一个形状(66,46),而另一个图像具有(102,87)
- 多重视点: 我们面对任何观测点都可以!这里有些例子:
侧面视角
正面视角
- 图像质量: 发现某些图像过于像素化。这是一个例子
- 亮度和对比度差异: 检查下面的图像: 他们看起来能使你的问题更容易解决吗?
现在,让我们只关注一个问题,即如何处理形状的变化?
我们可以通过简单地调整图像大小来做到这一点。让我们加载所有的图像,并将它们调整为单个numpy数组。
(为了计算速度更快,我们这里只抽取训练数据的前5000项和测试数据的前1000项用于计算——译者注)
调整训练图片尺寸 from scipy . misc import imresize import numpy as np temp = [] for img_name in train . ID : img_path = os . path . join ( data_dir , 'train/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 ) 运行
对于测试图像亦如此:
调整测试图片尺寸
from scipy . misc import imresize import numpy as np temp = [] for img_name in test . ID : img_path = os . path . join ( data_dir , 'test/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 ) 运行
休息时间:我们首次提交
在分配数据的basics上,我们可以进行了简单的提交。我们看到大多数演员都是中年人。所以我们可以说测试数据集中的所有演员都是中年了!
test [ 'Class' ] = 'MIDDLE' test . to_csv ( ‘sub01 . csv’ , index = False )
在提交页面上上传这个文件,看看结果!
让我们解决问题!第2部分:建立更好的模型
在进行实质性工作之前,让我们将目标变量带入形状。我们将目标转换为虚拟列,以便我们的模型更容易吸收。这就是我所做的。 使用keras 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模块:
导入keras模块 from keras . models import Sequential from keras . layers import Dense , Flatten , InputLayer 运行
之后,我们将定义我们的网络:
定义神经网络
model = Sequential ([ InputLayer ( input_shape = input_num_units ), Flatten (), Dense ( output_dim = hidden_num_units , activation = 'relu' ), Dense ( output_dim = 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 , nb_epoch = epochs , verbose = 1 ) 运行
这好像训练一样!但是我们仍未验证它。如果想要确保我们的模型对于正在进行培训的数据以及新的测试数据都能表现良好,则需要验证。
让我们调整代码来交叉验证它。 交叉验证 model . fit ( train_x , train_y , batch_size = batch_size , nb_epoch = 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 = plt . imread ( os . path . join ( data_dir , 'train/Train' , img_name )). astype ( 'float32' ) plt . imshow ( imresize ( img , ( 128 , 128 ))) pred = model . predict_classes ( train_x ) print ( 'Original:' , train . Class [ i ], 'Predicted:' , lb . inverse_transform ( pred [ i ])) 运行
下一步是什么?
我们已经建立了一个具有简单模型的基准解决方案。我们还能做些什么?
这里有一些我可以建议的提示:
一个 更好的神经网络模型 可以给你一个很大的推动力。你可以尝试使用更适合图像相关问题的卷积神经网络。这是一个简单的CNN供你参考。
我们没有让模型训练太多。你可以增加模型训练的epoch数量。在你可以调整的神经网络中有多个超参数。这是一个帮助你调整它们的指南:
( https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/ )
我们提到了在解决问题时可能遇到的一些问题。如果我们对数据进行适当的预处理,大多问题都将被解决。
你还可以尝试将彩色图像转换为灰度。这是因为当你解决问题时,颜色不再是一个重要的特征。当你更好地了解问题时,可能会有更多的这方面的直觉。
结束语:
在本文中,对于年龄检测实践问题,我解释了一个简单的基准解决方案。即使我没有在文章中提到,你仍然可以做很多事情。欢迎大家参与评论。
End.
转载请注明来自36大数据(36dsj.com): 36大数据 » 走近深度学习——来解决一个年龄检测的问题