跳轉到主要內容
工程的博客

與Apache火花和TensorFlow深度學習

2016年1月25日 工程的博客

分享這篇文章

神經網絡看到壯觀的進步在過去的幾年裏,他們現在最先進的圖像識別和自動翻譯。TensorFlow穀歌發布的一個新框架為數值計算和神經網絡。在這篇文章中,我們將演示如何使用TensorFlow和火花一起訓練和應用深度學習模型。

你可能想知道:什麼是Apache火花的大多數高性能深度學習實現時使用這隻單節點?要回答這個問題,我們穿過兩個用例並解釋如何使用火花和一群機改善深度學習與TensorFlow管道:

  1. Hyperparameter調優:使用火花來找到最佳的hyperparameters神經網絡訓練,導致10倍減少訓練時間和錯誤率低34%。
  2. 大規模部署模式:使用火花訓練神經網絡模型應用到大量的數據。

Hyperparameter調優

深度學習機器學習的一個例子(ML)技術人工神經網絡。他們把一個複雜的輸入,如一個圖像或一個錄音,然後應用複雜的數學變換對這些信號。該轉換的輸出是一個向量的數字被其他ML算法更容易操作。人工神經網絡執行這個轉換通過模仿人類大腦的視覺皮層的神經元(在一個相當簡單的形式)。

就像人類學會解釋他們所看到的,人工神經網絡需要訓練來識別特定模式“有趣”。例如,這些可以是簡單的模式,如邊緣,圈,但他們可以複雜得多。在這裏,我們將使用一個經典數據集由NIST和訓練一個神經網絡識別這些數字:

image02

TensorFlow圖書館自動化創建的神經網絡訓練算法的各種形狀和大小。建立一個神經網絡的實際過程,然而,更複雜的不僅僅是在數據集上運行一個函數。通常有許多非常重要的hyperparameters(配置參數從一個外行人的角度),從而影響模型是如何訓練的。選擇正確的參數會導致高績效,而糟糕的參數會導致長時間的訓練和糟糕的性能。機器學習在實踐中,從業者多次運行相同的模型不同hyperparameters為了找到最好的。這是一個經典的技術稱為hyperparameter調優。

在構建神經網絡時,有許多重要hyperparameters仔細選擇。例如:

  • 每一層的神經元數量:神經元太少會降低網絡的表達能力,但是太多的將大大增加運行時間和返回嘈雜的估計。
  • 學習速率:如果它太高了,神經網絡隻會專注於過去幾個樣本見過和無視所有的經驗積累。如果太低,需要太長時間達到一個良好的狀態。

有趣的是,盡管TensorFlow本身並不是分布式hyperparameter調優過程高度平行,可以分布式使用火花。在這種情況下,我們可以使用火花廣播公共元素,如數據和模型描述,然後安排個人重複計算跨一個機器集群容錯的方式。

image04

使用火花提高準確性如何?hyperparameters的缺省設置的精度是99.2%。我們最好的結果與hyperparameter調優測試集上有99.47%的準確率,這是一個減少34%的測試誤差。分布計算線性擴展添加到集群節點的數目:使用13-node集群,我們能夠訓練13並行模型,轉化為7 x加速訓練模型相比,一次在一台機器上。這是一個圖形的計算時間(以秒為單位)對機器集群的數量:

更重要的是,我們得到了深入的感性訓練過程的各種hyperparameters培訓。例如,我們的陰謀最終測試性能對學習速率,不同數量的神經元:

image03

這顯示了一個典型的神經網絡的權衡曲線:

  • 學習速率是至關重要的:如果太低,神經網絡沒有學到任何東西(高測試誤差)。如果它太高了,培訓過程可能在某些配置隨機振蕩甚至發散。
  • 神經元的數量並不重要對於獲得良好的性能,與許多神經元和網絡學習速率敏感得多。這是奧卡姆剃刀原則:簡單的模型往往是“足夠好”對於大多數用途。後如果你有時間和資源去丟失1%的測試錯誤,你必須願意投入大量的資源,培訓,和找到適當的hyperparameters將的區別。

通過使用一個稀疏的樣本參數,我們可以零的最有前途的參數集。

我怎麼使用它呢?

自從TensorFlow每個工人可以使用所有的核心,我們隻運行一個任務一次每個工人,我們批一起來限製競爭。TensorFlow圖書館可以安裝在火花集群作為一個常規的Python庫,之後TensorFlow網站上的說明。以下筆記本下麵展示如何安裝TensorFlow和讓用戶重新運行這篇文章的實驗:

大規模部署模型

TensorFlow模型可以直接嵌入管道數據集上執行複雜的識別任務。作為一個例子,我們顯示如何標簽一組股票的圖片已經訓練的神經網絡模型。

模型首先分布式集群的工人,用火花的內置廣播機製:

gfile。FastGFile (“classify_image_graph_def。pb, rb) f:
model_data = f.read ()
model_data_bc = sc.broadcast (model_data)

然後在每個節點上加載這個模型應用於圖像。這是一個草圖在每個節點上運行的代碼:

def apply_batch (image_url):
#創建了一個新的計算模型和進口TensorFlow圖
用tf.Graph () .as_default g ():
graph_def = tf.GraphDef ()
graph_def.ParseFromString (model_data_bc.value)
特遣部隊。import_graph_def (graph_def name = ")

#從URL加載圖像數據:image_data = urllib.request。urlopen (img_url超時=1.0).read ()#一個張量流會話加載運行tf.Session ()作為稅:softmax_tensor = sess.graph.get_tensor_by_name (softmax: 0的)預測= sess.run (softmax_tensor, {“DecodeJpeg /內容:0”:image_data})返回預測

這段代碼可以更有效的通過批處理圖片。

這是一個形象的例子:

image01

這是這張圖片的解釋根據神經網絡,這是相當準確的:

(0.88503921),“珊瑚礁”
(戴水肺的潛水員,0.025853464),
(“腦珊瑚”,0.0090828091),
(“潛水”,0.0036010914),
(“海角,岬,頭,前陸”,0.0022605944)])

期待

我們已經展示了如何結合火花和TensorFlow訓練神經網絡部署在手寫數字識別和圖像標記。盡管我們使用的神經網絡框架本身隻在單節點工作,我們可以用火花分發hyperparameter優化過程和模型部署。這不僅減少了訓練時間,也提高了準確性和給我們一個更好的理解各種hyperparameters感性。

雖然這隻是用於Python的支持,我們期待TensorFlow之間更深層次的集成和火花的其他框架。

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map