摘要: 学了那么多深度学习的基本知识,还在发愁没有地方展现本身学过的知识?来试试这个简单的实际问题吧!html
更多深度文章,请关注:https://yq.aliyun.com/cloud
python
介绍:算法
你能够经过阅读或者观看视频/MOOC来学习数据科学,接着你就必须将学到的知识应用到解决问题当中来。你须要完成这两件事才能有效地完成你的学习计划。接下来这篇文章旨在向你介绍深度学习如何应用到一个有趣的问题。数组
今天咱们将用深度学习来解决年龄检测问题。bash
若是你是刚刚想要进入深度学习领域的new boy。请先阅读下面的文章,它们能帮你了解而且快速进入深度学习领域:网络
若是你已经花了几天或者几个月的时间来学习深度学习,而且正在寻找新的方式来提升你的深度学习技能,练习解决实际问题的例子无疑是最佳选择。我这样说是由于他们为你提供从头开始解决问题的经验,并且他们也不是很难。app
如下是你应该选择几个实践问题练习的缘由:dom
让咱们进入正题:如何用深度学习来预测年龄:学习
我假设你已经安装了numpy,scipy,pandas,scikit-learn和keras 。若是没有,请安装它们。以上文章能够帮助你。测试
第一件事 让咱们下载数据并将其加载到咱们的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)
在创建模型以前,让咱们为目标变量引进形状。咱们将目标转换为虚拟列,以便咱们的模型更容易吸取。
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
下一步是什么?
咱们已经创建了一个具备简单模型的基准解决方案。咱们还能作些什么?
这里是个人一些建议:
但愿这个简单的年龄检测实践问题可以帮助到你!
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Hands on with Deep Learning -Solution for Age Detection Practice Problem》,
做者:Faizan Shaikh,数据科学爱好者,深度学习的新秀 译者:袁虎 审阅:
文章为简译,更为详细的内容,请查看原文