初識深度學習以及keras的使用

什麼是深度學習

深度學習是機器學習的一個分支領域,是從數據中學習表示的一種新方法,其主要是在連續的層中進行學習,含多個隱藏層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分佈式特徵表示。
下面放一張圖來解釋深度學習的過程。
在這裏插入圖片描述
首先是輸入層,輸入層中每一個節點表示一個特徵,以這張圖爲例,假設特徵數爲4,分別爲s1,s2,s3,s4,第一個隱藏層節點分別爲h1,h2,h3,h4,h5,h6,那麼,這裏默認隱藏層沒有激活函數。
h1=(s1w11+b1)+(s2w21+b2)+(s3w31+b3)+(s4w41+b4)
h2=(s1w12+b1)+(s2w22+b2)+(s3w32+b3)+(s4w42+b4)
h3=(s1w13+b1)+(s2w23+b2)+(s3w33+b3)+(s4w43+b4)
h4=(s1w14+b1)+(s2w24+b2)+(s3w34+b3)+(s4w44+b4)
h5=(s1w15+b1)+(s2w25+b2)+(s3w35+b3)+(s4w45+b4)
h6=(s1w16+b1)+(s2w26+b2)+(s3w36+b3)+(s4w46+b4)
這些w和b是什麼呢?
這是神經網絡通過訓練學出來的參數。
層與層之間的連接就是通過這樣的運算來實現的。
那麼神經網絡是怎麼通過訓練而學習到正確的參數呢?
答案是優化器所實現的梯度下降。


爲什麼要叫深度學習呢?"深度學習"的"深度"指的是一系列連續的隱藏層,也就是一個模型中包含了多少層,這就被稱爲模型的深度。現代的深度學習通常包含幾十上百個隱藏層,這些層的權重都是在訓練中自動調整的,有時候一個模型包含了幾千萬個參數,這就對性能有着極高的要求,現代深度學習通常採用GPU進行訓練。

至於上文提到了激活函數,優化器,梯度下降,有些朋友可能由於第一次接觸並不是很理解,下面博主將簡單地爲大家解釋一下這些概念。

激活函數

所謂激活函數,就是在每一層上(這裏不包含輸入層)將輸入映射到輸出上的函數,上文提到的h1,h2,…實際上是從第一個隱藏層的輸入,如果沒有激活函數,那麼這些節點上的輸入就等於輸出,如果加上了激活函數,這裏以常用激活函數relu爲例,relu函數使小於0的輸入變爲0,使大於0的輸入保持不變。

爲什麼要使用激活函數

如果不用激活函數,每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合,而這種線性組合是沒辦法適用於複雜的問題的。
而激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到衆多的非線性模型中。

損失函數和優化器

想要神經網絡能夠輸出正確,就需要能夠衡量實際輸出與預期值之間的距離,而這個任務就是損失函數(也叫目標函數)的任務,該函數的輸入是網絡的預測值和真實的目標值,即你所希望網絡輸出的結果,然後計算兩者的距離值,用來衡量該網絡在這一個示例上運行效果的好壞。
深度學習就是利用這個距離值作爲反饋來對權值進行微調,目的是爲例降低損失值,這種調節就是由優化器來完成,它實現了我們所說的反向傳播算法。
而神經網絡就是在不斷的迭代過程中不斷的調整權值,是損失值越來越小。
下圖爲梯度下降過程:
在這裏插入圖片描述
可以看到我們的網絡在訓練的過程中不斷地向損失值最小的方向移動,也就是梯度下降過程。


理論部分說了這麼多了,下面我們來進行實際操作。
這裏以鳶尾花的分類爲例,之前有一篇文章使用的是sklearn做傳統的機器學習,這裏我們使用keras庫做深度學習。

keras

Keras 是一個用 Python 編寫的高級神經網絡 API,它能夠以 TensorFlow, CNTK, 或者 Theano 作爲後端運行。Keras 的開發重點是支持快速的實驗。能夠以最小的時延把你的想法轉換爲實驗結果,是做好研究的關鍵,簡單的說keras可以很友好地構建神經網絡,適用於快速開發。要使用keras必須確保已經安裝了一種後端,例如tensorflow。

訓練一個神經網絡

#導入相關模塊
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import keras
from sklearn.preprocessing import StandardScaler
#SGD優化器
from keras.optimizers import SGD
from keras.utils import to_categorical
#加載數據
iris = load_iris()
x = iris.data
y = iris.target
#將特徵標準化,均值爲0,方差爲1
x = StandardScaler().fit_transform(x)
#將標籤轉爲獨熱編碼
y_hot = to_categorical(y)
#分爲120條訓練數據和標籤以及30條測試數據和標籤
train_x,val_x,train_y,val_y = train_test_split(x,y_hot,test_size = 30)
#神經網絡模型的創建
model = keras.Sequential({
	#全連接層,節點數爲3,激活函數爲tanh,輸入特徵量爲4
    keras.layers.Dense(3,activation="tanh",input_shape=(4,)),
    keras.layers.Dense(7,activation="tanh"),
    keras.layers.Dense(4,activation="tanh"),
    #激活函數爲softmax,用於獨熱編碼的激活函數,將輸出映射到0到1,且三個通道輸出		之和爲1,分別代表目標屬於某一類別的概率
    keras.layers.Dense(3,activation="softmax")
})
#模型編譯,損失函數爲分類交叉熵,優化器爲隨機梯度下降,學習率爲0.01
model.compile(loss="categorical_crossentropy",
             optimizer=SGD(0.01),
             metrics=["acc"])
#模型訓練,訓練15個迭代週期,每次訓練量爲1
model.fit(train_x,train_y,validation_data=(val_x,val_y),batch_size=1,epochs=10)

訓練結果如下:
在這裏插入圖片描述
我們可以看到隨着訓練的不斷進行,模型的損失值在不斷減小,精度也在慢慢提高。

經過了這篇文章,不知道大家對深度學習有沒有了初步的認識了?往後博主也會給大家分享更多的深度學習案例,感謝大家的閱讀,希望大家能夠有所收穫~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章