摘要: 學了那麼多深度學習的基本知識,還在發愁沒有地方展現本身學過的知識?來試試這個簡單的實際問題吧!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,數據科學愛好者,深度學習的新秀 譯者:袁虎 審閱:
文章爲簡譯,更爲詳細的內容,請查看原文