- 原文地址:Deep Learning #1: Setting up AWS & Image Recognition
- 原文做者:Rutger Ruizendaal
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:TobiasLee
- 校對者:Tina92 sqrthree
這篇文章是深度學習系列的第一部分。你能夠在這裏查看第二部分,以及這裏查看第三部分。前端
本週的任務:對貓和狗的圖像進行分類python
歡迎閱讀本系列第一篇關於實戰深度學習的文章。在本文中,我將建立 Amazon Web Services(AWS)實例,並使用預先訓練的模型對貓和狗的圖像進行分類。react
在這個完整的系列裏,我會記錄下我在 Fast AI 深度學習課程的第一部份內容的進度。這門課程最初是由舊金山大學數據研究所提供的,而且如今可以在 MOOC 上觀看。最近,這門課的做者提供了第二部分的內容,而且在接下來的幾個月均可以在網上觀看。我上這門課的主要是由於我對深度學習有着強烈的興趣。我在網上發現了許多關於機器學習的課程,但有關深度學習的實戰課程仍是比較少見的。深度學習彷佛由於進入門檻略高一點,而被單獨列出。開始深度學習以前咱們首先須要一個 GPU,在這門課程裏咱們會使用 AWS 的 p2 實例。如今讓咱們一塊兒來準備它。linux
這門課程第一週,咱們會把重點放在準備工做上。正確地準備深度學習須要一點時間,但這對一切能正確運行很重要。這包括了設置 AWS,建立和配置 GPU 實例,設置 ssh 鏈接服務器以及管理你的目錄。android
我在實習期用的筆記本電腦上遇到了一些權限問題。我有個建議可以避免這個問題,從而幫你節省大量時間:在嘗試操做以前,確保你在你的筆記本電腦上擁有完整的管理員權限。一些熱情的工程師提出幫助我設置 GPU 實例,可是他們不能立刻幫我搞定,因此我決定本身來。ios
用來設置 AWS 的腳本是用 bash 寫的,若是你用的是 Windows 操做系統,那麼你須要一個可以處理它的程序,我用的是 Cygwin。我想分享一些在設置過程當中我遇到的問題(以及對應的解決方案)。若是你沒有在上 Fast AI 課程,你能夠跳過這部分繼續閱讀。我在設置過程當中所遇到的問題有:git
bash 腳本報錯github
我看過一些可能的緣由,可是沒有一個是對我有用的解決方案。Github 上這個課程的設置腳本有兩個:setup_p2.sh 和 setup_instance.sh。若是上面那兩個腳本不能用,你能夠用這個腳本試試。但若是這個腳本仍是不行,請務必再嘗試使用原始版本的腳本。算法
我在 aws-alias.sh 這個腳本上也遇到了一樣的問題,在第七行的末尾加上 '
可以解決這個問題。下面是修改前和修改後的第七行:後端
alias aws-state='aws ec2 describe-instances --instance-ids $instanceId --query "Reservations[0].Instances[0].State.Name"
alias aws-state='aws ec2 describe-instances --instance-ids $instanceId --query "Reservations[0].Instances[0].State.Name"'
這裏有一個爲不熟悉 Bash 的人準備的 Bash 備忘錄,由於你須要經過 Bash 來和你的實例進行交互,因此我很是推薦你去看看。
Anaconda 的安裝。視頻中提到你須要在安裝 Cygwin 以前先安裝 Anaconda。你可能感到有些疑惑,由於你須要用「Cygwin python」來運行 pip 命令而不是一個本地的 Anaconda 分發版。
另外,這個倉庫有一個手把手的教程教你如何讓你的實例運行起來。
解決了一些問題以後我總算讓個人 GPU 實例運行起來了。是時候開始深度學習了!一個簡短的免責聲明:在這一系列博客中,我不會重複已經在課程筆記中列出的內容,由於不必。我會強調一些我以爲頗有趣的事情,以及我在課程中遇到的問題和一些想法。
讓咱們從第一個可能已經在你腦海中的問題開始:什麼是深度學習?它如今爲何被炒得這麼火?
深度學習只是一個有着多個隱含層的人造神經網絡,隱含層讓它變得「深度」。通常的神經網絡只有一層或者兩層的隱含層,而一個深度神經網絡有更多的隱含層。它們也具備與通常神經網絡中的「簡單」層不一樣類型的層。
(淺) 神經網絡
目前,深度學習在一些著名的數據集上不斷地有着出色的表現,因此深度學習也經歷了很多的炒做。深度學習的流行有三個緣由:
神經網絡是經過模仿人腦而設計的。根據通用近似定理,它理論上能擬合任何函數。神經網絡經過反向傳播算法來訓練,這使得咱們可以調整模型的參數來適應不一樣的函數。最後一個緣由,也是深度學習近期取得衆多成就的主要緣由。由於遊戲行業的進步和 GPU 計算能力的強勁發展,如今咱們以很是快速和可擴展的方式來訓練深層的神經網絡。
在第一節課裏,咱們的目標是使用一個叫作 Vgg16 的預先訓練好的模型,來對貓和狗的圖片進行分類。Vgg16 是 2014 年贏得 Imagenet 比賽模型的一個輕量級版本。這是一個年度的比賽而且多是計算機視覺方面最大的一個比賽。咱們能夠利用這預先訓練好的模型,而且把它應用到咱們的貓和狗的圖片數據集上。咱們的數據集已經被課程的做者編輯過了,以確保它的格式正確。原始的數據集能夠在 Kaggle 上找到。這場比賽最初是在 2013 年進行的,那時的準確率是 80%。而咱們的簡單模型已經可以達到 97%的準確度。大腦如今還清醒吧?下面是一些照片和他們被預測的標記:
狗狗們和貓貓們被預測的標記
咱們用叫作獨熱編碼的方法來處理目標標記,這是分類問題中經常使用的方法。[1. 0.] 說明圖片中是一隻貓, [0. 1.] 則說明是一隻狗。咱們沒有用一個叫作「目標」的有 0 和 1 兩種取值的變量,而是建立了一個包含兩個值的數組。你能夠把這些變量當作「貓貓」和「狗狗」。若是變量爲正,那麼它就會被標記爲 1,不然就是 0。在一個多分類問題中,這意味着你的輸出向量可能長成這樣:[0 0 0 0 0 0 0 1 0 0 0]。在這個例子中,Vgg16 模型會輸出圖片屬於「貓」這個類別的可能性以及屬於「狗」這個類別的可能性。接下來的一個挑戰是調整這個模型,以便咱們將其應用於另外一個數據集。
本質上這個數據集和先前的是同一個數據集,可是沒有被課程做者預處理過。Kaggle 命令行接口(CLI)提供了一個快捷的方法來下載這個數據集,能夠經過 pip 來安裝。一個美圓標誌一般用來表示命令運行在終端中。
$ pip install kaggle-cli複製代碼
訓練數據集中有 25000 張已經被標記爲貓或是的狗的圖片,測試數據集中則包含 12500 張未被標記的圖片。爲了調整參數,咱們還經過佔用訓練集的一小部分來建立驗證數據集。設置一個完整數據集的「樣本」也頗有用,能夠用來快速檢查你的模型在構建過程當中是否正常工做。
咱們使用 Keras 庫來運行咱們的模型,這個庫是基於 Thenao 和 TensorFlow 的最流行的深度學習庫之一。Keras 可以讓你更加直觀地來編寫神經網絡,這意味着你可以更多地關注神經網絡的架構而不用擔憂 TensorFlow API。由於Keras 經過查看圖片所屬的目錄來肯定它的類別,因此把圖片移動到正確的目錄很是的重要。這些操做所需的 bash 命令能夠直接在 Jupyter Notebook 中運行,也就是咱們寫代碼的地方。這個連接包含了額外的一些關於這些命令的信息。
一個 epoch,也就是在數據集完整地跑一遍,在個人 Amazon p2 實例上花費了 10 分鐘時間。在這個例子裏數據集是包含 23000 張圖片的訓練數據集,另外的 2000 張圖片被保留下來做爲驗證數據集。在這裏我決定使用 3 個 epoch。在驗證數據集上的準確度在 98% 左右。訓練好模型以後,咱們能夠看一些被正確分類的圖片。在這個例子裏,咱們用圖片中是一隻貓的機率做爲結果。1.0 表示模型很是自信地認爲圖片中是一隻貓,而 0.0 則表示圖片中是一隻狗。
被正確分類的圖片
如今讓咱們來看一些被錯誤分類的圖片。正如咱們所見,這些圖片大部分是從遠處拍攝的,而且圖片裏有多種動物。原始的 Vgg 模型是用在圖片中只有一種清晰可見目標類別中的。只有我以爲第四張圖片有點可怕嗎?
被錯誤分類的圖片
最後,這些是模型對其類別最不肯定的一些圖片。這意味着機率很是接近 0.5(1 表明是一隻貓而 0 表明是一隻狗)。第四張圖片中的貓只有一張臉露出來。第一張和第三張圖片是長方形的而不是原模型訓練集中的正方形。
模型最不肯定的圖片
這就是這周的內容。就我我的而言,我已經火燒眉毛地想要開始第二週的課程而且學習更多關於這個模型的內部細節。但願咱們也能開始利用 Keras 從頭構建一個模型。
同時,感謝全部更新 GitHub 腳本的人,這可幫了大忙!另外也要感謝全部參與 Fast AI 論壇的人,大家太棒了。
若是你喜歡這篇文章,請把它推薦給你的朋友們,讓更多人的看到它。你也能夠按照這篇文章,跟上我在 Fast AI 課程中的進度。到時候那裏見!
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。