《TensorFlow實戰》讀書筆記(完結)

1 TensorFlow基礎

---1.1TensorFlow概要

  • TensorFlow使用數據流圖進行計算,一次編寫,各處運行.

---1.2 TensorFlow編程模型簡介

  •  TensorFlow中的計算是一個有向圖,每個運算操做都是一個節點.每個節點能夠有任意多個輸入和輸出,在計算圖的邊中流動(flow)的數據被稱爲張量(tensor).
  • 一個運算操做表明了一種類型的抽象運算,運算操做的全部屬性必須被預先設置,或者能在建立計算圖時被推斷出來.
  • Variable爲變量,在建立時賦值,它能夠將tensor儲存在內存或顯存中.placeholder爲形參,能夠在計算圖中賦值.

  • Session交互接口,經過Run方法能夠執行計算圖,TensorFlow會自動尋找全部須要計算的節點並按依賴順序執行它們.
  • TensorFlow能夠根據鏈式法則自行計算梯度,從而實現反向傳播.
  • 在使用高階語言的控制流時,它們會被自動編譯爲TensorFlow的原生控制流.

2 TensorFlow和其餘深度學習框架的對比(略)

3 TensorFlow第一步

---3.1 TensorFlow的編譯及安裝(略)

---3.2 TensorFlow實現Softmax Regression識別手寫數字

  • 從TensorFlow自動導入MNIST數據集失敗的話能夠手動下載.
  • 多分類任務最後一層一般使用Softmax,用於計算某個類的機率分佈.而損失函數則選用交叉熵.
  • TensorFlow算法設計的核心步驟是:
  1. 定義算法公式,也就是前向計算
  2. 定義loss,選定優化器,而且指定優化器優化loss
  3. 迭代地對數據進行訓練
  4. 在測試集或驗證集上對準確率進行評測

4 TensorFlow實現自編碼器及多層感知機

---4.1 自編碼器簡介

  • 使用少許的基本特徵組合能夠獲得更高層抽象的特徵,因此須要多層神經網絡.
  • 自編碼器就是用自身的稀疏的高階特徵編碼本身,輸入節點和輸出節點是一致的,所以須要加入幾種限制以防單純地複製:
  1. 減小中間隱含層節點的數量,並使用L1正則化控制稀疏程度
  2. 給數據加入噪聲(如高斯噪聲).
  • 經過自編碼器和監督學習的結合,能夠解決梯度彌散問題,訓練深層網絡.也能夠利用學習到的高階特徵來實現降維.

---4.2 TensorFlow實現自編碼器

  • 使用的是Xaiver初始化,它會根據某一層網絡的輸入和輸出節點自動調整最合適的分佈,也就是讓權重知足均值爲0,方差爲2/(nin+nout).可使用tf.random_uniform建立一個(-sqrt(6/(nin+nout)),sqrt(6/(nin+nout)))的均勻分佈來實現.
  • 將輸入數據加上噪聲,而後與權重w1相乘後加上偏置b1,再通過激活函數處理後獲得隱含層的結果.將隱含層的結果與權重w2相乘後加上偏置b2就獲得了輸出.
  • 損失函數選用平方偏差.
  • 訓練前先對數據進行標準化處理,須要先在訓練集上fit出一個scaler,而後將它用到訓練和測試數據上.
  • 去噪自編碼器的實現和一個單隱含層的神經網絡差很少,只不過在數據輸入時作了標準化,並加上了高斯噪聲,同時輸出結果是復原的數據而非分類結果.

---4.3 多層感知機簡介

  • Dropout是在訓練時將神經網絡某一層的輸出節點數據隨機丟棄一部分(訓練時小於1,預測時等於1),這等於創造出了不少新的隨機樣本,也算是一種bagging.
  • ReLU解決了Sigmoid的梯度彌散問題,FCN和CNN的隱含層通常都使用ReLU及其變種,可是輸出層通常仍是使用接近機率輸出分佈的Sigmoid.主要變化是:
  1. 單側抑制
  2. 相對寬闊的興奮邊界
  3. 稀疏激活性

