Science is NOT a battle, it is a collaboration. We all build on each other's ideas. Science is an act of love, not war. Love for the beauty in the world that surr ounds us and love to share and build something together. That makes science a highly satisfying activity, emotionally speaking! html
——Yoshua Bengionode
人工智能的浪潮正席捲全球,諸多詞彙時刻縈繞在咱們的耳邊,如人工智能,機器學習,深度學習等。「人工智能」的概念早在1956年就被提出,顧名思義用計算機來構造複雜的,擁有與人類智慧一樣本質特性的機器。通過幾十年的發展,在2012年後,得益於數據量的上漲,運算力的提高和機器學習算法(深度學習)的出現,人工智能開始大爆發。但目前的科研工做都集中在弱人工智能部分,即讓機器具有觀察和感知能力,能夠必定程度的理解和推理,預期在該領域可以取得一些重大突破。電影裏的人工智能多半都是在描繪強人工智能,即讓機器得到自適應能力,解決一些以前還沒遇到過的問題,而這部分在目前的現實世界裏難以真正實現。python
弱人工智能有但願取得突破,是如何實現的,「智能」又從何而來呢?這主要歸功於一種實現人工智能的方法——機器學習。git
機器學習是一種實現人工智能的方法。github
機器學習最基本的作法,是使用算法來解析數據、從中學習,而後對真實世界中的事件作出決策和預測。與傳統的爲解決特定任務、硬編碼的軟件程序不一樣,機器學習是用大量的數據來「訓練」,經過各類算法從數據中學習如何完成任務。器學習直接來源於早期的人工智能領域,傳統的算法包括決策樹、聚類、貝葉斯分類、支持向量機、EM、Adaboost等等。從學習方法上來分,機器學習算法能夠分爲監督學習(如分類問題)、無監督學習(如聚類問題)、半監督學習、集成學習、深度學習和強化學習。算法
傳統的機器學習算法在指紋識別、基於Haar的人臉檢測、基於HoG特徵的物體檢測等領域的應用基本達到了商業化的要求或者特定場景的商業化水平,但每前進一步都異常艱難,直到深度學習算法的出現。編程
深度學習是一種實現機器學習的技術。windows
深度學習原本並非一種獨立的學習方法,其自己也會用到有監督和無監督的學習方法來訓練深度神經網絡。但因爲近幾年該領域發展迅猛,一些特有的學習手段相繼被提出(如殘差網絡),所以愈來愈多的人將其單獨看做一種學習的方法。後端
最初的深度學習是利用深度神經網絡來解決特徵表達的一種學習過程。深度神經網絡自己並非一個全新的概念,可大體理解爲包含多個隱含層的神經網絡結構。爲了提升深層神經網絡的訓練效果,人們對神經元的鏈接方法和激活函數等方面作出相應的調整。其實有很多想法早年間也曾有過,但因爲當時訓練數據量不足、計算能力落後,所以最終的效果不盡如人意。服務器
深度學習,做爲目前最熱的機器學習方法,但並不意味着是機器學習的終點。起碼目前存在如下問題:
1) 深度學習模型須要大量的訓練數據,才能展示出神奇的效果,但現實生活中每每會遇到小樣本問題,此時深度學習方法沒法入手,傳統的機器學習方法就能夠處理;
2) 有些領域,採用傳統的簡單的機器學習方法,能夠很好地解決了,不必非得用複雜的深度學習方法;
3) 深度學習的思想,來源於人腦的啓發,但毫不是人腦的模擬。
所以,機器學習框架和深度學習框架之間也是有區別的。本質上,機器學習框架涵蓋用於分類,迴歸,聚類,異常檢測和數據準備的各類學習方法,而且其能夠或能夠不包括神經網絡方法。深度學習或深度神經網絡(DNN)框架涵蓋具備許多隱藏層的各類神經網絡拓撲。這些層包括模式識別的多步驟過程。網絡中的層越多,能夠提取用於聚類和分類的特徵越複雜。咱們常見的Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度學習框架。 Scikit-learning和Spark MLlib是機器學習框架。 Theano跨越了這兩個類別。
本文接下來的篇幅將會重點介紹深度學習的三個框架caffe、tensorflow和keras,若是隻是須要使用傳統的機器學習基礎算法使用scikit-learning和spark MLlib則更爲合適。
神經網絡通常包括:訓練,測試兩大階段。訓練:就是把訓練數據(原料)和神經網絡模型:如AlexNet、RNN等「倒進」 神經網絡訓練框架例如cafffe等而後用 CPU或GPU(真火) 「提煉出」 模型參數(仙丹)的過程。測試:就是把測試數據用訓練好的模型(神經網絡模型 + 模型參數)跑一跑看看結果如何,做爲煉丹爐caffe,keras,tensorflow就是把煉製過程所涉及的概念作抽象,造成一套體系。
Caffe是一個清晰而高效的深度學習框架,也是一個被普遍使用的開源深度學習框架,在Tensorflow出現以前一直是深度學習領域Github star最多的項目。
Caffe的主要優點爲:容易上手,網絡結構都是以配置文件形式定義,不須要用代碼設計網絡。訓練速度快,組件模塊化,能夠方便的拓展到新的模型和學習任務上。可是Caffe最開始設計時的目標只針對於圖像,沒有考慮文本、語音或者時間序列的數據,所以Caffe對卷積神經網絡的支持很是好,可是對於時間序列RNN,LSTM等支持的不是特別充分。caffe工程的models文件夾中經常使用的網絡模型比較多,好比Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。
總的來說,由低到高依次把網絡中的數據抽象成Blob, 各層網絡抽象成 Layer ,整個網絡抽象成Net,網絡模型的求解方法 抽象成 Solver。
1) Blob 主要用來表示網絡中的數據,包括訓練數據,網絡各層自身的參數,網絡之間傳遞的數據都是經過 Blob 來實現的,同時 Blob 數據也支持在 CPU 與 GPU 上存儲,可以在二者之間作同步。
2) Layer 是對神經網絡中各類層的一個抽象,包括咱們熟知的卷積層和下采樣層,還有全鏈接層和各類激活函數層等等。同時每種 Layer 都實現了前向傳播和反向傳播,並經過 Blob 來傳遞數據。
3) Net 是對整個網絡的表示,由各類 Layer 先後鏈接組合而成,也是咱們所構建的網絡模型。
4) Solver 定義了針對 Net 網絡模型的求解方法,記錄網絡的訓練過程,保存網絡模型參數,中斷並恢復網絡的訓練過程。自定義 Solver 可以實現不一樣的網絡求解方式。
Caffe 須要預先安裝比較多的依賴項,CUDA,snappy,leveldb,gflags,glog,szip,lmdb,OpenCV,hdf5,BLAS,boost等等
Caffe官網:http://caffe.berkeleyvision.org/
Caffe Github : https://github.com/BVLC/caffe
Caffe 安裝教程:http://caffe.berkeleyvision.org/installation.html http://blog.csdn.net/yhaolpz/article/details/71375762
Caffe 安裝分爲CPU和GPU版本,GPU版本須要顯卡支持以及安裝CUDA。
Caffe依賴 ProtoBuffer Boost GFLAGS GLOG BLAS HDF5 OpenCV LMDB LEVELDB Snappy
表 3-1 caffe搭建神經網絡流程
使用流程 |
操做說明 |
一、數據格式處理 |
將數據處理成caffe支持格式,具體包括:LEVELDB,LMDB,內存數據,hdfs數據,圖像數據,windows,dummy等。 |
二、編寫網絡結構文件 |
定義網絡結構,如當前網絡包括哪幾層,每層做用是什麼,使用caffe過程當中最麻煩的一個操做步驟。具體編寫格式可參考caffe框架自帶自動識別手寫體樣例:caffe/examples/mnist/lenet_train_test.prototxt。 |
三、編寫網絡求解文件 |
定義了網絡模型訓練過程當中須要設置的參數,好比學習率,權重衰減係數,迭代次數,使用GPU仍是CP等,通常命名方式爲xx_solver.prototxt,可參考:caffe/examples/mnist/lenet_solver.prototxt。 |
四、訓練 |
基於命令行的訓練,如:caffe train -solver examples/mnist/lenet_solver.prototxt |
五、測試 |
caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100 |
在上述流程中,步驟2是核心操做,也是caffe使用最讓人頭痛的地方,keras則對該部分作了更高層的抽象,讓使用者可以快速編寫出本身想要實現的模型。
TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖中的節點表示數學運算,而圖邊表示在它們之間傳遞的多維數據陣列(又稱張量)。靈活的體系結構容許你使用單個API將計算部署到桌面、服務器或移動設備中的一個或多個CPU或GPU。Tensorflow涉及相關概念解釋以下:
1)符號計算
符號計算首先定義各類變量,而後創建一個「計算圖」,計算圖規定了各個變量之間的計算關係。 符號計算也叫數據流圖,其過程以下圖3-1所示,數據是按圖中黑色帶箭頭的線流動的。
圖 3-1 數據流圖示例
數據流圖用「結點」(nodes)和「線」(edges)的有向圖來描述數學計算。
① 「節點」 通常用來表示施加的數學操做,但也能夠表示數據輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點。
② 「線」表示「節點」之間的輸入/輸出關係。
③ 在線上流動的多維數據陣列被稱做「張量」。
2)張量
張量(tensor),能夠看做是向量、矩陣的天然推廣,用來表示普遍的數據類型。張量的階數也叫維度。
0階張量,即標量,是一個數。
1階張量,即向量,一組有序排列的數
2階張量,即矩陣,一組向量有序的排列起來
3階張量,即立方體,一組矩陣上下排列起來
4階張量......
依次類推
3)數據格式(data_format)
目前主要有兩種方式來表示張量:
① th模式或channels_first模式,Theano和caffe使用此模式。
② tf模式或channels_last模式,TensorFlow使用此模式。
下面舉例說明兩種模式的區別:
對於100張RGB3通道的16×32(高爲16寬爲32)彩色圖,
th表示方式:(100,3,16,32)
tf表示方式:(100,16,32,3)
惟一的區別就是表示通道個數3的位置不同。
Tensorflow/core目錄包含了TF核心模塊代碼,具體結構如圖3-2所示:
圖 3-2 tensorflow代碼模塊結構
一、官網下載naconda安裝:https://www.anaconda.com/download/
二、依次在Anaconda Prompt控制檯,按如下5個步驟輸入指令進行安裝:
1) 安裝py3+ cmd : conda create -n py3.6 python=3.6 anaconda
2) 激活虛擬環境 cmd : activate py3.6
3) 激活TSF預安裝cmd:
conda create -n tensorflow python=3.6
activate tensorflow
4) 安裝TSF:
pip install --ignore-installed --upgrade tensorflow
pip install --ignore-installed --upgrade tensorflow-gpu
5) 退出虛擬環境cmd :deactivate py3.6
使用Tensorflow搭建神經網絡主要包含如下6個步驟:
1) 定義添加神經層的函數
2) 準備訓練的數據
3) 定義節點準備接收數據
4) 定義神經層:隱藏層和預測層
5) 定義 loss 表達式
6) 選擇 optimizer 使 loss 達到最小
7) 對全部變量進行初始化,經過 sess.run optimizer,迭代屢次進行學習。
Tensorflow 構建神經網絡識別手寫數字,具體代碼以下所示:
import tensorflow as tf import numpy as np # 添加層 def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer Weights = tf.Variable(tf.random_normal([in_size, out_size])) biases = tf.Variable(tf.zeros([1, out_size]) + 0.1) Wx_plus_b = tf.matmul(inputs, Weights) + biases if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) return outputs # 1.訓練的數據 # Make up some real data x_data = np.linspace(-1,1,300)[:, np.newaxis] noise = np.random.normal(0, 0.05, x_data.shape) y_data = np.square(x_data) - 0.5 + noise # 2.定義節點準備接收數據 # define placeholder for inputs to network xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) # 3.定義神經層:隱藏層和預測層 # add hidden layer 輸入值是 xs,在隱藏層有 10 個神經元 l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu) # add output layer 輸入值是隱藏層 l1,在預測層輸出 1 個結果 prediction = add_layer(l1, 10, 1, activation_function=None) # 4.定義 loss 表達式 # the error between prediciton and real data loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1])) # 5.選擇 optimizer 使 loss 達到最小 # 這一行定義了用什麼方式去減小 loss,學習率是 0.1 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # important step 對全部變量進行初始化 init = tf.initialize_all_variables() sess = tf.Session() # 上面定義的都沒有運算,直到 sess.run 纔會開始運算 sess.run(init) # 迭代 1000 次學習,sess.run optimizer for i in range(1000): # training train_step 和 loss 都是由 placeholder 定義的運算,因此這裏要用 feed 傳入參數 sess.run(train_step, feed_dict={xs: x_data, ys: y_data}) if i % 50 == 0: # to see the step improvement print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
Keras由純Python編寫而成並基於Tensorflow、Theano以及CNTK後端,至關於Tensorflow、Theano、 CNTK的上層接口,號稱10行代碼搭建神經網絡,具備操做簡單、上手容易、文檔資料豐富、環境配置容易等優勢,簡化了神經網絡構建代碼編寫的難度。目前封裝有全鏈接網絡、卷積神經網絡、RNN和LSTM等算法。
Keras有兩種類型的模型,序貫模型(Sequential)和函數式模型(Model),函數式模型應用更爲普遍,序貫模型是函數式模型的一種特殊狀況。
1) 序貫模型(Sequential):單輸入單輸出,一條路通到底,層與層之間只有相鄰關係,沒有跨層鏈接。這種模型編譯速度快,操做也比較簡單
2) 函數式模型(Model):多輸入多輸出,層與層之間任意鏈接。這種模型編譯速度慢。
Keras主要由5大模塊構成,模塊之間的關係及每一個模塊的功能如圖3-3所示:
圖 3-3 keras模塊結構圖
Keras的安裝方式有如下三個步驟:
1) 安裝anaconda(python)
2) 用於科學計算的python發行版,支持Linux、Mac、Windows系統,提供了包管理與環境管理的功能,能夠很方便的解決多版本python並存、切換以及各類第三方包安裝問題。
3) 利用pip或者conda安裝numpy、keras、 pandas、tensorflow等庫
下載地址: https://www.anaconda.com/what-is-anaconda/
使用keras搭建一個神經網絡,包括5個步驟,分別爲模型選擇、構建網絡層、編譯、訓練和預測。每一個步驟操做過程當中使用到的keras模塊如圖3-4所示。
圖 3-4 使用keras搭建神經網絡步驟
Kears構建神經網絡識別手寫數字,具體代碼以下所示:
from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD from keras.datasets import mnist import numpy ''' 第一步:選擇模型 ''' model = Sequential() ''' 第二步:構建網絡層 ''' model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784 model.add(Activation('tanh')) # 激活函數是tanh model.add(Dropout(0.5)) # 採用50%的dropout model.add(Dense(500)) # 隱藏層節點500個 model.add(Activation('tanh')) model.add(Dropout(0.5)) model.add(Dense(10)) # 輸出結果是10個類別,因此維度是10 model.add(Activation('softmax')) # 最後一層用softmax做爲激活函數 ''' 第三步:編譯 ''' sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優化函數,設定學習率(lr)等參數 model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵做爲loss函數 ''' 第四步:訓練 .fit的一些參數 batch_size:對總的樣本數進行分組,每組包含的樣本數量 epochs :訓練次數 shuffle:是否把數據隨機打亂以後再進行訓練 validation_split:拿出百分之多少用來作交叉驗證 verbose:屏顯模式 0:不輸出 1:輸出進度 2:輸出每次的訓練結果 ''' (X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數據(第一次須要聯網) # 因爲mist的輸入數據維度是(num, 28, 28),這裏須要把後面的維度直接拼起來變成784維 X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) Y_test = (numpy.arange(10) == y_test[:, None]).astype(int) model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3) model.evaluate(X_test, Y_test, batch_size=200, verbose=0) ''' 第五步:輸出 ''' print("test set") scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0) print("") print("The test loss is %f" % scores) result = model.predict(X_test,batch_size=200,verbose=0) result_max = numpy.argmax(result, axis = 1) test_max = numpy.argmax(Y_test, axis = 1) result_bool = numpy.equal(result_max, test_max) true_num = numpy.sum(result_bool) print("") print("The accuracy of the model is %f" % (true_num/len(result_bool)))
表 3-2 深度學習框架對比
對比維度 |
Caffe |
Tensorflow |
Kears |
上手難度 |
一、 不用不寫代碼,只需在.prototxt文件中定義網絡結構就能夠完成模型訓練。 二、 安裝過程複雜,且在.prototxt 文件內部設計網絡節構比較受限,沒有在 Python 中設計網絡結構方便、自由。配置文件不能用編程的方式調整超參數,對交叉驗證、超參數Grid Search 等操做沒法很方便的支持。 |
一、 安裝簡單,教學資源豐富,根據樣例能快速搭建出基礎模型。 二、 有必定的使用門檻。無論是編程範式,仍是數學統計基礎,都爲非機器學習與數據科學背景的夥伴們帶來必定的上手難度。另外,是一個相對低層的框架,使用時須要編寫大量的代碼,從新發明輪子。 |
一、安裝簡單,它旨在讓用戶進行最快速的原型實驗,讓想法變爲結果的這個過程最短,很是適合最前沿的研究。 二、API使用方便,用戶只須要將高級的模塊拼在一塊兒,就能夠設計神經網絡,下降了編程和閱讀別人代碼時的理解開銷 |
框架維護 |
在 TensorFlow 出現以前一直是深度學習領域 GitHub star 最多的項目,前由伯克利視覺學中心(Berkeley Vision and Learning Center,BVLC)進行維護。 |
被定義爲「最流行」、「最被承認」的開源深度學習框架, 擁有產品級的高質量代碼,有 Google 強大的開發、維護能力的加持,總體架構設計也很是優秀。 |
開發主要由谷歌支持, API以「tf.keras"的形式打包在TensorFlow中。微軟維護着Keras的CNTK後端。亞馬遜AWS正在開發MXNet支持。其餘提供支持的公司包括NVIDIA、優步、蘋果(經過CoreML) |
支持語言 |
C++/Cuda |
C++ python (Go,Java,Lua,Javascript,或者是R) |
Python |
封裝算法 |
一、對卷積神經網絡的支持很是好,擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其餘 state-of-the-art (ResNet等)的模型,收藏在它的 Model Zoo。 二、對時間序列 RNN、LSTM 等支持得不是特別充分 |
一、支持CNN與RNN, 還支持深度強化學習乃至其餘計算密集的科學計算(如偏微分方程求解等)。 二、計算圖必須構建爲靜態圖,這讓不少計算變得難以實現,尤爲是序列預測中常用的 beam search。 |
一、專精於深度學習,支持卷積網絡和循環網絡,支持級聯的模型或任意的圖結構的模型,從 CPU 上計算切換到 GPU 加速無須任何代碼的改動。 二、沒有加強學習工具箱,本身修改實現很麻煩。封裝得過高級,訓練細節不能修改、penalty細節很難修改。 |
模型部署 |
一、程序運行很是穩定,代碼質量比較高,很適合對穩定性要求嚴格的生產環境,第一個主流的工業級深度學習框架。Caffe 的底層基於 C++,能夠在各類硬件環境編譯並具備良好的移植性,支持 Linux、Mac 和 Windows 系統,也能夠編譯部署到移動設備系統如 Android 和 iOS 上。 |
一、爲生產環境設計的高性能的機器學習服務系統,能夠同時運行多個大規模深度學習模型,支持模型生命週期管理、算法實驗,並能夠高效地利用 GPU 資源,讓訓練好的模型更快捷方便地投入到實際生產環境。靈活的移植性,能夠將同一份代碼幾乎不通過修改就輕鬆地部署到有任意數量 CPU 或 GPU 的 PC、服務器或者移動設備上。 |
一、使用TensorFlow、CNTK、Theano做爲後端,簡化了編程的複雜度,節約了嘗試新網絡結構的時間。模型越複雜,收益越大,尤爲是在高度依賴權值共享、多模型組合、多任務學習等模型上,表現得很是突出。 |
性能 |
目前僅支持單機多 GPU 的訓練,不支持分佈式的訓練。 |
一、 支持分佈式計算,使 GPU 集羣乃至 TPU 集羣並行計算,共同訓練出一個模型。 二、 對不一樣設備間的通訊優化得不是很好,分佈式性能尚未達到最優。 |
沒法直接使用多 GPU,對大規模的數據處理速度沒有其餘支持多 GPU 和分佈式的框架快。用TensorFLow backend時速度比純TensorFLow 下要慢不少。 |
如表3-2對比維度所示,對於剛入門機器學習的新手而已,keras無疑是最好的選擇,可以快速搭建模型驗證想法。隨着對機型學習的理解逐步加深,業務模型愈來愈複雜時,能夠根據實際須要轉到Tensorflow或Caffe。
深度學習的研究在持續進行中,一直與其它經典機器學習算法並存,各種深度學習框架也是遍地開花,各有偏向,優劣各異,具體用哪一種要根據應用場景靈活選擇。正如本文導語所言,科學不是戰爭而是合做。任何學科的發展歷來都不是一條路走到黑,而是同行之間互相學習、互相借鑑、博採衆長、相得益彰,站在巨人的肩膀上不斷前行。對機器學習和深度學習的研究也是同樣,你死我活那是邪教,開放包容纔是正道!
最後,文章內容多摘自網上廣大網友的貢獻,如所寫內容涉及他人著做且未進行參考引用,那必定是我遺漏了,很是抱歉,還請及時聯繫我進行修正,萬分感謝!。
[1]. https://www.zhihu.com/question/57770020/answer/249708509 人工智能、機器學習和深度學習的區別?
[2] . http://km.oa.com/group/25254/articles/show/325228?kmref=search&from_page=1&no=1 從入門到吃雞--基於Caffe 框架AI圖像識別自動化
[3]. http://blog.luoyetx.com/2015/10/reading-caffe-1/
[4]. https://zhuanlan.zhihu.com/p/24087905 Caffe入門與實踐-簡介
[5]. https://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/ keras官網
[6]. http://biog.csdn.net/sinat_26917383
[7]. http://www.cnblogs.com/lc1217/p/7132364.html 深度學習:Keras入門(一)之基礎篇
[8]. https://www.jianshu.com/p/e112012a4b2d 一文學會用 Tensorflow 搭建神經網絡
[9]. https://www.zhihu.com/question/42061396/answer/93827994 深度學習會不會淘汰掉其餘全部機器學習算法?
[10]. https://www.leiphone.com/news/201702/T5e31Y2ZpeG1ZtaN.html TensorFlow和Caffe、MXNet、Keras等其餘深度學習框架的對比
[11]. https://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html Caffe、TensorFlow、MXnet三個開源庫對比
[12]. https://zhuanlan.zhihu.com/p/24687814 對比深度學習十大框架:TensorFlow最流行但並非最好
[13]. https://www.leiphone.com/news/201704/8RWdnz9dQ0tyoexF.html 萬事開頭難!入門TensorFlow,這9個問題TF Boys 必需要搞清楚