TensorFlow學(xué)習(xí)(一)

前言

TensorFlow是Google團(tuán)隊(duì)開發(fā)的一款開源的用于各種感知和語言理解任務(wù)的機(jī)器學(xué)習(xí)框架嫁盲。它的底層核心引擎由C++實(shí)現(xiàn)创泄,但提供了Python知染、C++肋僧、Java、Go等常用計(jì)算機(jī)語言的接口控淡,可謂是覆蓋面很廣嫌吠。開發(fā)平臺支持Windows、Linux和macOS逸寓。

相較于Caffe居兆,TensorFlow上手較難,運(yùn)行速度慢竹伸,且內(nèi)存耗費(fèi)高,但是TensorFlow使用了張量(tensor)運(yùn)算的符號圖方法簇宽,使得新網(wǎng)絡(luò)的指定變得相當(dāng)容易勋篓,可支持快速開發(fā),即靈活性很高魏割。加上是Google的親兒子譬嚣,很快得到了很多人的認(rèn)同。

什么是張量運(yùn)算的符號圖方法钞它?符號圖也稱作數(shù)據(jù)流圖拜银,使用tensorflow時(shí),使用的數(shù)據(jù)(以張量存在)都得放在數(shù)據(jù)流圖中進(jìn)行計(jì)算遭垛。下圖為一個(gè)數(shù)據(jù)流圖截?cái)啵?br>

數(shù)據(jù)流圖

節(jié)點(diǎn)在圖中表示對數(shù)據(jù)進(jìn)行相關(guān)操作尼桶,則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組, 即張量(tensor)锯仪。訓(xùn)練模型時(shí)泵督,tensor會不斷的從數(shù)據(jù)流圖中的一個(gè)節(jié)點(diǎn)流到另一節(jié)點(diǎn), 這也是TensorFlow名字的由來。

最后提下張量庶喜,張量是矢量概念的推廣小腊,一維的張量稱作矢量或向量救鲤,如[1, 2, 3];二維的張量稱作矩陣秩冈,如[[2, 3], [2, 4]]本缠;以此類推,后面還有三維入问,四維等搓茬。

數(shù)據(jù)流圖中的基礎(chǔ)知識

1.session
session是一個(gè)會話控制處理模塊,是Tensorflow為了控制和輸出對應(yīng)執(zhí)行語句队他。舉個(gè)栗子卷仑,考試的時(shí)候,老師在將卷子發(fā)完給所有同學(xué)之前是不可以動筆答題的(將所有變量進(jìn)行定義占位)麸折,發(fā)完卷子后锡凝,同學(xué)們得到了通知,進(jìn)行針對不同的題目進(jìn)行相應(yīng)的答題步驟(將之前所有定義的變量進(jìn)行賦值和計(jì)算垢啼,并針對這些變量進(jìn)行一系列處理)窜锯。

回到Tensorflow上,上面的例子中芭析,后序的答題過程锚扎,就是在session完成的,而啟動的開關(guān)就是session.run()馁启。

import tesorflow as tf

#進(jìn)行定義占位驾孔,不作運(yùn)算和賦值
x1 = tf.constant(3)  #定義一個(gè)常量張量
x2 = tf.constant(2)  
res = tf.multiply(x1, x2)  #乘法
#創(chuàng)建一個(gè)會話,并把之前所有變量進(jìn)行賦值和計(jì)算
with tf.Session() as sess:
    ans = sess.run(res)
    print(ans)  #6

2.Variable
Variable是tensorflow中變量定義的關(guān)鍵字惯疙,即定義變量需要使用tf.Variable()翠勉。這里需要注意一點(diǎn),只要是定義了變量霉颠,就需要進(jìn)行初始化对碌,初始化的過程就是將你定義的變量變?yōu)閿?shù)據(jù)流圖中使用的張量格式。

import tesorflow as tf

x1 = tf.Variable(3)  #定義一個(gè)變量
x2 = tf.Variable(2)
res = tf.multiply(x1, x2)

#將所有定義的變量初始化為張量
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)  #進(jìn)行激活蒿偎,執(zhí)行
    print(sess.run(res))  #6

