神經(jīng)網(wǎng)絡(luò)體系搭建(四)——快速上手TensorFlow

本篇是神經(jīng)網(wǎng)絡(luò)體系搭建的第四篇,解決體系搭建的TensorFlow相關(guān)問題西土,詳見神經(jīng)網(wǎng)絡(luò)體系搭建(序)

TensorFlow.png

TensorFlow安裝

建議用Anaconda酪术。

  • Mac & Linux
conda create -n tensorflow python=3.5
source activate tensorflow
conda install pandas matplotlib jupyter notebook scikit-learn
conda install -c conda-forge tensorflow
  • Windows
conda create -n tensorflow python=3.5
activate tensorflow
conda install pandas matplotlib jupyter notebook scikit-learn
conda install -c conda-forge tensorflow

TensorFlow的套路

初識TensorFlow,最不舒服的一點(diǎn)是:變量不能好好聲明定義翠储,非得用特定api封裝成tensor才能使用,而且必須到session里才能運(yùn)行橡疼。但是熟悉了它的套路之后也就習(xí)慣了援所,可以幫助打破以前的思維定式。

Session

TesorFlow的API構(gòu)建在computational graph概念上欣除,是一種對數(shù)學(xué)運(yùn)算過程可視化的方法住拭。session是運(yùn)行g(shù)raph的環(huán)境,分配GPU/CPU。這是和以往程序不同的一點(diǎn)滔岳,它是在session中運(yùn)行的杠娱,所以邏輯寫在session里

數(shù)據(jù)封裝

在TensorFlow里谱煤,數(shù)據(jù)不以int摊求、string等方式存儲,而是以“tensor”的形式存在刘离。也就是說室叉,所有過去我們熟悉的基本類型,都得用它的api再包裝一遍硫惕,變成tensor茧痕,才能在session里用。

常量

import tensorflow as tf
s = tf.constant('hello world!') # 0 維度的字符串 tensor
i = tf.constant(123) # 0 維度的int32 tensor
a = tf.constant([123,324,235432]) # 1 維度的int32 tensor
m = tf.constant([123,324,235432],[23,342,3]) # 2 維度的int32 tensor

非常量

  • 很多時候一開始沒有初值恼除,需要運(yùn)行時賦值踪旷,這時候就需要用tf.placeholder()
    。用tf.placeholder()賦值的變量需要在session中用feed_dict
    設(shè)置值豁辉。

    x = tf.placeholder(tf.string)
    y = tf.placeholder(tf.int32)
    z = tf.placeholder(tf.float32)
    
    with tf.Session() as sess:
        output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
         print(output) # 輸出‘Test String’
    
  • 還有一種是一開始有初值令野,后續(xù)需要不斷更改的,比如權(quán)重矩陣w這一類秋忙,需要用tf.Variable彩掐,用tf.Variable聲明的變量必須在session用tf.global_variables_initializer()初始化所有變量

    n_features = 120
    n_labels = 5
    weights = tf.Variable(tf.truncated_normal((n_features, n_labels))) 
    bias = tf.Variable(tf.zeros(n_labels))
    
    with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
      print(sess.run(weights))
      print(sess.run(bias ))
    

    上述代碼tf.truncated_normal()表示取自一個正態(tài)分布的隨機(jī)值,tf.zeros() 函數(shù)返回一個都是 0 的 tensor灰追。

運(yùn)算

實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法避免不了加減乘除運(yùn)算堵幽,這里羅列幾個最基本的運(yùn)算:

  • tf.add()

    x = tf.add(5, 2)  # 7
    
  • tf.subtract

    x = tf.subtract(10, 4) # 6
    
  • tf.multiply

    x = multiply(2, 5) # 10
    
  • tf.divide

    # 除需要做一下類型轉(zhuǎn)換,轉(zhuǎn)成同一類型才能相除弹澎,否則會報(bào)錯
    x = tf.divide(tf.cast(tf.constant(10), tf.float32), tf.cast(tf.constant(2), tf.float32)) # 5.0
    
  • 矩陣乘法tf.matmul

    def linear(input, w, b):
      """
      Return linear function in TensorFlow
      :param input: TensorFlow input
      :param w: TensorFlow weights
      :param b: TensorFlow biases
      :return: TensorFlow linear function
      """
      # TODO: Linear Function (xW + b)
      return tf.add(tf.matmul(input, w), b)
    
  • 自然對數(shù) tf.log()

    x = tf.log(100)  # 4.60517
    

batch

batch在TensorFlow中經(jīng)常出現(xiàn)朴下。它指一次訓(xùn)練數(shù)據(jù)的一小部分,而不是一整個數(shù)據(jù)集苦蒿,這可以減少內(nèi)存占用殴胧。雖然從運(yùn)算角度講是低效的,但是總比在一些內(nèi)存低的電腦上不能運(yùn)行強(qiáng)佩迟。這是它產(chǎn)生的初衷团滥。

