神經網絡入手[上]
- [x] 神經網絡的核心部分
- [x] Keras介紹
- [ ] 使用Keras解決簡單問題:分類和回歸
神經網絡剖析
神經網絡的訓練與下列對象相關:
- 網絡層Layers,網絡層結合形成神經網絡模型矩距;
- 輸入數據以及對應標簽锅知;
- 損失函數,定義用來學習的反饋信號很魂;
-
優(yōu)化方法,定義學習過程鞠绰。
關系圖:
image
網絡層堆疊形成網絡模型厢洞,網絡模型由輸入數據得到預測值。損失函數比較預測值與實際值西饵,得到損失函數值:用來評估預測結果的好壞饥漫;優(yōu)化方法用損失值來更新網絡模型的權重系數。
網絡層:神經網絡模型的構建模塊
網絡層是神經網絡的基本數據結構罗标。一個網絡層把一個或多個數據輸入張量進行數據處理過程得到一個或多個輸出張量庸队。一些網絡層是無狀態(tài)的(沒有網絡參數),但大多數網絡層是有狀態(tài)的---網絡層的權重系數闯割,這些通過隨機梯度下降算法學到的權重張量彻消,形成了網絡層的知識。
不同的網絡進行的數據處理各不相同宙拉,因此需要的數據格式及數據類型也有所差異宾尚。比如:2D張量,形狀為(samples,features)存儲簡單的向量信息谢澈,通常是全連接層(FC 或 Dense)的輸入格式要求煌贴;LSTM網絡層通常處理3D張量,形狀為(samples锥忿,timesteps,featuers)的序列數據牛郑;2D卷積層通常處理存儲在4D張量中的圖片數據。
可以把網絡層看做深度學習的樂高積木塊敬鬓,通過積木塊我們可以搭建不同的網絡模型淹朋。在Keras框架中通過把相互兼容的網絡層堆疊形成數據處理過程,而網絡層的兼容性是指該網絡層接收特定形狀的輸入張量同時返回特東形狀的輸出張量钉答。
例如:
from keras import layers
layer = layers.Dense(32, input_shape=(784, ))
定義的網絡層只接收2D張量础芍,第一維度為784,;同時網絡層輸出的第一維度為32数尿。
在Keras中仑性,不必擔心網絡的兼容性,因為添加到網絡模型中的網絡層是動態(tài)構建地右蹦,匹配接下來連接的網絡層诊杆。比如:
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, input_shape=(784, )))
model.add(layers.Dense(32))
第二個Dense層不必定義接收張量的形狀鲫懒,keras能自動定義。
網絡模型:網絡層堆疊而成
一個神經網絡模型是網絡層的非循環(huán)連接而成刽辙。最常見的是網絡層的線性連接堆疊窥岩,講一個輸入張量轉換為一個輸出張量。
也存在不同的網絡拓撲結構宰缤,如:
- 二分支網絡模型颂翼;
- 多分支網絡模型;
- Inception塊.
網絡模型的拓撲結構定義了一個假設空間慨灭。通過選擇網絡模型的拓撲結構朦乏,限制了假設空間能進行的張量操作,通過這些張量操作有輸出張量得到對應的輸出張量氧骤;之后尋找這些張量操作中涉及到的權重系數張量呻疹。
網絡模型結構的選擇與其說是一門科學不如說是一門藝術,盡管存在一些可以依賴的經驗和原理,但只有不斷嘗試才能使你成為一個優(yōu)秀的神經網絡締造者筹陵。
損失函數和優(yōu)化算法:配置學習過程的關鍵
網絡模型結構定義完成之后刽锤,仍然需要定義兩件事:
- 損失函數:訓練過程中最小化的函數值,一種評估網絡模型的表現朦佩;
- 優(yōu)化算法:決定基于損失函數如何更新權重系數并思;有常見的SGD,以及變種SGD算法语稠。
多輸出神經網絡模型可能有多個損失函數(一個輸出一個損失函數)宋彼。但是梯度下降過程必然是基于一個損失函數標量值;所以仙畦,對于有多個損失函數的網絡模型來說输涕,所有的損失函數值必須整合(平均化處理)成一個標量值。
特定問題需要選擇特定的損失函數慨畸。對于常見的問題莱坎,如:分類、回歸先口、序列預測型奥,有對應的指導-選擇正確的損失函數瞳收。具體:二分類問題使用對數損失binary crossentropy碉京,多分類問題采用分類交叉熵categorical crossentropy,回歸問題使用均方誤差螟深,序列學習問題采用Connectionist temporal classification(CTC)損失函數等等谐宙。只有在面對真正要解決的科學問題時,才能決定要使用的損失函數類型以及定義界弧。
Keras 介紹
Keras是一個Python語言的深度學習框架凡蜻,提供了快速搞笑的深度學習網絡模型定義和訓練方法搭综。Keras設計初衷是為了方便科學家能進行快速實驗。Keras特征:
- 相同代碼同時支持CPU划栓、GPU運行兑巾;
- 用戶友好API--網絡模型定義、訓練方便忠荞;
- 內置卷積神經網絡蒋歌、循環(huán)神經網絡等等;
- 支持任意的網絡架構:多輸入委煤、多輸出網絡模型堂油,網絡層共享,模型共享等等碧绞。
Keras支持所有的Python版本府框,從2.7到3.6(mid-2017).Keras 有200000個用戶,從學術科學家和工程師到新手以及大公司的畢業(yè)生讥邻,還有興趣愛好者迫靖。Google、Netflix兴使、Uber袜香、CERN、Yelp鲫惶,Square以及上百個創(chuàng)業(yè)公司都猜使用Keras框架應用在相應的業(yè)務上蜈首。Keras也是Kaggle上流行的網絡框架。
Keras欠母,TensorFlow欢策,Theano 和 CNTK
Keras 是一個模型級別的工具庫,提供構建神經網絡模型的高級API赏淌。Keras并不進行底層的操作比如張量操作和導數計算踩寇;相應地,Keras以來與特定的張量庫進行這些操作六水,作為Keras的背后引擎俺孙。目前,Keras支持3個背后引擎:TensorFlow掷贾、Theano和CNTK睛榄。將來,有望支持更多的深度學習框架成為Keras的背后計算引擎想帅。
Keras開發(fā)
Keras工作流大致如下:
- 定義訓練數據:輸入張量和目標張量场靴;
- 定義網絡層(或網絡模型):由輸入張量處理得到輸出張量;
- 配置訓練過程--選擇損失函數、優(yōu)化算法以及監(jiān)測指標旨剥;
- 通過調用模型的fit()方法在訓練數據上迭代訓練咧欣。
模型定義有兩種方法:使用Sequential類(使用于網絡層的線性堆疊,目前最常見)轨帜;以及函數式API(支持任意網絡架構魄咕,更靈活)。
方法一:Sequential類
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
方法二: 函數式API
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor)
一旦模型架構定義完成蚌父,不必區(qū)分到底網絡模型是怎么定義的蚕礼,之后的處理步驟沒有差別。
學習過程在編譯過程中配置:定義優(yōu)化算法梢什、損失函數和監(jiān)測指標奠蹬。比如:
from keras import optimizers
model.compile(optimizer=optimizer.RMSProp(lr=0.001),loss='mse',metrics=['accuracy'])
最后,通過fit()方法將numpy數組形式的輸入數據(以及對應標簽)輸入到網絡模型中進行模型的學習過程嗡午。
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)