使用TensorFlow實現神經網絡的介紹

機器學習 圖像處理 深度學習 Python Intelligentcomputing 2017-04-30

介紹

如果您一直在追蹤數據科學/機器學習,您將不會錯過深度學習和神經網絡周圍的動態。組織正在尋找具有深度學習技能的人,無論他們在哪裡。從競爭開始到開放採購項目和大額獎金,人們正在嘗試一切可能的事情來利用這個有限的人才。自主駕駛的工程師正在被汽車行業的大型槍支所獵殺,因為該行業處於近幾十年來面臨的最大破壞的邊緣!

如果您對深度學習所提供的潛在客戶感到興奮,但還沒有開始您的旅程 - 我在這裡啟用它。從這篇文章開始,我將撰寫一系列深入學習的文章,涵蓋深受歡迎的深度學習圖書館及其實踐實踐。

在本文中,我將向您介紹TensorFlow。閱讀本文後,您將能夠了解神經網絡的應用,並使用TensorFlow來解決現實生活中的問題。本文將要求您瞭解神經網絡的基礎知識,並熟悉編程。雖然這篇文章中的代碼在python中,但我已經將重點放在了概念上,並且儘可能地保持與語言無關。

讓我們開始吧!

TensorFlow

使用TensorFlow實現神經網絡的介紹

目錄

  • 何時應用神經網?

  • 一般解決神經網絡問題的方法

  • 瞭解圖像數據和流行圖書館來解決它

  • 什麼是TensorFlow?

  • TensorFlow的典型“流”

  • 在TensorFlow中實施MLP

  • TensorFlow的限制

  • TensorFlow與其他庫

  • 從哪裡去?

何時應用神經網絡?

現在,神經網絡已經成為焦點。有關神經網絡和深度學習的更詳細的解釋,請閱讀這裡。其“更深層次”的版本在圖像識別,語音和自然語言處理等諸多領域取得了巨大的突破。

出現的主要問題是什麼時候和何時不應用神經網絡?這個領域現在就像一個金礦,每天都有很多發現。而要成為這個“淘金熱”的一部分,你必須注意幾點:

首先,神經網絡需要清晰和翔實的數據(主要是大數據)進行訓練。嘗試想象神經網絡作為一個孩子。它首先觀察父母的行為。然後,它試圖自己行走,並且每一步,孩子學習如何執行一個特定的任務。它可能會下降幾次,但經過幾次不成功的嘗試,它會學習如何走路。如果你不讓它走路,它可能不會學習如何走路。您可以向孩子提供的曝光次數越多越好。

對於像圖像處理這樣的複雜問題,使用神經網絡是謹慎的。神經網絡屬於稱為表示學習算法的一類算法。這些算法將複雜問題分解成更簡單的形式,使其變得可理解(或“可表示”)。想想它在你吞嚥之前咀嚼食物。對於傳統(非表示學習)算法,這將更加困難。

當您有適當類型的神經網絡來解決問題。每個問題都有自己的扭曲。所以數據決定了你解決問題的方式。例如,如果問題是序列生成,則循環神經網絡更適合。而如果是圖像相關的問題,那麼你可能會更好地採用卷積神經網絡進行改變。

最後但並非最不重要的是,硬件要求對於運行深層神經網絡模型至關重要。神經網絡很久以前就被“發現”了,但近年來,由於計算資源越來越強大,主要原因在於神經網絡。如果你想解決這些網絡的現實生活中的問題,準備購買一些高端的硬件!

一般解決神經網絡問題的方法

神經網絡是一種特殊類型的機器學習(ML)算法。因此,作為每個ML算法,它遵循數據預處理,模型構建和模型評估的通常的ML工作流程。為了簡潔起見,我列出瞭如何處理神經網絡問題的DO DO列表。

檢查是否是神經網絡給您提升傳統算法的問題(參見上一節中的清單)

做一個關於哪個神經網絡架構最適合所需問題的調查

定義您選擇的任何語言/圖書館的神經網絡架構。

將數據轉換為正確的格式,並將其分批

根據您的需要預處理數據

增加數據以增加尺寸並製作更好的訓練模型

飼料批次到神經網絡

訓練和監測培訓和驗證數據集中的變化

測試您的模型,並保存以備將來使用

對於這篇文章,我將專注於圖像數據。所以讓我們明白,首先我們深入瞭解TensorFlow。

瞭解圖像數據和流行庫來解決它

圖像大部分排列為3-D陣列,其尺寸為高度,寬度和顏色通道。例如,如果您在此時拍攝個人電腦的屏幕截圖,那麼首先將其轉換為3-D數組,然後壓縮它的“.jpeg”或“.png”文件格式。

雖然這些圖像對於人來說很容易理解,但計算機很難理解它們。這種現象被稱為“語義差距”。我們的大腦可以在幾秒鐘內觀看圖像並瞭解完整的圖像。另一方面,計算機將圖像視為數字數組。那麼問題是我們如何將這個圖像解釋給機器?

