久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Tensorflow自學之前的bigpicture

前言

目前,深度學習在計算機科學各領域的應用越來越多,各種新技術層出不窮,比如圖像識別、圖形定位與檢測、語音識別這一系列的技術。這個領域,對于初入技術行業的同學來講,吸引力十分足夠:特別是在整個領域工資居高不下的時候。

說到深度學習,就不能不提一下開源框架tensorflow。不僅是因為這個框架最火、使用率最高,也是因為這個框架是非常適合初學者接觸、學習的。

我們會講到一些深度學習的基礎概念,包括計算圖,graph 與 session,基礎數據結構,Variable,placeholder 與 feed_dict 以及使用它們時需要注意的點。最后我們會根據教程里提到的內容,通過一個實戰案例讓大家對整個tensorflow有一個正確、可用的理解。

1

tensorflow是什么?

tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。

下圖是 query 詞頻時序圖,從中可以看出 tensorflow 的火爆程度。

Tensorflow自學之前的bigpicture

2

why tensorflow?

Tensorflow有很多優點,包括具有Python接口、平臺兼容性極佳、部署環境要求沒有其他框架那么嚴格。同時,它自己還有可視化工具,可以方便的進行實驗管理。

對于新人而言,它的最大優點可能是擁有一個包含了極多開發者的社區:這讓你遇到的問題大部分都可以解決而不用自己鉆研。

同時,你還可以借鑒諸多優秀項目——因為已經有很多優秀項目已經在開發了。

3

易用的tensorflow工具

如果不想去研究 tensorflow 繁雜的API,僅想快速的實現些什么,可以使用其他高層工具。比如 tf.contrib.learn,tf.contrib.slim,Keras 等,它們都提供了高層封裝。

4

tensorflow安裝

目前 tensorflow 的安裝已經十分方便,有興趣可以參考官方文檔。

tensorflow基礎

實際上編寫tensorflow可以總結為兩步.

(1)組裝一個graph;

(2)使用session去執行graph中的operation。

因此我們從 graph 與 session 說起。

1

graph與session

(1)計算圖

Tensorflow 是基于計算圖的框架,因此理解 graph 與 session 顯得尤為重要。不過在講解 graph 與 session 之前首先介紹下什么是計算圖。假設我們有這樣一個需要計算的表達式。該表達式包括了兩個加法與一個乘法,為了更好講述引入中間變量c與d。由此該表達式可以表示為:

Tensorflow自學之前的bigpicture

當需要計算e時就需要計算c與d,而計算c就需要計算a與b,計算d需要計算b。這樣就形成了依賴關系。這種有向無環圖就叫做計算圖,因為對于圖中的每一個節點其微分都很容易得出,因此應用鏈式法則求得一個復雜的表達式的導數就成為可能,所以它會應用在類似tensorflow這種需要應用反向傳播算法的框架中。

(2)概念說明

下面是 graph , session , operation , tensor 四個概念的簡介。

Tensor:類型化的多維數組,圖的邊;

Operation:執行計算的單元,圖的節點;

Graph:一張有邊與點的圖,其表示了需要進行計算的任務;

Session:稱之為會話的上下文,用于執行圖。

Graph作為一張圖,僅展示所有單元及數組的流向,并不會對其進行計算,上下文則是執行單元,根據Graph的流程定義為各個計算分配資源,計算節點,從而得出計算結果。Operation作為圖計算的點,可以使任何形式的數學運算,包括各類算法,通過零個或以上的輸入,來得到零個或以上的輸出。Tensor就是它的輸出和輸出,可以做出多種邊是。幾乎所有的tensor在進入下一個節點后都不在保存,除非是Variables指向的。

(3)舉例

下面首先定義一個圖(其實沒有必要,tensorflow會默認定義一個),并做一些計算。

Tensorflow自學之前的bigpicture