3.scope
scope表示域朽们,即變量的作用域。平時(shí)在寫代碼過程中诉位,因?yàn)楹苌贂霈F(xiàn)很多變量的情況骑脱,所以很難體現(xiàn)出scope的作用。而在深度學(xué)習(xí)網(wǎng)絡(luò)中不从,如果不做處理惜姐,動則上百個(gè)變量是常見的,所以為了便于管理代碼,推薦使用scope歹袁。下面兩張圖生動形象的詮釋了scope的作用:

使用scope之前

使用scope之后

TensorFlow中有兩種scope坷衍,一種是name_scope,另一種是variable_scope条舔。name_scope主要用于管理一個(gè)數(shù)據(jù)流圖里面的各種layer(也稱op)枫耳,實(shí)現(xiàn)一種層次化且有條理的管理,避免各個(gè)layer之間命名沖突孟抗。而variable_scope一般也可以實(shí)現(xiàn)name_scope的作用迁杨,但它還有一個(gè)更重要的作用,用于管理一個(gè)數(shù)據(jù)流圖中變量的名字凄硼,避免變量之間的命名沖突铅协。

提到變量命名,先介紹下定義變量的方法也有兩種摊沉,一種是上面提到的Variable狐史,當(dāng)在使用Variable定義變量時(shí), 系統(tǒng)會自動檢測命名是否沖突并自動處理说墨;還有一種get_variable骏全,使用它定義變量,當(dāng)遇到要創(chuàng)建重名變量而該變量名沒有設(shè)置為共享變量時(shí)尼斧,會報(bào)錯(cuò)姜贡。

with tf.name_scope("scope1"):
    x1 = tf.Variable(name='var1', initial_value=[1], dtype=tf.float32)
    x2 = tf.Variable(name='var1', initial_value=[2], dtype=tf.float32)
    init = tf.constant_initializer(value=1) #給x3賦值
    #默認(rèn)為不共享
    x3 = tf.get_variable(name='var2', shape=[1], dtype=tf.float32, initializer = init)
    #x4 = tf.get_variable(name='var2', shape=[1], dtype=tf.float32, initializer = init)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) #初始化
    print(x1.name)        # scope1/var1:0
    print(sess.run(x1))   # [1.]
    
    print(x2.name)       # scope1/var1_1:0
    print(sess.run(x2))  # [2.]
    
    print(x3.name)        # var2:0
    print(sess.run(x3))   # [1]
    #print(sess.run(x4))   #error

使用變量共享:

with tf.variable_scope("scope") as scope:
    x1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    scope.reuse_variables()  # 設(shè)置為使用共享變量
    x2 = tf.get_variable(name='var1')

#或者使用 with tf.variable_scope("scope", reuse=reuse):
    
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(x1.name)        #scope/var1:0
    print(sess.run(x1))   #[0.34196675],默認(rèn)隨機(jī)初始化值
    
    print(x2.name)       #scope/var1:0
    print(sess.run(x2))  #[0.34196675]

variable_scope的其它常見使用方式:

def fun(x1, x2, scope):
    with tf.variable_scope(scope) :
        return tf.multiply(x1, x2)
    
with tf.variable_scope("fun"):
    x1 = tf.constant(1)  #定義一個(gè)常量張量
    x2 = tf.Variable(2)  #定義一個(gè)變量棺棵,后面需要初始化
    #在fun1域作運(yùn)算
    res = fun(x1 = x1, x2 = x2, scope = "fun1")
    #在fun2域作運(yùn)算
    res = fun(x1 = res, x2 = x2, scope = "fun2")
    #在fun3域作運(yùn)算
    res = fun(x1 = res, x2 = res, scope = "fun3")

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(res))  #16
scope的使用

上圖為一個(gè)簡單的scope運(yùn)用楼咳。值得一提的是,可以把最外層的fun看成一個(gè)layer律秃,里面的fun1爬橡,fun2,fun3可以替換成相應(yīng)的卷積棒动,激活操作,最后多個(gè)layer進(jìn)行組合宾添,就是一個(gè)深度學(xué)習(xí)大概的網(wǎng)絡(luò)模型結(jié)構(gòu)啦船惨。