可以看一個計(jì)算
一個float32 占4個字節(jié),則
train_features Shape: (55000, 784) Type: float32
占55000x784x4=172480000字節(jié)
train_labels Shape: (55000, 10) Type: float32
占55000x10x4=2200000字節(jié)
weights Shape: (784, 10) Type: float32
占784x10x4=31360字節(jié)
bias Shape: (10,) Type: float32
占10x4=40字節(jié)
輸入报强、權(quán)重和偏置項(xiàng)總共的內(nèi)存空間需求是 174MB灸姊,并不是太多。你可以在 CPU 和 GPU 上訓(xùn)練整個數(shù)據(jù)集秉溉。
但將來你要用到的數(shù)據(jù)集可能是以 G 來衡量力惯,甚至更多碗誉。你可以買更多的內(nèi)存,但是會很貴父晶。

隨機(jī)梯度下降結(jié)合起來也很好用哮缺。因此每次訓(xùn)練對數(shù)據(jù)混洗,取一個batch甲喝,對每個batch用梯度下降求權(quán)重尝苇,因?yàn)閎atch是隨機(jī)的,所以其實(shí)是在對每個batch做隨機(jī)梯度下降俺猿。

batch的計(jì)算方法(用例取自優(yōu)達(dá)學(xué)城)
例如有 1000 個數(shù)據(jù)點(diǎn)茎匠,想每個 batch 有 128 個數(shù)據(jù)。但是 1000 無法被 128 整除押袍。你得到的結(jié)果是其中 7 個 batch 有 128 個數(shù)據(jù)點(diǎn)诵冒,1個 batch 有 104 個數(shù)據(jù)點(diǎn)。(7128 + 1104 = 1000)
batch 里面的數(shù)據(jù)點(diǎn)數(shù)量會不同的情況下谊惭,需要利用 TensorFlow 的 tf.placeholder() 函數(shù)來接收這些不同的 batch汽馋。
繼續(xù)上述例子,如果每個樣本有 n_input = 784 特征圈盔,n_classes = 10 個可能的標(biāo)簽豹芯,features 的維度應(yīng)該是 [None, n_input],labels 的維度是 [None, n_classes]驱敲。

# Features and Labels
features = tf.placeholder(tf.float32, [None, n_input])
labels = tf.placeholder(tf.float32, [None, n_classes])

None 維度在這里是一個 batch size 的占位符铁蹈。在運(yùn)行時,TensorFlow 會接收任何大于 0 的 batch size众眨。

batch的實(shí)現(xiàn)

import math
def batches(batch_size, features, labels):
    """
    Create batches of features and labels
    :param batch_size: The batch size
    :param features: List of features
    :param labels: List of labels
    :return: Batches of (Features, Labels)
    """
    assert len(features) == len(labels)
    # TODO: Implement batching
    output_batches = []
    sample_size = len(features)
    for start_i in range(0, sample_size, batch_size): 
        end_i = start_i + batch_size
        batch = [features[start_i:end_i], labels[start_i:end_i]]
        output_batches.append(batch)
        
    return output_batches

Epochs(代)

一個代是指整個數(shù)據(jù)集正向握牧、反向訓(xùn)練一次。代在神經(jīng)網(wǎng)絡(luò)里是一個可調(diào)的超參數(shù)娩梨。

for epoch_i in range(epochs):
  ...

有了上面的基礎(chǔ)知識沿腰,就可以用TensorFlow搭建模型了,當(dāng)然狈定,需要的比如softmax颂龙,交叉熵等等函數(shù)TensorFlow里都封裝,具體用時查看API就行纽什。

問題回答

至此措嵌,TensorFlow上手完畢。

  • TensorFlow如何使用芦缰?套路是什么铅匹?
    見上。簡單講除了所有數(shù)據(jù)封裝在tensor中饺藤,運(yùn)行在session中外沒什么特別的包斑。

以上內(nèi)容來自822實(shí)驗(yàn)室神經(jīng)網(wǎng)絡(luò)知識分享
我們的822,我們的青春
歡迎所有熱愛知識熱愛生活的朋友和822思享實(shí)驗(yàn)室一起成長涕俗,吃喝玩樂罗丰,享受知識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末再姑,一起剝皮案震驚了整個濱河市萌抵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌元镀,老刑警劉巖绍填,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栖疑,居然都是意外死亡讨永,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門遇革,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿闹,“玉大人,你說我怎么就攤上這事萝快《亡” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵揪漩,是天一觀的道長旋恼。 經(jīng)常有香客問我,道長奄容,這世上最難降的妖魔是什么冰更? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嫩海,結(jié)果婚禮上冬殃,老公的妹妹穿的比我還像新娘。我一直安慰自己叁怪,他們只是感情好审葬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奕谭,像睡著了一般涣觉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上血柳,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天远寸,我揣著相機(jī)與錄音,去河邊找鬼叭喜。 笑死,一個胖子當(dāng)著我的面吹牛鸦难,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播员淫,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼合蔽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了介返?” 一聲冷哼從身側(cè)響起拴事,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圣蝎,沒想到半個月后刃宵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徘公,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年牲证,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步淹。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡从隆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缭裆,到底是詐尸還是另有隱情键闺,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布澈驼,位于F島的核電站辛燥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缝其。R本人自食惡果不足惜挎塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望内边。 院中可真熱鬧榴都,春花似錦、人聲如沸漠其。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽和屎。三九已至拴驮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柴信,已是汗流浹背套啤。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留随常,地道東北人潜沦。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓萄涯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親止潮。 傳聞我的和親對象是個殘疾皇子窃判,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348