深度學習項目實戰——「年齡預測」

摘要: 學了那麼多深度學習的基本知識,還在發愁沒有地方展現本身學過的知識?來試試這個簡單的實際問題吧!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
相關文章
相關標籤/搜索