TensorFlow極速入門

2020-12-05 雷鋒網

雷鋒網按:本文原載於Qunar技術沙龍,原作者已授權雷鋒網(公眾號:雷鋒網)發布。作者孟曉龍,2016年加入Qunar,目前在去哪兒網機票事業部擔任算法工程師。熱衷於深度學習技術的探索,對新事物有著強烈的好奇心。

一、前言

目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。本教程不是 cookbook,所以不會將所有的東西都事無巨細的講到,所有的示例都將使用 python。

那麼本篇教程會講到什麼?首先是一些基礎概念,包括計算圖,graph 與 session,基礎數據結構,Variable,placeholder 與 feed_dict 以及使用它們時需要注意的點。最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。

1、tensorflow是什麼?

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

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

2、 why tensorflow?

Tensorflow 擁有易用的 python 接口,而且可以部署在一臺或多臺 cpu , gpu 上,兼容多個平臺,包括但不限於 安卓/windows/linux 等等平臺上,而且擁有 tensorboard這種可視化工具,可以使用 checkpoint 進行實驗管理,得益於圖計算,它可以進行自動微分計算,擁有龐大的社區,而且很多優秀的項目已經使用 tensorflow 進行開發了。

3、 易用的tensorflow工具

如果不想去研究 tensorflow 繁雜的API,僅想快速的實現些什麼,可以使用其他高層工具。比如 tf.contrib.learn,tf.contrib.slim,Keras 等,它們都提供了高層封裝。這裡是 tflearn 的樣例集(github連結  https://github.com/tflearn/tflearn/tree/master/examples)。

4、 tensorflow安裝

目前 tensorflow 的安裝已經十分方便,有興趣可以參考官方文檔 (https://www.tensorflow.org/get_started/os_setup)。

二、 tensorflow基礎

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

(1)組裝一個graph;

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

因此我們從 graph 與 session 說起。

1、 graph與session

(1)計算圖

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

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

(2)概念說明

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

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

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

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

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

Graph僅僅定義了所有 operation 與 tensor 流向,沒有進行任何計算。而session根據 graph 的定義分配資源,計算 operation,得出結果。既然是圖就會有點與邊,在圖計算中 operation 就是點而 tensor 就是邊。Operation 可以是加減乘除等數學運算,也可以是各種各樣的優化算法。每個 operation 都會有零個或多個輸入,零個或多個輸出。 tensor 就是其輸入與輸出,其可以表示一維二維多維向量或者常量。而且除了Variables指向的 tensor 外所有的 tensor 在流入下一個節點後都不再保存。

(3)舉例

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

import  tensorflow as tf

graph  = tf.Graph()

with  graph.as_default():

    foo = tf.Variable(3,name='foo')

    bar = tf.Variable(2,name='bar')

    result = foo + bar

    initialize =  tf.global_variables_initializer()

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

print(result)  #Tensor("add:0", shape=(), dtype=int32)

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

with  tf.Session(graph=graph) as sess:

    sess.run(initialize)

    res = sess.run(result)

   print(res)  # 5

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

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

2、數據結構

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

(1)rank

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

(2)shape

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

(3)data type

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

3、 Variables

(1)介紹

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

weights  = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")

biases  = tf.Variable(tf.zeros([200]), name="biases")

其中,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。

Init_ab  = tf.variables_initializer([a,b],name=」init_ab」)

Variables可以通過eval顯示其值,也可以通過assign進行賦值。Variables支持很多數學運算,具體可以參照官方文檔 (https://www.tensorflow.org/api_docs/python/math_ops/)。

(3)Variables與constant的區別

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

const  = tf.constant(1.0,name="constant")

print(tf.get_default_graph().as_graph_def())

這裡第二行是列印出圖的定義,其輸出如下。

node {

  name: "constant"

  op: "Const"

  attr {

    key: "dtype"

    value {

      type: DT_FLOAT

    }

  }

  attr {

    key: "value"

    value {

      tensor {

        dtype: DT_FLOAT

        tensor_shape {

        }

        float_val: 1.0

      }

    }

  }

}

versions {

  producer: 17

}

(4)命名

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

4、 placeholders與feed_dict

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

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

foo =  tf.placeholder(tf.int32,shape=[1],name='foo')

bar = tf.constant(2,name='bar')

result = foo + bar

with tf.Session() as sess:

    print(sess.run(result))

在上面的代碼中,會拋出錯誤(InvalidArgumentError),因為計算result需要foo的具體值,而在代碼中並沒有給出。這時候需要將實際值賦給foo。最後一行修改如下:

print(sess.run(result,{foo:[3]}))

其中最後的dict就是一個feed_dict,一般會使用python讀入一些值後傳入,當使用minbatch的情況下,每次輸入的值都不同。

三、mnist識別實例

介紹了一些tensorflow基礎後,我們用一個完整的例子將這些串起來。

首先,需要下載數據集,mnist數據可以在Yann LeCun's website( http://yann.lecun.com/exdb/mnist/ )下載到,也可以通過如下兩行代碼得到。

from  tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/",  one_hot=True)

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

整體的X可以表示為。


y為X真實的類別,其數據可以看做如下圖的形式。因此,問題可以看成一個10分類的問題。

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

用圖形可以表示為下圖,具體原理這裡不再闡述,更多細節參考 該連結 (http://tech.meituan.com/intro_to_logistic_regression.html)。

那麼 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。

import tensorflow as tf

x = tf.placeholder(tf.float32,  [None, 784])

y_ = tf.placeholder(tf.float32,  [None, 10])

W = tf.Variable(tf.zeros([784,  10]))

b = tf.Variable(tf.zeros([10]))

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

y = tf.nn.softmax(tf.matmul(x,  W) + b)

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

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

cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

train_step =  tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

init =  tf.global_variables_initializer()

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

with tf.Session() as sess:

    sess.run(init)

    for i in range(1000):

        batch_xs, batch_ys =  mnist.train.next_batch(100)

        sess.run(train_step, feed_dict={x:  batch_xs, y_: batch_ys})

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

correct_prediction =  tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction,  tf.float32))

print(sess.run(accuracy,  feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

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

總結

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

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    《TensorFlow極速入門》連結:http://www.leiphone.com/news/201702/vJpJqREn7EyoAd09.html本文介紹了 graph 與 session 等基本組件,解釋了 rank 和 shape 等基礎數據結構概念,講解了一些 variable 需要注意的地方並介紹了
  • TensorFlow 中文資源全集,學習路徑推薦
    https://gitee.com/fendouai/Awesome-TensorFlow-Chinese很多內容下面這個英文項目:Inspired by https://github.com/jtoy/awesome-tensorflow官方網站官網:https://www.tensorflow.org/中文:https://tensorflow.google.cn
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    HTTP/REST API at:localhost:8501 …$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
  • TensorFlow 2入門指南,初學者必備!
    字幕組雙語原文:TensorFlowTensorflow v1難以使用和理解,因為它的Pythonic較少,但是隨著Keras發行的v2現在與Tensorflow.keras完全同步,它易於使用,易學且易於理解。
  • 步履不停:TensorFlow 2.4新功能一覽!
    參數伺服器訓練教程           https://tensorflow.google.cn/tutorials/distribute/parameter_server_training    ClusterCoordinator           https://tensorflow.google.cn/api_docs/python
  • 最熱門的深度學習框架TensorFlow入門必備書籍
    眾多研究表明,Tensorflow 是研究深度學習的首選平臺。於是,很多開發者就問了,TensorFlow如此受歡迎,如果想入門學習它,要選擇哪本書呢?今天就和大家推薦一本TensorFlow入門書籍之《Tensorflow:實戰Google深度學習框架》在了解這本書之前,不妨先來了解一下什麼是TensorFlow,TensorFlow 是谷歌的第二代機器學習系統, 是一個採用數據流圖,用於數值計算的開源軟體庫
  • 深度解讀TensorFlow,了解它的最新發展!
    Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    關於TensorFlow的Python和C ++ API的各種函數的詳細文檔,請參見https://www.tensorflow.org/api_docs/index.html 機器學習主要依賴於很多數學公式,本文將對使用TensorFlow進行這類數學運算做一個初步的介紹。
  • TensorFlow 資源大全中文版
    (點擊上方藍字,快速關注我們)譯文:伯樂在線專欄作者 - Yalye英文:jtoy如有好文章投稿
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    繼續之前,也可以閱讀這個 Tensorflow 小入門:https://blog.metaflow.fr/tensorflow-a-primer-4b3fa0978be3#.wxlmweb8h你有必要了解這些信息,因為了解如何保存不同級別的代碼是非常重要的,這可以避免混亂無序。
  • 終於來了,TensorFlow 新增官方 Windows 支持
    現在你可以使用命令 C:\> pip install tensorflow 安裝 TensorFlow 了。GPU 支持的命令:C:\> pip install tensorflow-gpu有關 TensorFlow Windows 支持的更多細節請閱讀 r0.12 的版本注釋。
  • 玩轉TensorFlow?你需要知道這30功能
    地址是:tensorflow.org/tfx/?網址是:https://www.tensorflow.org/tfx/transform/?網址是:https://www.tensorflow.org/serving/?
  • python應用之基於tensorflow的數據擬合:深度學習之預測入門篇
    實驗目的:1、了解python在深度學習領域的應用2、學習安裝python第三方依賴庫實驗環境:已正確安裝python3.5以及依賴庫tensorflow、matplotlib預測過程展示:1、應用領域python是一種高級面向對象的動態類型語言,具有開發高效,學習簡單的特點,主要應用於大數據、深度學習、
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    作者:魯偉 一個數據科學踐行者的學習日記。                       tf.set_random_seed(1)                              seed = 3                                            (n_x, m) = X_train.shape                          n_y = Y_train.shape[0]
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    在命令提示符窗口輸入下列命令: 建立Tensorflow Anaconda虛擬環境 conda create --name tensorflow python=3.5 anaconda 執行後屏界面顯示如圖3-9所示。
  • 5個簡單的步驟掌握Tensorflow的Tensor
    在這篇文章中,我們將深入研究Tensorflow Tensor的細節。我們將在以下五個簡單步驟中介紹與Tensorflow的Tensor中相關的所有主題:第一步:張量的定義→什麼是張量?我們經常將NumPy與TensorFlow一起使用,因此我們還可以使用以下行導入NumPy:import tensorflow as tfimport numpy as np張量的創建:創建張量對象有幾種方法可以創建tf.Tensor對象。讓我們從幾個例子開始。
  • 入門| Tensorflow實戰講解神經網絡搭建詳細過程
    一 、MNIST手寫數字數據集介紹  MNIST手寫數字數據集來源於是美國國家標準與技術研究所,是著名的公開數據集之一,通常這個數據集都會被作為深度學習的入門案例。數據集中的數字圖片是由250個不同職業的人純手寫繪製,數據集獲取的網址為:http://yann.lecun.com/exdb/mnist/。
  • TensorFlow入門簡介,新手請看這裡!
    這些數據「線」可以傳送「大小可動態調整」的多維數據數組,即「張量」(tensor)。一旦輸入端的所有張量準備好,節點將被分配到各種計算設備完成異步並行運算。  Tensorflow在GitHub上已經超過76,000顆星,而且每個月都在持續增長。  其中有很多是社區創建的教程、模型、翻譯和項目,如果您對機器學習感興趣,它是一個很好的學習源。比如,目前由TensorFlow團隊監控的Stack Overflow就是一個很好的學習社區。