在早期的時候,人們試圖將這個圖像分解為“可理解”的格式,像“模板”一樣。例如,臉部總是具有特定的結構,每個人都有一些保護,例如眼睛,鼻子或臉部的形狀。但是這種方法將是乏味的,因為當要識別的對象的數量會增加時,“模板”將不成立。

快速到2012年,深層神經網絡架構贏得了ImageNet的挑戰,這是一個從自然場景識別物體的巨大挑戰。它繼續在所有即將到來的ImageNet挑戰中統治其主權,從而證明了解決圖像問題的有用性。

那麼人們通常使用哪些圖書館/語言來解決圖像識別問題?最近的一項調查顯示,大多數流行的深層學習庫都有Python接口,其次是Lua,Java和Matlab。最受歡迎的圖書館,僅舉幾例:

  • Caffe

  • DeepLearning4j

  • TensorFlow

  • Theano

  • Torch

現在,您瞭解圖像的存儲方式以及使用的常用庫,我們來看看TensorFlow提供的功能。

什麼是TensorFlow?

讓我們從官方的定義開始,

“TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖中的節點表示數學運算,而圖形邊緣表示在它們之間傳遞的多維數據陣列(又稱張量)。靈活的架構允許您將計算部署到具有單個API的桌面,服務器或移動設備中的一個或多個CPU或GPU。

使用TensorFlow實現神經網絡的介紹

如果這聽起來有點可怕 - 別擔心。這是我簡單的定義 - 看看TensorFlow只是一個麻煩的扭曲。如果你以前一直在努力,理解TensorFlow將是一塊蛋糕! numpy和TensorFlow之間的一個主要區別在於TensorFlow遵循一個懶惰的編程範例。它首先構建要完成的所有操作的圖形,然後當調用“會話”時,它會“運行”圖形。它是通過將內部數據表示更改為張量(也稱為多維數組)來實現的。構建計算圖可以被認為是TensorFlow的主要成分。要了解更多關於計算圖的數學結構,請閱讀本文。

將TensorFlow分類為神經網絡庫很容易,但不僅僅是這樣。是的,它被設計成一個強大的神經網絡庫。但它有權力做得比這更多。您可以在其上構建其他機器學習算法,如決策樹或k-最近的鄰居。你可以從字面上做一切你通常會做的麻煩!它恰當地稱為“類固醇類”

使用TensorFlow的優點是:

  • 它具有直觀的結構,因為顧名思義,它具有“張量的流動”。您可以輕鬆地顯示圖形的每個部分。

  • 輕鬆地在cpu / gpu上進行分佈式計算

  • 平臺靈活性您可以隨時隨地運行模型,無論是在移動設備,服務器還是PC上。

TensorFlow的典型“流”

每個圖書館都有自己的“實現細節”,即一種寫在其編碼範例之後的方式。 例如,在實現scikit-learning時,首先創建所需算法的對象,然後在列車上建立一個模型,並在測試集上得到預測,如下所示:

# define hyperparamters of ML algorithm

正如我剛才所說,TensorFlow遵循一種懶惰的方法。 在TensorFlow中運行程序的通常工作流程如下:

  • 構建計算圖,這可以是TensorFlow支持的任何數學運算。

  • 初始化變量,編譯前面定義的變量

  • 創建會話,這是魔法開始的地方!

  • 在會話中運行圖形,將編譯的圖形傳遞給會話,該會話開始執行。

  • 關閉會話,關閉會話。

一些在TensoFlow中使用的術語

  • placeholder: A way to feed data into the graphs
  • feed_dict: A dictionary to pass numeric values to computational graph

    placeholder: 一種將數據提供給圖表的方式

    feed_dict:將數值傳遞到計算圖的字典

讓我們寫一個小程序來添加兩個數字!

# import tensorflow

在TensorFlow中實現神經網絡

注意:我們可以使用不同的神經網絡架構來解決這個問題,但為了簡單起見,我們深入實施了前饋多層感知器。

讓我們先記住我們對神經網絡的瞭解。

神經網絡的典型實現如下:

  • 定義神經網絡架構進行編譯

  • 將數據傳輸到您的模型

  • 在引擎蓋下,數據首先分為批次,以便可以攝取。批次首先進行預處理,增強,然後進入神經網絡進行培訓

  • 然後模型逐步訓練

  • 顯示特定數量的時間步長的準確性

  • 訓練後保存模型供日後使用

  • 在新數據上測試模型並檢查它的執行情況

在這裡我們解決我們深刻的學習實踐問題 - 識別數字。我們來看看我們的問題陳述。

我們的問題是圖像識別,用於識別給定28×28圖像中的數字。我們有一個子集的圖像訓練和其餘的測試我們的模型。首先下載火車和測試文件。數據集包含數據集中所有圖像的壓縮文件,train.csv和test.csv都具有對應的列車和測試圖像的名稱。數據集中沒有提供任何其他功能,只是原始圖像以“.png”格式提供。

如您所知,我們將使用TensorFlow製作神經網絡模型。所以你應該首先在系統中安裝TensorFlow。根據您的系統規格,請參閱官方安裝指南進行安裝。