這段代碼,首先會載入tensorflow,定義一個graph類,并在這張圖上定義了foo與bar的兩個變量,最后對這個值求和,并初始化所有變量。其中,Variable是定義變量并賦予初值。讓我們看下result(最后1行代碼)。后面是輸出,可以看到并沒有輸出實際的結果,由此可見在定義圖的時候其實沒有進行任何實際的計算。

Tensorflow自學之前的bigpicture

下面定義一個session,并進行真正的計算。

Tensorflow自學之前的bigpicture

這段代碼中,定義了session,并在session中執行了真正的初始化,并且求得result的值并打印出來。可以看到,在session中產生了真正的計算,得出值為5。

下圖是該graph在tensorboard中的顯示。這張圖整體是一個graph,其中foo,bar,add這些節點都是operation,而foo和bar與add連接邊的就是tensor。當session運行result時,實際就是求得add這個operation流出的tensor值,那么add的所有上游節點都會進行計算,如果圖中有非add上游節點(本例中沒有)那么該節點將不會進行計算,這也是圖計算的優勢之一。

Tensorflow自學之前的bigpicture

2

數據結構

Tensorflow的數據結構有著rank,shape,data types的概念,下面來分別講解。

(1)rank

Rank一般是指數據的維度,其與線性代數中的rank不是一個概念。其常用rank舉例如下。

Tensorflow自學之前的bigpicture

(2)shape

Shape指tensor每個維度數據的個數,可以用Python的list/tuple表示。下圖表示了rank,shape的關系。

Tensorflow自學之前的bigpicture

(3)data type

Data type,是指單個數據的類型。常用DT_FLOAT,也就是32位的浮點數。下圖表示了所有的types。

Tensorflow自學之前的bigpicture

3

Variables

(1)介紹

當訓練模型時,需要使用Variables保存與更新參數。Variables會保存在內存當中,所有tensor一旦擁有Variables的指向就不會在session中丟失。其必須明確的初始化而且可以通過Saver保存到磁盤上。Variables可以通過Variables初始化。

Tensorflow自學之前的bigpicture

其中,tf.random_normal是隨機生成一個正態分布的tensor,其shape是第一個參數,stddev是其標準差。tf.zeros是生成一個全零的tensor。之后將這個tensor的值賦值給Variable。

(2)初始化

實際在其初始化過程中做了很多的操作,比如初始化空間,賦初值(等價于tf.assign),并把Variable添加到graph中等操作。注意在計算前需要初始化所有的Variable。一般會在定義graph時定義global_variables_initializer,其會在session運算時初始化所有變量。直接調用global_variables_initializer會初始化所有的Variable,如果僅想初始化部分Variable可以調用tf.variables_initializer。

Tensorflow自學之前的bigpicture

Variables可以通過eval顯示其值,也可以通過assign進行賦值。Variables支持很多數學運算,具體可以參照官方文檔。

(3)Variables與constant的區別

值得注意的是Variables與constant的區別。Constant一般是常量,可以被賦值給Variables,constant保存在graph中,如果graph重復載入那么constant也會重復載入,其非常浪費資源,如非必要盡量不使用其保存大量數據。而Variables在每個session中都是單獨保存的,甚至可以單獨存在一個參數服務器上。可以通過代碼觀察到constant實際是保存在graph中,具體如下。

Tensorflow自學之前的bigpicture

這里第二行是打印出圖的定義,其輸出如下:

Tensorflow自學之前的bigpicture

(4)命名

另外一個值得注意的地方是盡量每一個變量都明確的命名,這樣易于管理命令空間,而且在導入模型的時候不會造成不同模型之間的命名沖突,這樣就可以在一張graph中容納很多個模型。

4

placeholders與feed_dict

當我們定義一張graph時,有時候并不知道需要計算的值,比如模型的輸入數據,其只有在訓練與預測時才會有值。這時就需要placeholder與feed_dict的幫助。

定義一個placeholder,可以使用tf.placeholder(dtype,shape=None,name=None)函數。

Tensorflow自學之前的bigpicture

