<b>機器學習(machine learning)</b>是人工智能的一個特殊子領域,其目標是僅靠觀察訓練數據來自動開發程序[即模型(model)]。將數據轉換爲程序的這個過程叫做<b>學習(learning)</b>html
<b>深度學習(deep learning)</b>是機器學習的衆多分支之一,它的模型是一長串幾何函數,一個接一個地做用在數據上。這些運算被組織成模塊,叫做<b>層(layer)</b>。深度學習模型一般都是層的堆疊,或者更通俗地說,是層組成的圖。這些層由<b>權重(weight)</b>來參數化,權重是在訓練過程當中須要學習的參數。模型的<b>知識(knowledge)</b>保存在它的權重中,學習的過程就是爲這些權重找到正確的值python
在深度學習中,一切都是<b>向量</b>,即一切都是幾何空間(geometric space)中的點(point)。在開始學習以前,咱們首先須要將模型輸入(文本、圖像等)和目標<b>向量化(vectorize)</b>,即將其轉換爲初始輸入向量空間和目標向量空間。深度學習模型的每一層都對經過它的數據作一個簡單的幾何變換。模型中的層鏈共同造成了一個很是複雜的幾何變換,它能夠分解爲一系列簡單的幾何變換。這個複雜變換試圖將輸入空間映射到目標空間,每次映射一個點。這個變換由層的權重來參數化,權重根據模型當前表現進行迭代更新。這種幾何變換有一個關鍵性質,就是它必須是可微的(differentiable),這樣咱們才能經過梯度降低來學習其參數。直觀上來看,這意味着從輸入到輸出的幾何變形必須是平滑且連續的,這是一個很重要的約束條件網絡
深度學習整件事情徹底取決於一個核心思想:意義來自於事物之間的成對關係(一門語言的單詞之間,一張圖像的像素之間等),而這些關係能夠用距離函數來表示架構
<b>深度學習中最多見的三種網絡架構:</b> 密集鏈接網絡、卷積網絡和循環網絡機器學習
對於不一樣的數據進行處理時,咱們應該使用不一樣的架構,如下爲輸入模式與適當的網絡架構之間的對應關係
<b>向量數據:</b>密集鏈接網絡(Dense 層)
<b>圖像數據:</b>二維卷積神經網絡
<b>聲音數據(好比波形):</b>一維卷積神經網絡(首選)或循環神經網絡
<b>文本數據:</b>一維卷積神經網絡(首選)或循環神經網絡
<b>時間序列數據:</b>循環神經網絡(首選)或一維卷積神經網絡
<b>其餘類型的序列數據:</b>循環神經網絡或一維卷積神經網絡。若是數據順序很是重要(好比時間序列,但文本不是),那麼首選循環神經網絡
<b>視頻數據:</b>三維卷積神經網絡(若是你須要捕捉運動效果),或者幀級的二維神經網絡(用於特徵提取)+ 循環神經網絡或一維卷積神經網絡(用於處理獲得的序列)
<b>立體數據:</b>三維卷積神經網絡模塊化
<b>三種網絡架構的特色</b>函數
<b><i>1. 密集鏈接網絡</i></b>學習
密集鏈接網絡是 Dense 層的堆疊,它用於處理向量數據(向量批量)。這種網絡假設輸入特徵中沒有特定結構:之因此叫做密集鏈接,是由於 Dense 層的每一個單元都和其餘全部單元相鏈接。這種層試圖映射任意兩個輸入特徵之間的關係,它與二維卷積層不一樣,後者僅查看局部關係編碼
密集鏈接網絡最經常使用於分類數據(好比輸入特徵是屬性的列表),還用於大多數網絡最終分類或迴歸的階段。對於二分類問題(binary classification),層堆疊的最後一層是使用 sigmoid 激活且只有一個單元的 Dense 層,並使用 binary_crossentropy 做爲損失。目標應該是 0 或 1人工智能
對於<b>單標籤多分類問題</b>(single-label categorical classification,每一個樣本只有一個類別,不會超過一個),層堆疊的最後一層是一個 Dense 層,它使用 softmax 激活,其單元個數等於類別個數。若是目標是 one-hot 編碼的,那麼使用 categorical_crossentropy 做爲損失;若是目標是整數,那麼使用 sparse_categorical_crossentropy 做爲損失
對於<b>多標籤多分類問題</b>(multilabel categorical classification,每一個樣本能夠有多個類別),層堆疊的最後一層是一個 Dense 層,它使用 sigmoid 激活,其單元個數等於類別個數,並使用 binary_crossentropy 做爲損失。目標應該是 k-hot 編碼的
對於連續值向量的迴歸(regression)問題,層堆疊的最後一層是一個不帶激活 Dense 層,其單元個數等於你要預測的值的個數。有幾種損失可用於迴歸問題,最多見的是 mean_squared_error(均方偏差,MSE)和 mean_absolute_error(平均絕對偏差,MAE)
<b><i>2. 卷積神經網絡</i></b>
卷積層可以查看空間局部模式,其方法是對輸入張量的不一樣空間位置(圖塊)應用相同的幾何變換。這樣獲得的表示具備平移不變性,這使得卷積層可以高效利用數據,而且可以高度模塊化。這個想法適用於任何維度的空間,包括一維(序列)、二維(圖像)、三維(立體數據)等。你可使用 Conv1D 層來處理序列(特別是文本,它對時間序列的效果並很差,由於時間序列一般不知足平移不變的假設),使用 Conv2D 層來處理圖像,使用 Conv3D 層來處理立體數據
卷積神經網絡或卷積網絡是卷積層和最大池化層的堆疊。池化層能夠對數據進行空間下采樣,這麼作有兩個目的:隨着特徵數量的增大,咱們須要讓特徵圖的尺寸保持在合理範圍內;讓後面的卷積層可以「看到」輸入中更大的空間範圍。卷積神經網絡的最後一般是一個 Flatten 運算或全局池化層,將空間特徵圖轉換爲向量,而後再是 Dense 層,用於實現分類或迴歸
大部分(或者所有)普通卷積極可能不久後會被深度可分離卷積(depthwise separable convolution,SeparableConv2D 層)所替代,後者與前者等效,但速度更快、表示效率更高。對於三維、二維和一維的輸入來講都是如此
例子
model.add(layers.SeparableConv2D(64, 3, activation='relu'))
<b><i>3. 循環神經網絡</i></b>
循環神經網絡(RNN,recurrent neural network)的工做原理是,對輸入序列每次處理一個時間步,而且自始至終保存一個狀態(state,這個狀態一般是一個向量或一組向量,即狀態幾何空間中的點)。若是序列中的模式不具備時間平移不變性(好比時間序列數據,最近的過去比遙遠的過去更加劇要),那麼應該優先使用循環神經網絡,而不是一維卷積神經網絡
Keras 中有三種 RNN 層:SimpleRNN、GRU 和 LSTM。對於大多數實際用途,你應該使用GRU 或 LSTM。二者中 LSTM 更增強大,計算代價也更高。你能夠將 GRU 看做是一種更簡單、計算代價更小的替代方法
想要將多個 RNN 層逐個堆疊在一塊兒,最後一層以前的每一層都應該返回輸出的完整序列(每一個輸入時間步都對應一個輸出時間步)。若是你再也不堆疊更多的 RNN 層,那麼一般只返回最後一個輸出,其中包含關於整個序列的信息
返回與不返回的差異
# 不返回 model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features))) # 返回 model.add(layers.LSTM(32, return_sequences=True, input_shape=(num_timesteps, num_features)))
全書學習完