智能系統技術叢書 深度學習實踐:基于Caffe的解析》—1.2深度學習工具簡介

      網友投稿 1012 2022-05-30

      1.2 深度學習工具簡介

      本節主要是比較TensorFlow、Caffe、Theano、Torch7、MXNet這幾個主流的深度學習框架。本節對每個框架只做一個簡單的說明,不做詳細介紹,有興趣的讀者,請自行參閱各個框架的官方文檔。

      1. TensorFlow

      TensorFlow是相對高階的機器學習庫,用戶可以方便地使用TensorFlow設計神經網絡結構,而不必為了追求高效率的實現親自編寫C++或CUDA代碼。TensorFlow與Theano一樣都支持自動求導,用戶不需要再通過反向傳播來求解梯度。其核心代碼與Caffe一樣都是用C++編寫的,使用C++可以降低線上部署的復雜度,并且使得像手機這種內存和CPU資源都緊張的設備可以運行復雜的模型(Python則會比較消耗資源,并且執行效率也不高)。除了核心代碼的C++接口之外,TensorFlow還有官方的Python、Go和Java接口,都是通過SWIG(Simplified Wrapper and Interface Generator)實現的,這樣用戶就可以在一個硬件配置較好的機器中使用Python進行實驗了,并且還可以在資源比較緊張的嵌入式環境或需要低延遲的環境中用C++部署模型。SWIG支持對C/C++代碼提供各種語言的接口,因此其他腳本語言的接口在未來也可以通過SWIG方便地添加進來。不過使用Python時有一個影響效率的問題,那就是每一個mini-batch都要從Python中輸入到網絡中,這個過程在mini-batch的數據量很小或者運算時間很短時,可能會造成影響比較大的延遲。

      《智能系統與技術叢書 深度學習實踐:基于Caffe的解析》—1.2深度學習工具簡介

      Google 在2016年2月開源了TensorFlow?Serving,這個組件可以將TensorFlow訓

      練好的模型導出,并部署成可以對外提供預測服務的RESTful接口,有了這一組件,TensorFlow實現了應用機器學習的全流程:從訓練模型、調試參數,到打包模型,再到最后的部署服務,名副其實是一個從研究到生產整條流水線都齊備的框架。對此,可引用TensorFlow內部開發人員的描述來進行進一步的說明:“TensorFlow?Serving是一個為生產環境而設計的高性能的機器學習服務系統。它可以同時運行多個大規模的深度學習模型,支持模型生命周期管理、算法實驗,并且可以高效地利用GPU資源,從而使得TensorFlow訓練好的模型能夠更快捷更方便地投入到實際生產環境中”。除了TensorFlow以外,其他框架都缺少生產環境部署相關的考慮,而Google作為在實際產品中廣泛應用深度學習的巨頭可能也意識到了這個機會,因此開發了TensorFlow Serving這個部署服務的平臺。TensorFlow Serving可以說是一副王牌,它為TensorFlow成為行業標準做出了巨大的貢獻。

      2. Caffe

      官方網址:caffe.berkeleyvision.org

      GitHub:github.com/BVLC/caffe

      容易上手,網絡結構都是以配置文件的形式進行定義,不需要用代碼來設計網絡。

      訓練速度快,能夠訓練state-of-the-art的模型與大規模的數據。

      組件模塊化,可以方便地拓展到新的模型和學習任務上。

      Caffe的核心概念是Layer,每一個神經網絡的模塊都是一個Layer。Layer接收輸入數據,同時經過內部計算產生輸出數據。設計網絡結構時,只需要把各個Layer拼接在一起構成完整的網絡(通過寫protobuf配置文件定義)即可。比如卷積的Layer,其輸入就是圖片的全部像素點,內部進行的操作是各種像素值與Layer參數的convolution操作,最后輸出的是所有卷積核filter的結果。每一個Layer都需要定義兩種運算,一種是正向(forward)的運算,即從輸入數據計算輸出結果,也就是模型的預測過程;另一種是反向(backward)的運算,即從輸出端的gradient求解相對于輸入的gradient,也就是反向傳播算法,這部分就是模型的訓練過程。實現新Layer時,需要將正向和反向兩種計算過程的函數都加以實現,這部分計算需要用戶自己編寫C++或者CUDA(當需要在GPU中運行時)代碼,因此對普通用戶來說,Caffe還是非常難上手的。正如它的名字“Convolutional?Architecture?for?Fast?Feature?Embedding”所描述的,Caffe最初的設計目標只是針對圖像,而沒有考慮文本、語音或者時間序列的數據,因此Caffe對卷積神經網絡的支持非常好,但對時間序列RNN、LSTM等的支持則不是特別充分。同時,基于Layer的模式也對RNN不是非常友好,對于RNN結構的定義比較麻煩。對于模型結構非常復雜的情況,可能需要編寫冗長的配置文件才能設計好網絡,閱讀也比較費時費力,所以我們可能還需要使用網絡可視化的一些輔助工具,這里提供一個網站http://ethereon.github.io/netscope/#/editor,在這里大家可以直接可視化自己的網絡結構。

      Caffe的一大優勢是擁有大量的、已經訓練好的經典模型,在它的Model?Zoo(github.com/BVLC/caffe/wiki/Model-Zoo)中。因為其知名度較高,Caffe已廣泛應用于前沿的工業界和學術界,許多提供源碼的深度學習論文都是使用Caffe來實現其模型的。在計算機視覺領域Caffe的應用尤其多,可以用來進行人臉識別、圖片分類、位置檢測、目標追蹤等。雖然Caffe最早主要是面向學術圈和研究者的,但程序運行非常穩定,代碼質量較高,也深受工業界的歡迎,可用來處理對生產環境穩定性要求比較嚴格的應用,因此Caffe可以算是第一個主流的工業級深度學習框架。因為Caffe的底層是基于C++的,因此可以在各種硬件環境中進行編譯,并且其還具有良好的移植性,Caffe支持Linux、Mac和Windows系統,甚至還可以編譯部署到移動設備系統如Android和iOS上。與其他主流深度學習庫類似,Caffe也提供了Python語言接口pycaffe,在接觸新任務,設計新網絡時可以使用該Python接口簡化操作。不過,用戶通常還是要使用Protobuf配置文件定義神經網絡結構,再使用command line進行訓練或者預測。Caffe的配置文件是一個結構化類型的“.prototxt”文件,其中使用了許多順序連接的Layer來描述神經網絡結構。Caffe的二進制可執行程序會提取這些“.prototxt”文件并按其定義來訓練神經網絡。理論上,Caffe的用戶完全可以不用編寫代碼,只是定義網絡結構就可以完成模型訓練了。Caffe完成訓練之后,用戶可以把模型文件打包制作成簡單易用的接口,比如可以封裝成Python或MATLAB的API。不過在“.prototxt”文件內部設計網絡結構可能會比較受限,不如TensorFlow或者Keras那樣方便、自由。目前所受的限制主要是,Caffe的配置文件不能用編程的方式來調整超參數,如果想要做超參數訓練網絡模型,那么Caffe可能還需要花費大量的時間進行編程改寫。Caffe在GPU上訓練的性能表現良好(使用單塊GTX?1080訓練AlexNet時一天可以訓練上百萬張圖片),但是Caffe目前僅支持單機多GPU的訓練,并沒有原生支持分布式的訓練。比較幸運的是,Caffe擁有很多第三方開發者的支持,比如雅虎開源的CaffeOnSpark,可以借助Spark的分布式框架來實現Caffe的大規模分布式訓練。

      3. Theano

      官方網址:http://www.deeplearning.net/software/theano/?

      GitHub:github.com/Theano/Theano

      Theano誕生于2008年,由蒙特利爾大學Lisa?Lab團隊開發并維護,是一個高性能的符號計算及深度學習庫。因為其出現的時間較早,因此可以算是這類庫的始祖之一,也曾一度被認為是深度學習研究和應用的重要標準之一。Theano的核心是一個數學表達式的編譯器,專門為處理大規模神經網絡訓練的計算而設計。Theano可以將用戶定義的各種計算編譯為高效的底層代碼,并鏈接各種可以加速的庫,比如BLAS、CUDA等。Theano允許用戶定義、優化和評估包含多維數組的數學表達式,它支持將計算裝載到GPU上(Theano在GPU上的性能不錯,但是在CPU上卻性能較差)。與Scikit-learn一樣,Theano也很好地整合了NumPy,對GPU的透明使得Theano可以較為方便地進行神經網絡設計,而不必直接編寫CUDA代碼。Theano的主要優勢具體如下。

      集成NumPy,可以直接使用NumPy的ndarray,API接口學習成本較低。

      計算穩定性好,比如可以精準地計算輸出值很小的函數(像log(1+x))。

      動態地生成C或者CUDA代碼,用以編譯出高效的機器代碼。

      因為Theano在學術界非常流行,已經有很多人為它編寫出了高質量的文檔和教程,所以用戶可以方便地查找Theano的各種FAQ,比如如何保存模型、如何運行模型等問題。不過Theano大多被當作研究工具,而不是當作產品來使用。雖然Theano支持Linux、Mac和Windows,但是因為沒有底層C++的接口,因此模型的部署非常不方便,它依賴于各種Python庫,并且不支持各種移動設備,所以Theano幾乎沒有在工業生產環境下的應用。Theano目前主要應用于教學和科研上,Theano在調試時輸出的錯誤信息非常難以讓人看懂,因此調試Theano程序(DEBUG)時會非常痛苦。同時,Theano在生產環境中使用已經訓練好的模型進行預測時其性能比較差,因為預測通常使用服務器CPU(生產環境中的服務器一般沒有GPU,而且GPU預測單條樣本延遲高,反而不如CPU),但是Theano在CPU上的執行性能比較差。

      Theano在單GPU上的執行效率不錯,其性能與其他框架類似。但是運算時需要將用戶的Python代碼轉換成CUDA代碼,再編譯為二進制可執行文件,因此其編譯復雜模型的時間會非常久。此外,Theano在導入時也比較慢,而且一旦設定了選擇某塊GPU,就會無法切換到其他設備。目前,Theano在CUDA和cuDNN上并不支持多GPU,只在OpenCL和Theano自己的gpuarray庫上支持多GPU訓練,速度暫時還比不上CUDA的版本,并且Theano目前還沒有分布式的實現。不過,Theano在訓練簡單網絡(比如很淺的MLP)時其性能可能比TensorFlow好,因為所有代碼都是運行時編譯,不需要像TensorFlow那樣每次喂入(feed)?mini-batch數據時都得通過低效的Python循環來實現。

      4. Torch

      官方網址:http://torch.ch/?

      GitHub:github.com/torch/torch7

      Torch對自己的定位是LuaJIT上的一個高效的科學計算庫,其支持大量的機器學習算法,同時以GPU上的計算為優先。Torch的歷史悠久,但真正使其發揚光大的是在Facebook上開源了其深度學習的組件,此后包括Google、Twitter、NYU、IDIAP、Purdue等組織都大量使用Torch。Torch的設計理念是讓設計機器學習算法變得更加便捷,它包含了大量的機器學習、計算機視覺、信號處理、并行運算、圖像、視頻、音頻、網絡處理的庫。與Caffe類似,Torch擁有大量的已經訓練好的深度學習模型。它可以支持設計非常復雜的神經網絡的拓撲圖結構,再并行化到CPU和GPU上,在Torch上設計新的Layer是相對比較簡單的。它與TensorFlow一樣,使用了底層C++加上層腳本語言調用的方式,只不過Torch使用的是Lua。Lua的性能是非常優秀的(該語言經常被用來開發游戲),常見的代碼可以通過透明的JIT優化達到C語言性能的80%;在便利性上,Lua的語法簡單易讀,擁有漂亮和統一的結構,易于掌握,比寫C/C++簡潔很多,曾經,魔獸世界的插件也是使用此語言完成的;同時,Lua擁有一個非常直接的調用C程序的接口,可以簡便地使用大量的基于C的庫,由于底層核心是C語言編寫的,因此其可以方便地移植到各種環境中。Lua支持Linux、Mac,還支持各種嵌入式系統(iOS、Android、FPGA等),只不過運行時還是必須要有LuaJIT的環境,所以工業生產環境的使用相對較少,沒有Caffe和TensorFlow那么多。

      為什么不使用Python而是使用LuaJIT呢?官方給出了以下幾點理由。

      LuaJIT的通用計算性能遠勝于Python,而且可以直接在LuaJIT中操作C的pointers。Lua天然就是為了與C、C++配合而生。

      Torch的框架,包含Lua是非常合適的,Lua的解釋器編譯后只有僅僅幾百KB,而完全基于Python的程序對不同平臺、系統的移植性較差,所依賴的外部庫也較多。

      LuaJIT的FFI拓展接口非常易學,可以方便地鏈接其他庫到Torch中。Torch中還專門設計了N-Dimension?array?type的對象Tensor,Torch中的Tensor是一塊內存的視圖,同時一塊內存也可能會有許多視圖(Tensor)指向它,這樣的設計同時兼顧了性能(直接面向內存)和便利性。此外,Torch還提供了不少相關的庫,包括線性代數、卷積、傅里葉變換、繪圖和統計等。

      Torch的nn庫支持神經網絡、自編碼器、線性回歸、卷積網絡、循環神經網絡等,同時還支持定制的損失函數及梯度計算。因為Torch使用了LuaJIT,所以用戶在Lua中做數據預處理等操作時可以隨意使用循環等操作,而不需要像在Python中那樣擔心性能問題,也不需要學習Python中各種加速運算的庫。不過,Lua相比Python來說還不是那么主流,對大多數用戶來說還有一定的學習成本。Torch在CPU上的計算將使用OpenMP、SSE進行優化,GPU上使用CUDA、cutorch、cunn、cuDNN進行優化,同時還有cuda-convnet的wrapper。Torch擁有很多第三方的擴展可以支持RNN,使得Torch基本支持所有主流的網絡。與Caffe相同的是,Torch主要是基于Layer的連接來定義網絡的。Torch中新的Layer依然需要用戶自己實現,不過定義新Layer和定義網絡的方式很相似,非常簡便,不像Caffe那么麻煩,用戶需要使用C++或者CUDA定義新Layer。同時,Torch屬于命令式編程模式,不像Theano、TensorFlow屬于聲明性編程(計算圖是預定義的靜態的結構),所以用它來實現某些復雜的操作(比如beam?search)比Theano和TensorFlow方便很多。但是筆者一直沒有使用Torch作為筆者的主要開發工具,主要是因為現在找到合適的會寫好Lua的人實在是太少了,工業界還是需要各方面配合的。

      5. MXNet

      官方網址:mxnet.io

      GitHub:https://github.com/apache/incubator-mxnet

      caffe 深度學習

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Kubernetes生成kubeconfig
      下一篇:按這些知識點來全面快速復習Java面試題
      相關文章
      亚洲AV无码成人精品区狼人影院| 亚洲午夜久久久久久久久久| 亚洲av日韩av欧v在线天堂| 亚洲日韩区在线电影| 国内精品久久久久久久亚洲| 亚洲欧美国产国产综合一区| 亚洲性无码一区二区三区| 亚洲一区二区三区在线观看蜜桃 | 亚洲一区二区三区高清| 国产午夜亚洲不卡| 国产成人精品亚洲精品| 亚洲第一成人影院| 最新亚洲人成无码网www电影| 亚洲精品蜜夜内射| 亚洲精品无码久久久久APP| 亚洲中文字幕无码av永久| ww亚洲ww在线观看国产| 亚洲另类精品xxxx人妖| 亚洲欧洲自拍拍偷综合| 在线观看亚洲人成网站| 亚洲高清无在码在线无弹窗| 亚洲色图综合网站| 亚洲成aⅴ人片在线观| 久久久久久久亚洲Av无码| 亚洲第一精品在线视频| 亚洲国产一区国产亚洲| 91天堂素人精品系列全集亚洲 | 亚洲欧美日韩中文字幕一区二区三区| 亚洲综合偷自成人网第页色| 亚洲Av高清一区二区三区| 亚洲视频无码高清在线| 亚洲综合小说另类图片动图| 亚洲 欧洲 自拍 另类 校园| 亚洲乱理伦片在线观看中字| 久久精品国产亚洲AV天海翼 | 亚洲乱码一二三四区国产| 亚洲国产成人99精品激情在线| 亚洲av成人一区二区三区| 亚洲中文字幕无码av永久| 精品亚洲国产成人av| 亚洲精品无码日韩国产不卡?V|