---4.4 TensorFlow實現多層感知機

  • ReLU層權重能夠用截斷正態分佈進行初始化,偏置能夠用一些小的非零值來初始化以避免dead neuron.Sigmoid層權重偏置則都初始化爲0便可.
  • 使用ReLU做爲隱藏層,並添加dropout,就實現了多層感知機.

5 TensorFlow實現卷積神經網絡

---5.1 卷積神經網絡簡介

  • CNN最初是爲解決圖像識別等問題而設計的,由於圖像特徵難以人工提取.
  • CNN能夠利用空間結構關係減小須要學習的參數,從而提升反向傳播的效率.
  • CNN的一個卷積層一般都進行如下操做:
  1. 經過卷積核的濾波並添加偏置,提取出局部特徵.
  2. 將濾波輸出結果進行非線性激活函數處理(如ReLU).
  3. 對激活函數的結果進行池化操做(如最大池化).
  4. 能夠再加上BN層LRN層.
  • CNN通常由多個卷積層構成,每一個卷積層能夠對應多個卷積核,每一個卷積核的輸出圖像對應一種圖片特徵.單個卷積核是權值共享的.
  • 局部鏈接權值共享下降了參數量,賦予了CNN對平移的容忍性,池化層降採樣進一步降低了參數量,賦予了對輕度形變的容忍性,提升了泛化能力.

---5.2 TensorFlow實現簡單的卷積網絡

  • 激活函數選用ReLU,因此使用截斷的正態分佈初始化權重來打破徹底對稱,使用小的正值(0.1)來初始化偏置以免死亡節點.
  • 兩個卷積層,一個全鏈接層,一個Dropout層和一個Softmax層的CNN在MNIST上的準確率已經達到了99.8%.

---5.3 TensorFlow實現進階的卷積網絡

  • CIFAR-10是一個經典的圖像數據集,包含60000張32*32的彩色圖片,訓練集50000張,測試集10000張.這裏按書下載數據集時出現了一些問題,因而手動將cifar10.py和cifar10_input.py移到了notebook的根目錄下,而且在運行時添加如下代碼:
     tf.app.flags.DEFINE_string('f', '', 'kernel')
  • 在這個CNN中使用了新的技巧:
  1. 對權重進行L2正則化,用於懲罰特徵權重.
  2. 對圖片進行翻轉,隨機剪切等數據加強,製造更多樣本
  3. 在每一個卷積-最大池化層後面使用了LRN層(如今通常用BN層替代),加強模型的泛化能力.
  • 設計CNN主要就是安排卷積層,池化層,全鏈接層的分佈和順序,以及它們的超參數和Trick的使用.
  • 深度學習的特色就是數據量越大效果越好,這與通常的機器學習模型不一樣.

6 TensorFlow實現經典卷積神經網絡

---6.1 TensorFlow實現AlexNet

  • AlexNet的新技術點:
  1. ReLU做爲激活函數,解決了Sigmoid在網絡較深時的梯度彌散問題
  2. Dropout隨機忽略一部分神經元,避免過擬合
  3. 重疊的最大池化
  4. LRN層
  5. CUDA加速深度卷積網絡的訓練
  6. 數據加強,截取原始圖像的部分增長訓練數據量,預測時提取圖片的四個角和中間位置,並進行左右翻轉,對10個圖片預測並求均值.

---6.2 TensorFlow實現VGGNet

  • VGGNet所有使用3*3的卷積核和2*2的池化核,經過不斷加深網絡結構來提高性能.兩個3*3的卷積核串聯至關於1個5*5的卷積核,並且有更多的非線性變換.
  • 在預測時使用滑窗的方式進行平均預測,在訓練時將原始圖像縮放到不一樣尺寸再隨機裁切來增長數據量.
  • VGGNet放棄了LRN層,經過多段卷積網絡將圖像變長縮小,卷積輸出通道增長.

