《Python深度學習》——第三章 神經網路入門
主要內容:
- 神經網路核心元件
- Keras簡介
- 建立深度學習工作站——Jupter
- 使用深度學習解決二分類,多分類和迴歸問題
3.1 神經網路剖析
- 層,多層構成網路
- 輸入函式和目標
- 損失函式
- 優化器
3.1.1 層:基本元件
權重
2D張量,用密集連線層(densely connected layer)
3D張量,迴圈層(recurrent layer,如LSTM層)
4D張量,二維卷積層(conv2D)
層相容性(layer compatiblility):每一層只接受特定層的輸入張量,輸出特定形狀的張量。
例:layers.Dense(32,input_shape=784,))#輸出張量,第一維大小是32。只接受第一維度是784的2D張量。
不寫input_shape,自動和上層匹配。
3.1.2 模型:層構成的網路
有向無環圖
常見網路拓撲結構(其決定假設空間(hypothesis space))
- 雙分支網路
- 多頭網路
- Inception模組
選擇正確的網路架構是門藝術而不是科學。
3.1.3 損失函式與優化器:配置學習過程的關鍵
損失函式(目標函式)
優化器:SGD的變體
具有多個輸出的神經網路,可以具有多個損失函式,但梯度下降必須基於單個標準損失值,所以要對所有損失函式值求平均。
選擇目標函式的指導原則:
二分類問題:二元交叉熵(binary crossentropy)
多分類問題:分類交叉熵(categorical crossentropy)
迴歸問題:均方誤差(mean-squared error)
序列學習問題:聯結主義時序分類(CTC,coonectionist temporal classification)
3.2 Keras簡介
特點:
- 相同程式碼可以在CPU和GPU上無縫切換
- 具有友好的API
- 內建支援卷積網路(用於視覺)、迴圈網路(用於序列處理)以及二者的任意組合
- 支援任意網路框架:多輸入或多輸出、層共享、模型共享
3.2.1 Keras、TensorFlow、Theano和CNTK
後端引擎(backend engine)
3.2.2 使用Keras開發:概述
工作流程:
- 定義訓練資料
- 定義層組合的網路
- 配置學習過程
- 呼叫fit進行迭代
定義模型:
1.Sequential:僅用於層的線性堆疊,常用。
model.add(layers.Dense(32,activation='relu',input_shape=(784,)))
2.函式API:構建任意形式的架構
input_tenser=layer.Input(shape=(784,))
x=layers.Dense(32,activation='relu')(input_tenser)
3.3 建立深度學習網路
最好使用UNIX。
3.3.1 Jupyter筆記本:執行深度學習實驗的首選方法
3.3.2 執行Keras的兩種方法
雲端
本地
3.3.3 在雲端執行深度學習任務:優點和缺點
3.3.4 深度學習的最佳GPU
NVIDIA TITAN Xp
3.4 舉例
1.二分類
(1)準備資料
轉換方法
- 填充列表
- 對列表進行one-hot編碼
(2)構建網路
Dense(16,activation='relu')
16指隱藏單元(hidden unit)個數
隱藏單元越多,網路能夠學到更加複雜的表示,計算代價也越大,且可能過擬合
關鍵架構:
- 網路有幾層
- 每層有幾個隱藏單元
中間層用‘relu’,最後一層用‘sigmoid’(輸出0~1)。
引入啟用函式是為了:為系統引入非線性。
自定義優化器:通過optimizer傳入優化器類例項
自定義損失函式:通過loss和metric傳入函式物件
交叉驗證:validation_data
(3)進一步實驗:
- 嘗試增加或減少隱藏層
- 嘗試增加或減少隱藏單元
- 改變損失函式
- 改變啟用函式
rmsprop優化器,在任何問題下都可使用。
2.多分類
標籤向量化:
- 整數張量
- one-hot編碼(分類編碼(categorical encoding))
中間層維數 一般要大於輸出層維數,不然會造成資訊瓶頸。
one-hot 編碼使用 categorical_crossentropy損失函式
整數標籤使用 sparse_categorical_crossentropy
使用 softmax啟用函式
3.迴歸
不同特徵取值範圍不同,要先標準化
樣本數量少,使用小網路,利用K折驗證。
最後一層,沒有啟用函式,是線性層
損失函式:均方誤差(MSE,mean squared error)
監控指標:平均絕對誤差(MAE,mean absolute error)