4.placeholder
在Tensorflow中,每生成一個(gè)常量缕陕,就需要在數(shù)據(jù)流圖中增加一個(gè)節(jié)點(diǎn)(如上圖)粱锐,數(shù)據(jù)量較大時(shí),會導(dǎo)致圖特別大扛邑。為了解決這個(gè)問題怜浅,需使用placeholder來輸入數(shù)據(jù),它相當(dāng)于定義了一個(gè)位置《褡總結(jié)下就是搀暑,placeholder是一個(gè)占位符,用來暫時(shí)儲存變量跨琳。將上面的代碼修改為使用placeholder:

def fun(x1, x2, scope):
    with tf.variable_scope(scope) :
        return tf.multiply(x1, x2)
    
with tf.variable_scope("fun"):
    #placeholder需要定義type自点,一般為float32
    x1 = tf.placeholder(tf.float32)
    x2 = tf.placeholder(tf.float32)
    #在fun1域作運(yùn)算
    res = fun(x1 = x1, x2 = x2, scope = "fun1")
    #在fun2域作運(yùn)算
    res = fun(x1 = res, x2 = x2, scope = "fun2")
    #在fun3域作運(yùn)算
    res = fun(x1 = res, x2 = res, scope = "fun3")

with tf.Session() as sess:
    #傳值
    print(sess.run(res, feed_dict = {x1:2, x2:3})) #324
使用placeholder

【關(guān)注公眾號DoCode,每日一道LeetCode脉让,還有更多其他博文桂敛,將零碎時(shí)間利用起來】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溅潜,隨后出現(xiàn)的幾起案子术唬,更是在濱河造成了極大的恐慌,老刑警劉巖滚澜,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗仓,死亡現(xiàn)場離奇詭異,居然都是意外死亡博秫,警方通過查閱死者的電腦和手機(jī)潦牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挡育,“玉大人巴碗,你說我怎么就攤上這事〖春” “怎么了橡淆?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長母赵。 經(jīng)常有香客問我逸爵,道長,這世上最難降的妖魔是什么凹嘲? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任师倔,我火速辦了婚禮,結(jié)果婚禮上周蹭,老公的妹妹穿的比我還像新娘趋艘。我一直安慰自己,他們只是感情好凶朗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布瓷胧。 她就那樣靜靜地躺著,像睡著了一般棚愤。 火紅的嫁衣襯著肌膚如雪搓萧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音瘸洛,去河邊找鬼揍移。 笑死,一個(gè)胖子當(dāng)著我的面吹牛货矮,可吹牛的內(nèi)容都是我干的羊精。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼囚玫,長吁一口氣:“原來是場噩夢啊……” “哼喧锦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抓督,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤燃少,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铃在,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阵具,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年定铜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阳液。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揣炕,死狀恐怖帘皿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畸陡,我是刑警寧澤鹰溜,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站丁恭,受9級特大地震影響曹动,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牲览,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一墓陈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧第献,春花似錦跛蛋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押框。三九已至岔绸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盒揉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工晋被, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刚盈。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓羡洛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕漱。 傳聞我的和親對象是個(gè)殘疾皇子欲侮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 做了幾個(gè)利用 TensorFlow 來構(gòu)建 RNN 的練習(xí),發(fā)現(xiàn)很多示例代碼中的語句的目的和來源不是很清楚肋联,因此特...
    拓季閱讀 1,163評論 1 2
  • 簡介 TensorFlow 是一個(gè)采用數(shù)據(jù)流圖(data flow graphs)威蕉,用于數(shù)值計(jì)算的開源軟件庫。Te...
    Mr_差不多閱讀 245評論 0 3
  • 簡單線性回歸 import tensorflow as tf import numpy # 創(chuàng)造數(shù)據(jù) x_dat...
    CAICAI0閱讀 3,541評論 0 49
  • 我總是喜歡完成需要完成的事情橄仍,然后再去做其他的事情韧涨。因?yàn)槲矣X得這樣子既可以不用去擔(dān)心那件事情還沒有完成,也可以到最...
    嶼上嶼閱讀 158評論 0 3
  • 終于侮繁,一切都塵埃落定虑粥,雖然早就跟自己說過不要抱希望了,自己也早已經(jīng)放棄宪哩,但是當(dāng)我看到成績的時(shí)候還是有不甘心娩贷,有后悔...
    皎月兒兒閱讀 121評論 0 0