一、命令式編程(imperative)和符號式編程(symblic)
命令式:
import numpy as np a = np.ones(10) b = np.ones(10) * 2 c = b * a d = c + 1
當程序執行到 c=b∗a時,代碼開始做對應的數值計算. 符號式編程於此不同,需要先給出一個函數的定義(可能十分復雜).當我們定義這個函數時,並不會做真正的數值計算.這類函數的定義中使用數值占位符.當給定真正的輸入后,才會對這個函數進行編譯計算.
符號式編程:
上面的例子用符號式重新寫:
A = Variable('A')
B = Variable('B') C = B * A D = C + Constant(1) # compiles the function f = compile(D) d = f(A=np.ones(10), B=np.ones(10)*2)
上述代碼中,語句C=B∗A並不會觸發真正的數值計算,但會生成一個計算圖(也稱符號式編程)描述這個計算.

大部分符號式編程都顯性或隱性的包含一個編譯的步驟,把計算轉換成可以調用的函數.上面的例子中,數值計算僅僅在代碼最后一行進行.其一個重要特點是其明確有構建計算圖和生成可執行代碼兩個步驟.對於神經網絡,一般會用一個就算圖描述整個模型.
命令式編程更加靈活
用python調用imperative-style庫十分簡單,編寫方式和普通的python代碼一樣,在合適的位置調用庫的代碼實現加速.如果用python調用symbolic-style庫,代碼結構將出現一些變化,比如iteration可能無法使用.嘗試把下面的例子轉換成symbolic-style
a = 2 b = a + 1 d = np.zeros(10) for i in range(d): d += np.zeros(10)
如果symblic-style API不支持for循環,轉換就沒那個直接.不能用python的編碼思路調用symblic-style庫.需要利用symblic API定義的domain-specific-language(DSL).深度學習框架會提供功能強大的DSL,把神經網絡轉化成可被調用的計算圖.
感覺上imperative program更加符合習慣,使用更加簡單.例如可以在任何位置打印出變量的值,輕松使用符合習慣的流程控制語句和循環語句.
符號式編程更加有效
既然imperative pragrams更加靈活,和計算機原生語言更加貼合,那么為什么很多深度學習框架使用symbolic風格? 最主要的原因式效率,內存效率和計算效率都很高.比如下面的例子
import numpy as np a = np.ones(10) b = np.ones(10) * 2 c = b * a d = c + 1

1、對於imperative programs中,需要在每一行上都分配必要的內存
2、symbolic programs限制更多.因為只需要d,構建計算圖后,一些中間量,比如c的值將無法看到.
另外:
symbolic program還可以通過operation folding優化計算.在上述的例子中,乘法和加法可以展成一個操作,如下圖所示.