---6.3 TensorFlow實現Google Inception Net

  • Inception V1去除了最後的全鏈接層,用全局平均池化層代替.
  • 採用Inception Module結構,其中有4個分支:第一個分支是1*1卷積,第二個分支是1*1卷積鏈接3*3卷積,第三個分支是1*1卷積鏈接5*5卷積,第四個分支是3*3最大池化鏈接1*1卷積.最後經過聚合操做在輸出通道數維度上進行合併.靠後的Inception Module應該捕捉更高階的特徵,所以大面積卷積核的佔比會更高.
  • 1*1卷積的性價比很高,能夠跨通道組織信息,並對輸出通道升降維.同時1*1卷積體現了Hebbian原理,即"一塊兒發射的神經元會連在一塊兒".
  • Inception Net有22層深,其中間某一層會做爲輔助分類節點,按一個小權重加到最終分類結果中.
  • Inception V2用兩個3*3的卷積代替5*5的卷積,並使用BN層,對每個mini-batch數據進行標準化處理.BN某種意義上起到了正則化的做用,因此能夠減小或取消Dropout和L2正則,簡化網絡結構.
  • Inception V3採用Factorization into small convolutions思想,將一個較大的二維卷積拆成兩個較小的一維卷積(如3*3卷積拆成3*1卷積和1*3卷積),節約了參數並減輕了過擬合.還優化了Inception Module的結構.
  • 卷積網絡從輸入到輸出,應該讓圖片尺寸逐漸減少,輸出通道數逐漸增長,即將空間結構簡化,將空間信息轉化爲高階抽象的特徵信息.

---6.4 TensorFlow實現ResNet

  • ResNet的殘差學習單元(Residual Unit)再也不學習一個完整的輸出H(x),而是學習殘差H(x)-x.ResNet有不少支線將輸入直接連到後面的層,使得後面的層能夠直接學習殘差,這種結構被稱爲shortcut.
  • 兩層的殘差學習單元包含兩個相同輸出通道數的3x3卷積,三層的殘差學習單元則是1x1卷積,3x3卷積,1x1卷積,而且先降維再升維.

7 TensorFlow實現循環神經網絡及Word2Vec

---7.1 TensorFlow實現Word2Vec

  • Word2Vec是一個將語言中的字詞轉化爲向量形式表達的模型.
  • One-Hot編碼的問題是對特徵的編碼是隨機的,沒有考慮字詞間的關係.而且稀疏數據的訓練效率較低.
  • 向量空間模型假設在相同語境中出現的詞的語義也相近,分爲計數模型(統計在語料庫中相鄰出現的詞的頻率)和預測模型(根據一個詞周圍的詞推測出這個詞).
  • Word2Vec就是一種很是高效的預測模型,分爲CBOW(Continuous Bag of Words,從原始語句推測目標詞句)和Skip-Gram(從目標字詞推測原始語句).
  • CBOW訓練一個二元的分類模型來區分真實的目標詞彙和編造的詞彙(噪聲)兩類.當模型預測真實的目標詞彙爲高几率時,學習目標就被最優化了.使用編造的噪聲詞彙訓練的方法叫Negative Sampling,只須要計算隨機選擇的k個詞彙,所以訓練速度很快.對應的損失函數是Noise-Contrastive Estimation Loss.
  • Skip-Gram須要先構造一個語境與目標詞彙的映射關係,即爲選定單詞左邊和右邊滑窗尺寸數量的詞彙.由於它是從目標詞彙預測出語境,因此數據集就是(目標詞彙,相鄰單詞).

---7.2 TensorFlow實現基於LSTM的語言模型

  • RNN的特色是神經元的某些輸出可做爲輸入再次傳輸到神經元中.但RNN難以記憶間隔太遠的信息.LSTM解決了這個問題.
相關文章
相關標籤/搜索