iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0
AI & Data

實實在在地學習人工智慧-基礎理論探討與經典案例實作系列 第 27

【Day 27】開始寫程式拉!房價預測實戰演練 -Keras建立神經網路和測試集資料調整

  • 分享至 

  • xImage
  •  

昨天我們的將數據進行標準化了,這幾天的實戰演練全部都在對數據做處理,我們做了哪些?
1.刪除不必要的Id
2.轉換Object的行以利轉換成相關係數矩陣
3.製作熱力圖查看資料相關係數矩陣
4.篩選出相關係數高者並將數值提出
5.切分出驗證集
6.將目標Saleprcie(Y)和其他行(x)分開
7.將訓練資料和驗證資料數據標準化

為什麼要做標準化而不是正規化?

昨天說到標準化期望的是原本資料為常態分佈的,那這邊會有個假設,就是現實中的很多資料通常也都是常態分佈的,那我預先使用這個假設下去做資料標準化並且訓練,得到的結果確實比我做資料正規化後進行訓練好出很多,因此我最後選擇先做標準化!
這邊對於標準化與正規化的相關解釋可以看:這裡,我覺得他的說明滿好的!可以參考看看!

Keras建立神經網路

from keras.models import Sequential
from keras import layers
from keras import optimizers
from keras.layers import BatchNormalization,Dropout,Dense
from keras.callbacks import ModelCheckpoint
#上方為引進所需model

#建立model
def model():
    model = Sequential()
    model.add(layers.Dense(1024,kernel_initializer = 'random_normal',
             activation = 'relu',
             input_shape = (X_trian_normal_data.shape[1],)))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(1024, kernel_initializer = 'random_normal', 
                        activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(512, kernel_initializer = 'random_normal', 
                        activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(256, kernel_initializer = 'random_normal', 
                           activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(128, kernel_initializer = 'random_normal', 
                           activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(32, kernel_initializer = 'random_normal', 
                           activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(16, kernel_initializer = 'random_normal', 
                           activation = 'relu'))
    model.add(Dropout(0.3))
    
    model.add(layers.Dense(1, kernel_initializer = 'random_normal',
                          activation = 'linear'))
    
    adam = optimizers.Adam(lr=0.001)
    #lr學習率
    model.compile(optimizer = adam, loss = 'mae')
    #設定要的優化器以及loss函數
    return model     

這篇的code解釋比較繁雜我會寫在下方!

網路架構從何而來

這裡要先說明在中間的隱藏層的神經元個數、層數的訂定,在我讀過的文獻、書籍和網路資料還沒有一個很確切的訂定方式,我目前還是經驗去建立模型,去嘗試錯誤法,所以在這方面我必須承認自己不是專家,只是憑著自身的經驗去訂定的!(如果後來有找到相關文獻會再更改,或邦友有好的說明也歡迎分享)

至於輸入層和輸出層就比較好了解,輸入層就是依據你要放入的訓練資料的大小,所以我在code中的input_shape是去取(X_trian_normal_data.shape[1],),這可以將訓練資料攤開成一個維度讓第一個隱藏層拿到輸入資料。輸出層的輸出是1,原因是我們是要知道SalePrice,也就是只有一個數字,那麼會用到linear是因為已經訓練到最後了就直接輸出即可!

為什麼前面幾層的激勵函數要用ReLU?

ReLU是目前非常多人在使用的激活函數,我認為的最主要原因有兩者:
1.梯度沒有消失問題(尤其是sigmoid、tanh 最為嚴重)
2.訓練時間較快(不需要計算到e的幾次方)
講得很深入淺出的文章:
為何 ReLU 勝出?

Dropout(0.3)在幹嘛?

Dropout作用是在做訓練時會一邊隨機的消除神經元,一邊學習。尤其是在我們數據集不是那麼龐大的時候使用會特別顯著,Dropout的功用就是要減少過度訓練的情形。括號中的數字是指要丟棄多少神經元(0~1之間,是丟棄的比例)。這裡我有找到一整個篇幅在說明Dropout的,想要深入了解可以點這:Dropout

優化器adam

它是誰?因為要講述整個adam的介紹需要一整篇的篇幅,筆者在這簡單說明就好,想要深入了解的話,網路上有整個adam發展的歷史。簡單來說就是將Monmentum(類似滾動的物理定律,與原本的SGD相比可以減少起伏程度)和AdaGrad(能夠適應各參數,客製化每個參數的學習率)優點結合的優化器。
這裡推薦一篇寫得滿好的文章介紹:
簡單認識Adam優化器

明天就開始訓練拉!加油!


上一篇
【Day 26】開始寫程式拉!房價預測實戰演練 -標準化介紹與實踐
下一篇
【Day 28】開始寫程式拉!房價預測實戰演練 -開始訓練並畫出Loss曲線
系列文
實實在在地學習人工智慧-基礎理論探討與經典案例實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言