我們將按照上述模板。用python 2.7內核創建Jupyter筆記本,並按照以下步驟操作。

  • 我們導入所有必需的模塊

%pylab inline
  • 我們設置種子值,以便我們可以控制我們的模型隨機性

# To stop potential randomness
  • 第一步是設置目錄路徑,保護!

root_dir = os.path.abspath('../..')
  • 現在讓我們看看我們的數據集。 這些是.csv格式,並具有一個文件名以及適當的標籤

train = pd.read_csv(os.path.join(data_dir, 'Train', 'train.csv'))

filenamelabel
00.png4
11.png9
22.png1
33.png7
44.png3

讓我們看看我們的數據看起來如何! 我們讀取我們的圖像並顯示它。

img_name = rng.choice(train.filename)

使用TensorFlow實現神經網絡的介紹

上面的圖像被表示為numpy數組,如下所示

使用TensorFlow實現神經網絡的介紹

  • 為了方便數據操作,我們將所有圖像存儲為數字數組

temp = []

由於這是一個典型的ML問題,為了測試我們模型的正常運行,我們創建一個驗證集。 我們採取70:30的分組大小,用於訓練集和驗證集

split_size = int(train_x.shape[0]*0.7)
  • 現在我們在我們的程序中定義了一些我們以後使用的幫助函數

def dense_to_one_hot(labels_dense, num_classes=10):

現在是主要部分! 讓我們來定義我們的神經網絡架構。 我們定義一個具有3層的神經網絡; 輸入,隱藏和輸出。 輸入和輸出中的神經元數量是固定的,因為輸入是我們的28×28圖像,輸出是表示該類的10×1矢量。 我們在隱藏層中採集500個神經元。 這個數字可以根據你的需要而變化。 我們還為其餘變量分配值。 閱讀關於神經網絡基礎知識的文章,深入瞭解它的工作原理。

### set all variables
  • 現在創建我們的神經網絡計算圖

hidden_layer = tf.add(tf.matmul(x, weights['hidden']), biases['hidden'])
  • 另外,我們需要定義神經網絡的成本

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output_layer, y))
  • 並設置優化器,即我們的反向推算算法。 這裡我們使用Adam,它是Gradient Descent算法的有效變體。 在張量流中還有一些其他優化器(請參閱這裡)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
  • 在定義了我們的神經網絡架構之後,讓我們初始化所有的變量

init = tf.initialize_all_variables()
  • 現在讓我們創建一個會話,並在會話中運行我們的神經網絡。 我們還驗證我們的模型在我們創建的驗證集上的準確性

with tf.Session() as sess:

這將是上述代碼的輸出

Epoch: 1 cost = 8.93566
  • 用自己的眼睛來測試我們的模型,讓我們來看看它的預測

img_name = rng.choice(test.filename)
Prediction is: 8

使用TensorFlow實現神經網絡的介紹

  • 我們看到我們的模特表現相當不錯! 現在我們來創建一個提交

sample_submission.filename = test.filename

並做了! 我們剛剛創建了自己訓練有素的神經網絡!

TensorFlow的限制

儘管TensorFlow功能強大,但它仍然是一個低級別的圖書館。例如,它可以被認為是機器級語言。但是,對於大多數目的,您需要模塊化和高級接口,如keras

  • 它還在發展,這麼多的awesomeness來了!

  • 這取決於你的硬件規格,越多越好

  • 仍然不是許多語言的API。

  • 還有很多事情尚未被包括在TensorFlow中,比如OpenCL支持。

上面提到的大多數都在TensorFlow開發人員的視野中。他們為制定未來圖書館的發展方向制定了路線圖。

TensorFlow與其他庫

TensorFlow建立在與使用數學計算圖的Theano和Torch類似的原理。但是,隨著分佈式計算的額外支持,TensorFlow可以更好地解決複雜的問題。已經支持部署TensorFlow模型,這使得它更容易用於工業目的,打擊了Deeplearning4j,H2O和Turi等商業圖書館。 TensorFlow有Python,C ++和Matlab的API。最近還有一些支持其他語言(如Ruby和R)的激增。因此,TensorFlow正在努力擁有通用語言支持。

到哪裡去

所以你看到如何用TensorFlow構建一個簡單的神經網絡。這段代碼是為了讓人們瞭解如何開始實施TensorFlow,所以請拿一些鹽。記住,為了解決更復雜的現實生活中的問題,你必須稍微調整一下代碼。

可以抽象出許多上述功能,以提供無縫的端到端工作流程。如果您已經使用scikit學習,您可能會知道一個高級別的圖書館如何抽象出“底層”的實現方式,為終端用戶提供了一個更簡單的界面。雖然TensorFlow的大部分實現都已經被抽象出來了,但高級庫正在出現,如TF-slim和TFlearn。

有用的資源

  • TensorFlow官方存儲庫

  • Rajat Monga(TensorFlow技術主管)“TensorFlow for everyone”視頻

  • 專門的資源列表

相關推薦

推薦中...