在上面的代碼中,會拋出錯誤(InvalidArgumentError),因為計算result需要foo的具體值,而在代碼中并沒有給出。這時候需要將實際值賦給foo。最后一行修改如下(其中最后的dict就是一個feed_dict,一般會使用Python讀入一些值后傳入,當使用minbatch的情況下,每次輸入的值都不同):

Tensorflow自學之前的bigpicture

mnist識別實例

介紹了一些tensorflow基礎后,我們用一個完整的例子將這些串起來。首先,需要下載數據集,mnist數據可以在Yann LeCun's website下載到,也可以通過如下兩行代碼得到。

Tensorflow自學之前的bigpicture

該數據集中一共有55000個樣本,其中50000用于訓練,5000用于驗證。每個樣本分為X與y兩部分,其中X如下圖所示,是28*28的圖像,在使用時需要拉伸成784維的向量。

Tensorflow自學之前的bigpicture整體的X可以表示為:

Tensorflow自學之前的bigpicturey為X真實的類別,其數據可以看做如下圖的形式。因此,問題可以看成一個10分類的問題:

Tensorflow自學之前的bigpicture

而本次演示所使用的模型為邏輯回歸,其可以表示為:

Tensorflow自學之前的bigpicture

用圖形可以表示為下圖,具體原理這里不再闡述。

那么 let’s coding!

當使用tensorflow進行graph構建時,大體可以分為五部分:

1.為輸入X輸出y定義placeholder;

2.定義權重W;

3.定義模型結構;

4.定義損失函數;

5.定義優化算法。

首先導入需要的包,定義X與y的placeholder以及 W,b 的 Variables。其中None表示任意維度,一般是min-batch的 batch size。而 W 定義是 shape為784,10,rank為2的Variable,b是shape為10,rank為1的Variable。

Tensorflow自學之前的bigpicture

之后是定義模型。x與W矩陣乘法后與b求和,經過softmax得到y。

Tensorflow自學之前的bigpicture

求邏輯回歸的損失函數,這里使用了cross entropy,其公式可以表示為:

Tensorflow自學之前的bigpicture

這里的 cross entropy 取了均值。定義了學習步長為0.5,使用了梯度下降算法(GradientDescentOptimizer)最小化損失函數。不要忘記初始化?Variables。

Tensorflow自學之前的bigpicture

最后,我們的 graph 至此定義完畢,下面就可以進行真正的計算,包括初始化變量,輸入數據,并計算損失函數與利用優化算法更新參數。

Tensorflow自學之前的bigpicture

其中,迭代了1000次,每次輸入了100個樣本。mnist.train.next_batch 就是生成下一個 batch 的數據,這里知道它在干什么就可以。那么訓練結果如何呢,需要進行評估。這里使用單純的正確率,正確率是用取最大值索引是否相等的方式,因為正確的 label 最大值為1,而預測的 label 最大值為最大概率。

Tensorflow自學之前的bigpicture

至此,我們開發了一個簡單的手寫數字識別模型。

總結全文,我們首先介紹了 graph 與 session,并解釋了基礎數據結構,講解了一些Variable需要注意的地方并介紹了 placeholders 與 feed_dict 。最終以一個手寫數字識別的實例將這些點串起來,希望可以給想要入門的你一丟丟的幫助。

掃描二維碼,添加馬哥個人微信,領取kindle大獎!

Tensorflow自學之前的bigpicture

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 阿尔山市| 芮城县| 石阡县| 安福县| 古交市| 甘孜| 海门市| 新兴县| 南华县| 沙河市| 平江县| 台安县| 互助| 南乐县| 邢台市| 厦门市| 舒兰市| 布拖县| 舒兰市| 蓝山县| 杂多县| 长子县| 公主岭市| 蕉岭县| 客服| 玉田县| 河西区| 乡宁县| 新巴尔虎左旗| 五大连池市| 松滋市| 神农架林区| 新密市| 綦江县| 大理市| 临颍县| 天柱县| 调兵山市| 汨罗市| 巫山县| 张家界市|