閱讀897 返回首頁    go 外匯


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

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


介紹:

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

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

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

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

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

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

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

這是我得到的:AgeYOUNG

2ef03ad77e4f2d7b7c3d87c270bbbe0c5c7debde

上述實踐的練習的動機是讓你能隨機的訪問到數據集,並且幫助發現你在建立模型時可能遇到的問題。

這裏有幾個我從上述實踐中分析到的可能在建立模型時要麵對的問題的假設。

1.形狀變化:一個圖像是(66,46),而另一個圖像是(102,87)。

2.多個方向:我們的圖像可能是多個方向的,這裏有些例子:

側麵圖

a8b69c11918293e077edf41bb5a04a1f4fc85b4a

正視圖

2ef03ad77e4f2d7b7c3d87c270bbbe0c5c7debde

3.圖像質量:一些圖像的質量可以太差了點,例如下麵這張:

fdf3e9ea7e5a48eb5075d5f7ba84f854aff433f7

4.亮度和對比度差異:檢查下麵的圖像, 他們似乎是故意來搗亂的,但是,這種現象在實際生活中確實存在。

現在,讓我們先關注一個問題,即如何處理形狀的變化?

d466f37d35f7cc2266b0f978f9eda54868531ae2

我們可以通過簡單地調整圖像大小來做到這一點。讓我們加載所有的圖像,並將它們調整為單個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()

60d42cc6cbd7910ea80b16eefc1801674a70eca7

現在讓我們編譯我們的網絡並且讓它訓練一段時間

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

2ae598481ffb349398257f630916e5f547ff37aa

好像已經訓練好了!但是我們還沒有驗證它。如果我們想要確保我們的模型在對其進行培訓的數據和新的測試數據上都能表現良好,驗證是非常必要的。

讓我們調整一下代碼來驗證它。

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

f26e5ee842f26b05142f6d658d6dda69ab76fffc

該模型看起來比第一個模型表現要好。讓我們提交結果。

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

f6937bf4541f94e5dd00b3b7cea18dd15f2734d5

下一步是什麼?

我們已經建立了一個具有簡單模型的基準解決方案。我們還能做些什麼?

這裏是我的一些建議:

  • 一個好的神經網絡模型可以幫你取得更大的進步。你可以嚐試使用更適合圖像相關問題的卷積神經網絡。這是一個簡單的CNN供你參考
6945335e226494408bb02066318439bb3d972974

希望這個簡單的年齡檢測實踐問題能夠幫助到你!

本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。

》,

作者:Faizan Shaikh,數據科學愛好者,深度學習的新秀 譯者:袁虎 審閱:

文章為簡譯,更為詳細的內容,請查看原文

項目地址

最後更新:2017-07-21 23:33:38

  上一篇:go  強大的PyTorch:10分鍾讓你了解深度學習領域新流行的框架
  下一篇:go  看深度學習框架排名第一的TensorFlow如何進行時序預測!