如果在GPU上運算,計算圖只需要一個kernel,節省了一個kernel.在很多優化庫,比如caffe/CXXNet,人工編碼進行此類優化操作. operation folding可以提高計算效率.
imperative program中不能自動operation folding,因為不知道中間變量是否會被訪問到. symbolic program中可以做operation folding,因為獲得了完整的計算圖,而且明確哪些量以后會被訪問,哪些量以后都不會被訪問.
二、深度學習框架
(參考https://blog.csdn.net/yeler082/article/details/78755095)
1、說明
深度學習框架也就像Caffe、tensorflow這些是深度學習的工具,簡單來說就是庫,編程時需要import caffe、import tensorflow。作一個簡單的比喻,一套深度學習框架就是這個品牌的一套積木,各個組件就是某個模型或算法的一部分,你可以自己設計如何使用積木去堆砌符合你數據集的積木。好處是你不必重復造輪子,模型也就是積木,是給你的,你可以直接組裝,但不同的組裝方式,也就是不同的數據集則取決於你。
2、 應用優勢
深度學習框架的出現降低了入門的門檻,你不需要從復雜的神經網絡開始編代碼,你可以依據需要,使用已有的模型,模型的參數你自己訓練得到,你也可以在已有模型的基礎上增加自己的layer,或者是在頂端選擇自己需要的分類器和優化算法(比如常用的梯度下降法)。
當然也正因如此,沒有什么框架是完美的,就像一套積木里可能沒有你需要的那一種積木,所以不同的框架適用的領域不完全一致。 總的來說深度學習框架提供了一些列的深度學習的組件(對於通用的算法,里面會有實現),當需要使用新的算法的時候就需要用戶自己去定義,然后調用深度學習框架的函數接口使用用戶自定義的新算法.
3、 關於組件
大部分深度學習框架都包含以下五個核心組件:
1. 張量(Tensor) ——數據的表現形式
2. 基於張量的各種操作 ——各種操作
3. 計算圖(Computation Graph) ——操作的集合和優化
4. 自動微分(Automatic Differentiation)工具
5. BLAS、cuBLAS、cuDNN等拓展包——加速訓練
4、詳細介紹部分組件
計算圖
隨着技術的不斷演進,加上腳本語言和低級語言各自不同的特點(概括地說,腳本語言建模方便但執行緩慢,低級語言則正好相反),因此業界逐漸形成了這樣的一種開發框架:前端用Python等腳本語言建模,后端用C++等低級語言執行。而這里,在前端和后端之間起到關鍵耦合作用的就是計算圖。
BLAS、cuBLAS、cuDNN等拓展包——提高運算效率
- 第一種方法是模擬傳統的編譯器。就好像傳統編譯器會把高級語言編譯成特定平台的匯編語言實現高效運行一樣,這種方法將高級語言轉換為C語言,然后在C語言基礎上編譯、執行。為了實現這種轉換,每一種張量操作的實現代碼都會預先加入C語言的轉換部分,然后由編譯器在編譯階段將這些由C語言實現的張量操作綜合在一起。目前pyCUDA和Cython等編譯器都已經實現了這一功能。
- 第二種方法就是前文提到的,利用腳本語言實現前端建模,用低級語言如C++實現后端運行,這意味着高級語言和低級語言之間的交互都發生在框架內部,因此每次的后端變動都不需要修改前端,也不需要完整編譯(只需要通過修改編譯參數進行部分編譯),因此整體速度也就更快。
- 除此之外,由於低級語言的最優化編程難度很高,而且大部分的基礎操作其實也都有公開的最優解決方案,因此另一個顯著的加速手段就是利用現成的擴展包。
三、什么是TensorFlow
1、 關於TensorFlow
https://baijiahao.baidu.com/s?id=1587378061168798378&wfr=spider&for=pc
2、關於Python,Pycharm,Anaconda(anaconda可以看做Python的一個集成安裝,安裝它后就默認安裝了python、IPython、集成開發環境Spyder和眾多的包和模塊,非常方便。)
https://blog.csdn.net/haha555hahha/article/details/76736604
https://blog.csdn.net/weixin_37683002/article/details/82287248
3、關於TensorFlow在windows上安裝與基於MINST數據集的簡單示例(MINST是一個大量手寫體圖片組成的數據庫,用於計算機視覺的入門)
https://blog.csdn.net/darlingwood2013/article/details/60322258/
概念:TensorFlow 是世界上最受歡迎的開源機器學習框架,能夠讓你直接解決各種機器學習任務,提供了各種API。
用途和優勢:可以用其構建各種深度學習模型,例如反向傳播的大型神經網絡模型,模型表現為操作圖的形式,可以讓這部分圖在這里運行,讓另一部分圖分布式運行在不同的機器群上,甚至可以讓這部分注重數學的圖在GPU上運行,與此同時,數據輸入部分的代碼在CPU上運行。
使用:最開始只可以用python來使用TensorFlow,現在已經可以支持java,C++等多種平台。可以安裝在windows、mac、linux不同的操作系統。
擴展:還有一個項目是稱為TensorBoard的工具 ,這是包中的可視化工具之一 。
