深度學習項目實戰——“年齡預測”


摘要: 學了那么多深度學習的基本知識,還在發愁沒有地方展示自己學過的知識?來試試這個簡單的實際問題吧!

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


介紹:

你可以通過閱讀或者觀看視頻/MOOC來學習數據科學,接着你就必須將學到的知識應用到解決問題當中來。你需要完成這兩件事才能有效地完成你的學習計划。接下來這篇文章旨在向你介紹深度學習如何應用到一個有趣的問題。

今天我們將用深度學習來解決年齡檢測問題

如果你是剛剛想要進入深度學習領域的new boy。請先閱讀下面的文章,它們能幫你了解並且快速進入深度學習領域:

如果你已經花了幾天或者幾個月的時間來學習深度學習,並且正在尋找新的方式來提高你的深度學習技能,練習解決實際問題的例子無疑是最佳選擇。我這樣說是因為他們為你提供從頭開始解決問題的經驗,而且他們也不是很難。

以下是你應該選擇幾個實踐問題練習的原因:

 

  • 花時間建立基礎:我一直建議,我們應該始終建立一個正確的基礎(思考問題陳述和探索數據集),並練習很多。但我仍然看到人們一開始就編碼,而不考慮問題和理解數據。在這種方法中,你實際上不是在探索問題和數據,因為你正在專注於算法。
  • 同行學習(論壇/博客):在實踐中,參與者在論壇或博客上分享他們的方法,並隨時准備討論新的方法。這實際上就是一種開源的學習方式。
  • 練習:這些實踐問題就像你的練習課,在出山和解決現實生活中的問題之前。你應該首先多多練習,然后評估你的表現。相信熟能生巧,這句話。
  • 測試你的知識:這是一個偉大的方式,嘗試練習你學到的東西,這將是非常有益。結果並不重要,因為這是一個練習問題。

讓我們進入正題:如何用深度學習來預測年齡:

我假設你已經安裝了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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM