<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 一、深度學習的基礎 歡迎使用《深度學習快速參考》! 在本書中,我將嘗試使需要解決深度學習問題的數據科學家,機器學習工程師和軟件工程師更容易使用,實用和使用深度學習技術。 如果您想訓練自己的深度神經網絡并且陷入困境,那么本指南很有可能會有所幫助。 本書動手了,旨在作為實用指南,可以幫助您快速解決問題。 它主要供需要使用深度學習解決問題的經驗豐富的機器學習工程師和數據科學家使用。 除了本章(其中提供了一些我們將要開始使用的術語,框架和背景知識)之外,它并不意味著要按順序閱讀。 每章均包含一個實際示例,并附有代碼,一些最佳實踐和安全選擇。 我們希望您能跳到所需的章節并開始使用。 本書不會深入研究深度學習和神經網絡的理論。 有許多可以提供這種背景知識的精彩書籍,我強烈建議您至少閱讀其中一本(也許是參考書目,也可以只是建議)。 我們希望提供足夠的理論和數學直覺來幫助您入門。 我們將在本章介紹以下主題: * 深度神經網絡架構 * 深度學習的優化算法 * 深度學習框架 * 構建用于深度學習的數據集 # 深度神經網絡架構 深度神經網絡架構的結構可能會因網絡的應用而有很大差異,但它們都有一些基本組件。 在本節中,我們將簡要討論這些組件。 在本書中,我將深度神經網絡定義為一個具有多個隱藏層的網絡。 除此之外,我們不會嘗試將成員限制為*深度學習俱樂部*。 因此,我們的網絡可能只有不到 100 個神經元,甚至可能有數百萬個。 我們可能會使用特殊的神經元層,包括卷積和循環層,但盡管如此,我們仍將所有這些都稱為神經元。 # 神經元 神經元是神經網絡的原子單位。 有時這是受到生物學啟發的。 但是,這是另一本書的主題。 神經元通常排列成層。 在本書中,如果我指的是特定的神經元,則將使用符號`n[k]^l`,其中`l`是神經元所在的層, `k`是神經元編號 。 由于我們將使用遵循第 0 個表示法的編程語言,因此我的表示法也將基于第 0 個表示法。 大多數神經元的核心是兩個共同起作用的函數:線性函數和激活函數。 讓我們從較高的角度看一下這兩個組成部分。 # 神經元線性函數 神經元的第一部分是線性函數,其輸出是輸入的總和,每個輸入乘以一個系數。 這個函數實際上或多或少是線性回歸。 這些系數通常在神經網絡中稱為權重。 例如,給定某些神經元,其輸入特征為`x1`,`x2`和`x3`,輸出`z`,則此線性分量或神經元線性函數將簡單地為: ![](https://img.kancloud.cn/e6/2c/e62c9605de9deef184bcfa84f7059dea_2180x190.png) 在給定數據的情況下,`θ[1], θ[2], ..., θ[n]`是權重或系數,`b`是偏差項。 # 神經元激活函數 神經元的第二個函數是激活函數,其任務是在神經元之間引入非線性。 Sigmoid 激活是一種常用的激活,您可能會通過邏輯回歸來熟悉它。 它將神經元的輸出壓縮到輸出空間,其中`z`的非常大的值被驅動為 1,而`z`的非常小的值被驅動為 0。 sigmoid 函數如下所示: ![](https://img.kancloud.cn/eb/af/ebaf8235488a463063fd2b2f8cce9caa_1790x420.png) ![](https://img.kancloud.cn/d8/8f/d88f2bb13cbea4dcaca5a3c958be0197_375x264.png) 事實證明,激活函數對于中間神經元非常重要。 沒有它,可以證明一堆具有線性激活的神經元(實際上不是激活,或更正式地說是`z = z`的激活函數)實際上只是一個線性函數。 在這種情況下,單個線性函數是不理想的,因為在許多情況下,我們的網絡可能未針對當前問題指定。 也就是說,由于輸入特征和目標變量之間的非線性關系(我們正在預測),網絡無法很好地對數據建模。 不能用線性函數建模的函數的典型示例是排他的`OR`函數,如下圖所示: ![](https://img.kancloud.cn/cc/98/cc982597194c303f5cb7aabf83a29c2f_974x581.jpg) 其他常見的激活函數是`tanh`函數和 ReLu 或整流線性激活。 雙曲正切或`tanh`函數如下所示: ![](https://img.kancloud.cn/4a/32/4a32ec20f6f82ea9f4ea71cd8d013d76_1590x440.png) ![](https://img.kancloud.cn/0b/4c/0b4c6a9fc5139928623b1fccd90fe9cd_390x264.png) 對于中間層,`tanh`通常比 Sigmoid 更好。 您可能會看到,`tanh`的輸出將在`[-1, 1]`之間,而 Sigmoid 曲線的輸出將為`[0, 1]`。 這種額外的寬度可為消失或爆炸的梯度問題提供一定的彈性,我們將在后面詳細介紹。 到目前為止,僅需知道消失的梯度問題就可以使網絡在早期的層中收斂非常慢(如果有的話)。 因此,使用`tanh`的網絡趨于比使用 Sigmoid 激活的網絡收斂更快。 也就是說,它們仍然不如 ReLu 快。 ReLu,或直線激活,簡單定義為: ![](https://img.kancloud.cn/e5/e7/e5e7631c02445b4e4f8bfb500698d589_1360x220.png) 這是一個安全的賭注,我們在本書中的大部分時間都會使用它。 ReLu 不僅易于計算和微分,而且還可以抵抗消失的梯度問題。 ReLu 的唯一缺點是它的一階導數未精確定義為 0。包括泄漏的 ReLu 在內的變體在計算上更加困難,但針對此問題更健壯。 為了完整起見,以下是 ReLu 的一些明顯圖表: ![](https://img.kancloud.cn/d3/3e/d33efe1b85a5f897a65f2c77d4034e84_372x264.png) # 深度學習中的損失和成本函數 每個機器學習模型實際上都是從成本函數開始的。 簡單來說,成本函數可讓您衡量模型對訓練數據的擬合程度。 在本書中,我們將損失函數定義為訓練集中單個觀測值的擬合正確性。 這樣,成本函數通常將是整個訓練集中損失的平均值。 稍后,當我們介紹每種類型的神經網絡時,我們將重新討論損失函數。 但是,請快速考慮線性回歸的成本函數作為示例: ![](https://img.kancloud.cn/87/4c/874c105ee2826dc608734060e53af818_1640x540.png) 在這種情況下,損失函數為`(y_hat - y)^2`,這實際上是平方誤差。 因此,我們的`cost`函數`J`實際上只是均方誤差,或整個數據集的均方誤差的平均值。 按照慣例,添加了項 1/2 以使某些微積分更干凈。 # 正向傳播過程 正向傳播是我們嘗試使用單個觀測值中存在的特征預測目標變量的過程。 想象一下,我們有一個兩層神經網絡。 在正向傳播過程中,我們將從觀察中出現的特征`x[1], x[2], ..., x[n]`開始,然后將這些特征乘以它們在第 1 層中的關聯系數,并為每個神經元添加一個偏差項。 之后,我們會將輸出發送到神經元的激活。 之后,輸出將被發送到下一層,依此類推,直到到達網絡的末端,然后剩下網絡的預測: ![](https://img.kancloud.cn/d3/5e/d35e46a87bcb7795103ab15fdc222b54_420x157.jpg) # 反向傳播過程 一旦正向傳播完成,我們就可以對每個數據點進行網絡預測。 我們也知道數據點的實際值。 通常,將預測定義為`y_hat`,而將目標變量的實際值定義為`y`。 一旦`y`和`y_hat`都已知,就可以使用成本函數計算網絡誤差。 回想一下,代價函數是`loss`函數的平均值。 為了使學習在網絡中發生,網絡的誤差信號必須從最后一層到最后一層通過網絡層向后傳播。 我們反向傳播的目標是在網絡中向后傳播該誤差信號,同時隨著信號的傳播使用誤差信號來更新網絡權重。 在數學上,要做到這一點,我們需要對權重進行微調,以使成本函數最小,從而最小化成本函數。 此過程稱為梯度下降。 梯度是誤差函數相對于網絡內每個權重的偏導數。 可以使用鏈法則和上面各層的梯度逐層計算每個權重的梯度。 一旦知道了每一層的梯度,我們就可以使用梯度下降算法來最小化`cost`函數。 梯度下降將重復此更新,直到網絡的誤差最小化并且該過程收斂為止: ![](https://img.kancloud.cn/bf/69/bf694784ae7717c780dd8cc3f7760595_1060x420.png) 梯度下降算法將梯度乘以稱為`alpha`的學習率,然后從每個權重的當前值中減去該值。 學習率是一個超參數。 # 隨機和小批量梯度下降 上一節中描述的算法假定整個數據集都進行正向和相應的反向傳遞,因此將其稱為批梯度下降。 進行梯度下降的另一種可能方法是一次使用一個數據點,并隨著我們的更新網絡權重。 此方法可能有助于加快網絡可能停止收斂的鞍點附近的收斂速度。 當然,僅單個點的誤差估計可能無法很好地近似于整個數據集的誤差。 解決此問題的最佳解決方案是使用小型批量梯度下降,其中我們將采用稱為小型批量的數據的隨機子集來計算誤差并更新網絡權重。 這幾乎總是最好的選擇。 它還有一個額外的好處,即可以將非常大的數據集自然地拆分為多個塊,這些塊可以更容易地在計算機的內存中甚至跨計算機的內存中進行管理。 這是對神經網絡最重要部分之一的極高層次的描述,我們認為這與本書的實際性質相符。 實際上,大多數現代框架都為我們處理了這些步驟。 但是,至少在理論上,它們無疑是值得了解的。 我們鼓勵讀者在時間允許的情況下更深入地進行向前和向后傳播。 # 深度學習的優化算法 梯度下降算法不是唯一可用于優化網絡權重的優化算法,但它是大多數其他算法的基礎。 雖然了解每種優化算法都有可能獲得博士學位,但我們將為一些最實用的內容專門介紹幾句話。 # 梯度下降和動量 通過使用具有動量的梯度下降,可以通過增加方向學習的速度來加快梯度下降,從而使梯度在方向上保持恒定,而在方向緩慢學習時,梯度會在方向上波動。 它允許梯度下降的速度增加。 動量的工作原理是引入速度項,并在更新規則中使用該項的加權移動平均值,如下所示: ![](https://img.kancloud.cn/7a/80/7a803a2f39e9798df1969e2ddd9a47fd_2090x240.png) ![](https://img.kancloud.cn/4b/85/4b85efe6e2d10c55f2f2c9685f2342f2_810x190.png) 在動量的情況下,最通常將`β`設置為 0.9,通常這不是需要更改的超參數。 # RMSProp 算法 RMSProp 是另一種算法,可以通過跨網絡權重表示的多維空間,通過在某些方向上加快學習速度,并在其他方向上抑制振蕩來加快梯度下降: ![](https://img.kancloud.cn/ed/b2/edb254e6b10601e37b0d1564b03ecd4d_910x420.png) ![](https://img.kancloud.cn/04/ad/04ada748f9ac0dcdac6f3f60516a518b_2090x240.png) ![](https://img.kancloud.cn/cf/c0/cfc0b5f63258fcccdf95dfc7f94c80e5_1200x470.png) 這具有在`v[t]`大的方向上進一步減少振蕩的效果。 # Adam 優化器 Adam 是已知表現最好的**優化器**之一,這是我的首選。 它可以很好地解決各種問題。 它將動量和 RMSProp 的最佳部分組合到一個更新規則中: ![](https://img.kancloud.cn/ed/b2/edb254e6b10601e37b0d1564b03ecd4d_910x420.png) ![](https://img.kancloud.cn/6f/5b/6f5b092aae9778b432557c063ae46122_2310x210.png) ![](https://img.kancloud.cn/e0/90/e090538b3fdabe57ac345f6a439471de_2170x210.png) ![](https://img.kancloud.cn/0e/95/0e95caa8f59171e83011d78c5925eea1_1450x430.png) 其中`ε`很小,可以防止被 0 除。 亞當通常是一個不錯的選擇,當您進行原型設計時,這是一個很好的起點,因此,從亞當開始可以節省一些時間。 # 深度學習框架 雖然僅使用 Python 的`numpy`從頭開始構建和訓練深度神經網絡是絕對可能的,但這將花費大量的時間和代碼。 在幾乎每種情況下,使用深度學習框架都更加實用。 在本書中,我們將使用 **TensorFlow** 和 **Keras** 來使開發深度神經網絡變得更加輕松和快捷。 # 什么是 TensorFlow? TensorFlow 是一個可用于快速構建深度神經網絡的庫。 在 TensorFlow 中,我們到目前為止已涵蓋的數學運算被表示為節點。 這些節點之間的邊緣是張量或多維數據數組。 給定定義為圖和損失函數的神經網絡,TensorFlow 可以自動計算網絡的梯度并優化圖以最小化損失函數。 TensorFlow 是 Google 在 2015 年發布的一個開源項目。此后,它已經獲得了很大的關注,并擁有龐大的用戶社區。 雖然 TensorFlow 提供 Java,C++,Go 和 Python 的 API,但我們僅介紹 Python API。 本書使用了 Python API,因為它既是最常用的,也是開發新模型時最常用的 API。 通過在一個或多個圖形處理單元上執行這些計算,TensorFlow 可以大大加快計算速度。 GPU 計算提供的加速已成為現代深度學習中的必要條件。 # 什么是 Keras? 盡管在 TensorFlow 中構建深度神經網絡要比從頭開始做起來容易得多,但 TensorFlow 仍然是一個非常底層的 API。 Keras 是一個高級 API,允許我們使用 TensorFlow(或 Theano 或 Microsoft 的 CNTK)快速構建深度學習網絡。 用 Keras 和 TensorFlow 構建的模型是便攜式的,也可以在本機 TensorFlow 中進行訓練或使用。 TensorFlow 中構建的模型可以加載到 Keras 中并在其中使用。 # TensorFlow 的流行替代品 那里還有許多其他很棒的深度學習框架。 我們之所以選擇 Keras 和 TensorFlow,主要是因為其受歡迎程度,易用性,支持的可用性以及生產部署的準備就緒。 無疑還有其他有價值的選擇。 我最喜歡的 TensorFlow 替代品包括: * **Apache MXNet**:一個非常高表現的框架,帶有一個名為 [**Gluon**](https://mxnet.apache.org/) 的新命令式接口 * [**PyTorch**](http://pytorch.org/):Facebook 最初開發的一種非常新穎且有希望的架構 * [**CNTK**](https://www.microsoft.com/en-us/cognitive-toolkit/):也可以與 Keras 一起使用的 Microsoft 深度學習框架 盡管我確實堅信 Keras 和 TensorFlow 是本書的正確選擇,但我也想承認這些出色的框架以及每個項目對領域做出的貢獻。 # TensorFlow 和 Keras 的 GPU 要求 在本書的其余部分,我們將使用 Keras 和 TensorFlow。 我們將探索的大多數示例都需要 GPU 來加速。 包括 TensorFlow 在內的大多數現代深度學習框架都使用 GPU 極大地加速了網絡訓練期間所需的大量計算。 如果沒有 GPU,我們討論的大多數模型的訓練時間將過長。 如果您沒有安裝有 GPU 的計算機,則可以從包括 Amazon 的 Amazon Web Services 和 Google 的 Google Cloud Platform 在內的各種云提供商處租用基于 GPU 的計算實例。 對于本書中的示例,我們將在運行 Ubuntu Server 16.04 的 Amazon EC2 中使用`p2.xlarge`實例。 p2.xlarge 實例提供了具有 2,496 個 CUDA 內核的 Nvidia Tesla K80 GPU,這將使我們在本書中顯示的模型的運行速度甚至比非常高端的臺式計算機所能達到的速度快得多。 # 安裝 Nvidia CUDA 工具包和 cuDNN 由于您可能會在深度學習工作中使用基于云的解決方案,因此我提供了一些說明,這些說明可幫助您在 Ubuntu Linux 上快速啟動并運行,Ubuntu Linux 在各個云提供商中普遍可用。 也可以在 Windows 上安裝 TensorFlow 和 Keras。 從 TensorFlow v1.2 開始,TensorFlow 不幸地不支持 OSX 上的 GPU。 在使用 GPU 之前,必須先安裝 **NVidia CUDA 工具包**和 **cuDNN** 。 我們將安裝 CUDA Toolkit 8.0 和 cuDNN v6.0,建議與 TensorFlow v1.4 一起使用。 在您閱讀完本段之前,很有可能會發布新版本,因此,請訪問 [www.tensorflow.org](http://www.tensorflow.org) 以獲取最新的必需版本。 我們將從在 Ubuntu 上安裝`build-essential`包開始,該包包含編譯 C++ 程序所需的大部分內容。 代碼在這里給出: ```py sudo apt-get update sudo apt-get install build-essential ``` 接下來,我們可以下載并安裝 CUDA Toolkit。 如前所述,我們將安裝 8.0 版及其相關補丁。 您可以在[這個頁面](https://developer.nvidia.com/cuda-zone)中找到最適合您的 CUDA 工具包。 ```py wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run sudo sh cuda_8.0.61_375.26_linux-run # Accept the EULA and choose defaults wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/patches/2/cuda_8.0.61.2_linux-run sudo sh cuda_8.0.61.2_linux-run # Accept the EULA and choose defaults ``` CUDA 工具包現在應該安裝在以下路徑中:`/usr/local/cuda`。 您需要添加一些環境變量,以便 TensorFlow 可以找到它。 您可能應該考慮將這些環境變量添加到`~/.bash_profile`,以便在每次登錄時進行設置,如以下代碼所示: ```py export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64" export CUDA_HOME="/usr/local/cuda" ``` 此時,您可以通過執行以下命令來測試一切是否正常:`nvidia-smi`。 輸出應類似于以下內容: ```py $nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.26 Driver Version: 375.26 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla K80 Off | 0000:00:1E.0 Off | 0 | | N/A 41C P0 57W / 149W | 0MiB / 11439MiB | 99% Default | +-------------------------------+----------------------+----------------------+ ``` 最后,我們需要安裝 cuDNN,這是 NVIDIA CUDA 深度神經網絡庫。 首先,將 cuDNN 下載到本地計算機。 為此,您需要在 **NVIDIA 開發人員網絡**中注冊為開發人員。 您可以在 [cuDNN 主頁](https://developer.nvidia.com/cudnn) 上找到 cuDNN。 將其下載到本地計算機后,可以使用`scp`將其移至 EC2 實例。 雖然確切的說明會因云提供商的不同而有所差異,但是您可以在[這個頁面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)中找到有關通過 SSH/SCP 連接到 AWS EC2 的其他信息。 。 將 cuDNN 移至 EC2 映像后,可以使用以下代碼解壓縮文件: ```py tar -xzvf cudnn-8.0-linux-x64-v6.0.tgz ``` 最后,使用以下代碼將解壓縮的文件復制到其適當的位置: ```py sudo cp cuda/include/cudnn.h /usr/local/cuda/include/ sudo cp cuda/lib64/* /usr/local/cuda/lib64 ``` 我不清楚為什么 CUDA 和 cuDNN 分別分發,為什么 cuDNN 需要注冊。 cuDNN 的下載過程和手動安裝過于復雜,這確實是深度學習中最大的謎團之一。 # 安裝 Python 我們將使用`virtualenv`創建一個隔離的 Python 虛擬環境。 盡管這不是嚴格必要的,但這是一種極好的實踐。 這樣,我們會將該項目的所有 Python 庫保存在一個獨立的隔離環境中,該環境不會干擾系統 Python 的安裝。 此外,`virtualenv`環境將使以后打包和部署我們的深度神經網絡更加容易。 首先,使用 Ubuntu 中的 aptitude 包管理器安裝`Python`,`pip`和`virtualenv`。 以下是代碼: ```py sudo apt-get install python3-pip python3-dev python-virtualenv ``` 現在,我們可以為我們的工作創建虛擬環境。 我們將所有虛擬環境文件保存在名為`~/deep-learn`的文件夾中。 您可以自由選擇該虛擬環境的任何名稱。 以下代碼顯示了如何創建虛擬環境: ```py virtualenv --no-site-packages -p python3 ~/deep-learn ``` 如果您是一位經驗豐富的 Python 開發人員,您可能已經注意到我已將環境設置為默認為 Python3.x。 肯定不是必須的,并且 TensorFlow/Keras 都支持 Python 2.7。 也就是說,作者感到 Python 社區有道德義務支持現代版本的 Python。 現在已經創建了虛擬環境,您可以按以下方式激活它: ```py $source ~/deep-learn/bin/activate (deep-learn)$ # notice the shell changes to indicate the virtualenv ``` 此時,每次登錄時都需要激活要使用的虛擬環境。如果您想始終輸入剛剛創建的虛擬環境,可以將`source`命令添加到`~/.bash_profile`。 現在我們已經配置了虛擬環境,我們可以根據需要在其中添加 Python 包。 首先,請確保我們具有 Python 包管理器`pip`的最新版本: ```py easy_install -U pip ``` 最后,我建議安裝 IPython,它是一個交互式 Python shell,可簡化開發。 ```py pip install ipython ``` 就是這樣。 現在我們準備安裝 TensorFlow 和 Keras。 # 安裝 TensorFlow 和 Keras 在我們共同完成所有工作之后,您將很高興看到現在安裝 TensorFlow 和 Keras 多么簡單。 讓我們開始安裝 TensorFlow TensorFlow 的安裝可以使用以下代碼完成: ```py pip install --upgrade tensorflow-gpu ``` 確保`pip install tensorflow-gpu`。 如果您通過 pip 安裝 TensorfFow(不帶`-gpu`),則將安裝僅 CPU 版本。 在安裝 Keras 之前,讓我們測試一下 TensorFlow 安裝。 為此,我將使用 TensorFlow 網站和 IPython 解釋器中的一些示例代碼。 通過在 bash 提示符下鍵入 **IPython** ,啟動 **IPython** 解釋程序。 **IPython** 啟動后,讓我們嘗試導入 TensorFlow。 輸出如下所示: ```py In [1]: import tensorflow as tf In [2]: ``` 如果導入 TensorFlow 導致錯誤,請對到目前為止已執行的步驟進行故障排除。 大多數情況下,當無法導入 TensorFlow 時,可能未正確安裝 CUDA 或 cuDNN。 現在我們已經成功安裝了 TensorFlow,我們將在 IPython 中運行一小段代碼,以驗證我們可以在 GPU 上運行計算: ```py a = tf.constant([1.0,</span> 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') c = tf.matmul(a, b) sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) print(sess.run(c)) ``` 如果一切順利,我們將看到許多跡象表明正在使用我們的 GPU。 我在此處提供了一些輸出,并重點介紹了提請您注意的證據。 根據硬件,您的輸出可能會有所不同,但是您應該看到類似的證據,如下所示: ```py /job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7 MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0 : I tensorflow/core/common_runtime/placer.cc:874] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0 b: (Const): /job:localhost/replica:0/task:0/device:GPU:0 : I tensorflow/core/common_runtime/placer.cc:874] b: (Const)/job:localhost/replica:0/task:0/device:GPU:0 a: (Const): /job:localhost/replica:0/task:0/device:GPU:0 : I tensorflow/core/common_runtime/placer.cc:874] a: (Const)/job:localhost/replica:0/task:0/device:GPU:0 [[ 22\. 28.] [ 49\. 64.]] ``` 在前面的輸出中,我們可以看到張量`a`和`b`以及矩陣乘法運算已分配給 GPU。 如果訪問 GPU 出現問題,則輸出可能如下所示: ```py I tensorflow/core/common_runtime/placer.cc:874] b_1: (Const)/job:localhost/replica:0/task:0/device:CPU:0 a_1: (Const): /job:localhost/replica:0/task:0/device:CPU:0 I tensorflow/core/common_runtime/placer.cc:874] a_1: (Const)/job:localhost/replica:0/task:0/device:CPU:0 ``` 在這里我們可以看到張量`b_1`和`a_1`被分配給 CPU 而不是 GPU。 如果發生這種情況,說明您的 TensorFlow,CUDA 或 cuDNN 安裝存在問題。 如果到目前為止,您已經安裝了 TensorFlow。 剩下的唯一任務是安裝 Keras。 可以在以下代碼的幫助下完成 Keras 的安裝: ```py pip install keras ``` 就是這樣! 現在我們準備在 Keras 和 TensorFlow 中構建深度神經網絡。 這可能是創建快照甚至是 EC2 實例的 AMI 的好時機,因此您不必再次進行此安裝。 # 構建用于深度學習的數據集 與您可能已經使用的其他預測模型相比,深度神經網絡非常復雜。 考慮一個具有 100 個輸入的網絡,兩個具有 30 個神經元的隱藏層以及一個邏輯輸出層。 該網絡將具有 3,930 個可學習的參數以及優化所需的超參數,這是一個非常小的例子。 大型卷積神經網絡將具有數億個可學習的參數。 所有這些參數使得深度神經網絡在學習結構和模式方面如此驚人。 但是,這也使過度安裝成為可能。 # 深度學習中的偏差和方差誤差 您可能熟悉典型預測模型中的所謂偏差/方差折衷。 如果您不在,我們將在此處提供快速提醒。 在傳統的預測模型中,當我們嘗試從偏差中發現誤差并從方差中發現誤差時,通常會有一些折衷。 因此,讓我們看看這兩個誤差是什么: * **偏差誤差**:偏差誤差是模型引入的誤差。 例如,如果您嘗試使用線性模型對非線性函數建模,則模型將在指定的下為,*并且偏差誤差會很高*。 * **方差誤差**:方差誤差是由訓練數據中的隨機性引起的誤差。 當我們很好地擬合訓練分布以至于我們的模型不再泛化時,我們就過擬合或引入了方差誤差。 在大多數機器學習應用中,我們尋求找到一些折衷方案,以最小化偏差誤差,同時引入盡可能小的方差誤差。 我之所以這么說是因為深度神經網絡的一大優點是,在很大程度上,偏差和方差可以彼此獨立地進行操縱。 但是,這樣做時,我們將需要非常謹慎地構造訓練數據。 # 訓練,驗證和測試數據集 在本書的其余部分中,我將把我的數據分為三個獨立的集合,分別稱為訓練,驗證和測試。 從總數據集中抽取為隨機樣本的這三個單獨的數據集的結構和大小將大致如此。 ![](https://img.kancloud.cn/84/67/8467b7831b83dd6e08f42ef7abf603dc_943x193.png) 訓練數據集將按預期用于訓練網絡。 驗證數據集將用于查找理想的超參數并測量過擬合。 *在周期結束時*,即網絡有機會觀察訓練集中的每個數據點時,我們將對驗證集進行預測。 該預測將用于監視過擬合,并將幫助我們知道網絡何時完成訓練。 像這樣在每個周期末尾使用驗證設置與典型用法有些不同。 有關保留驗證的更多信息,請參考 Hastie 和 Tibshirani 撰寫的[《統計學習的特征》](https://web.stanford.edu/~hastie/ElemStatLearn)。 一旦完成所有訓練,就將使用測試數據集,以根據網絡未看到的一組數據準確地測量模型表現。 驗證和測試數據來自同一數據集非常重要。 訓練數據集匹配驗證和測試不太重要,盡管那仍然是理想的。 例如,如果使用圖像增強(對訓練圖像進行較小的修改以嘗試擴大訓練集大小),則訓練集分布可能不再與驗證集分布匹配。 這是可以接受的,并且只要驗證和測試來自同一分布,就可以充分測量網絡表現。 在傳統的機器學習應用中,習慣上將 10% 到 20% 的可用數據用于驗證和測試。 在深度神經網絡中,通常情況是我們的數據量很大,以至于我們可以用更小的驗證和測試集來充分測量網絡表現。 當數據量達到數以千萬計的觀測值時,將 98%,1%,1% 的拆分完全合適。 # 在深度神經網絡中管理偏差和方差 現在,我們已經定義了如何構造數據并刷新偏差和方差,現在讓我們考慮如何控制深度神經網絡中的偏差和方差。 * **高偏差**:在訓練集上進行預測時,具有高偏差的網絡將具有非常高的錯誤率。 該模型在擬合數據方面表現不佳。 為了減少偏差,您可能需要更改網絡架構。 您可能需要添加層,神經元或兩者。 使用卷積或循環網絡可能可以更好地解決您的問題。 當然,有時由于信號不足或非常困難的問題而導致問題偏高,因此請務必以合理的速度校準您的期望(我喜歡從對人的準確率進行校準開始)。 * **高方差**:具有低偏差誤差的網絡很好地擬合了訓練數據; 但是,如果驗證誤差大于測試誤差,則網絡已開始過擬合訓練數據。 減少差異的兩種最佳方法是添加數據并向網絡添加正則化。 添加數據很簡單,但并非總是可能的。 在整本書中,我們將介紹適用的正則化技術。 我們將討論的最常見的正則化技術是 L2 正則化,丟棄法和批量歸一化。 # K 折交叉驗證 如果您有機器學習的經驗,您可能想知道為什么我會選擇通過 K 折交叉驗證而不是保留(訓練/驗證/測試)驗證。 訓練深度神經網絡是一項非常昂貴的操作,并且非常簡單地講,針對每個我們想探索的超參數訓練 K 個神經網絡通常不太實用。 我們可以確信,在給定的驗證和測試集足夠大的情況下,留出驗證會做得很好。 在大多數情況下,我們希望在有大量數據的情況下應用深度學習,從而獲得足夠的值和測試集。 最終,這取決于您。 稍后我們將看到,Keras 提供了 **scikit-learn** 接口,該接口可將 Keras 模型集成到 scikit-learn 管道中。 這使我們能夠執行 K 折,分層 K 折,甚至使用 K 折進行網格搜索。 有時在訓練深層模型時使用 K 折 CV 是可行且適當的。 也就是說,在本書的其余部分中,我們將重點介紹使用留出驗證。 # 總結 希望本章能夠使您對深度神經網絡架構和優化算法有所了解。 因為這是快速參考,所以我們沒有做太多的詳細介紹,我鼓勵讀者對這里可能是新手或陌生的任何材料進行更深入的研究。 我們討論了 Keras 和 TensorFlow 的基礎知識,以及為什么我們在本書中選擇了這些框架。 我們還討論了 CUDA,cuDNN,Keras 和 TensorFlow 的安裝和配置。 最后,我們介紹了本書其余部分將使用的留出驗證方法,以及為什么對于大多數深度神經網絡應用,我們都更喜歡 K 折 CV。 當我們在以后的章節中重新審視這些主題時,我們將大量參考本章。 在下一章中,我們將開始使用 Keras 解決回歸問題,這是構建深度神經網絡的第一步。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看