Tensorflow基礎(chǔ)(一)

現(xiàn)在人工智能越來越火萌踱,也有很多的框架供大家選擇狈定,為什么推薦大家選tensorflow呢(因為他有一個很強的“親爹”--Google)诚卸,tensorflow的python接口峭咒,高移植性蜒程,靈活性绅你,還有可視化(tensorboard),自動微分和求導(dǎo)與強大的社區(qū)等特點讓他成為了現(xiàn)在最火熱的人工智能框架昭躺,讓大家對于復(fù)雜的網(wǎng)絡(luò)也不用害怕了忌锯。最近看了很多關(guān)于神經(jīng)網(wǎng)絡(luò)和tensorflow的書和視頻,這里就當(dāng)自己做一下筆記了领炫。下面進(jìn)入正題偶垮。
安裝直接使用pip就可以了:pip install tensorflow(如果是python3.x:pip3 install tensorflow)
首先對于tensorflow來說,最重要的概念就是Graph和Session


1.png

這就是一個Data Flow Graph帝洪,最核心的就是定義和計算不等于執(zhí)行似舵,一個模型跑起來只需要兩步:先描述整幅圖,然后在session中執(zhí)行運算葱峡。
tensorflow==tensor + flow砚哗,tensor是張量,flow流動族沃,可以理解為張量在圖中通過上圖所示里面的a频祝,b,c脆淹,d常空,e這些運算(這里把他們叫做op)進(jìn)行流動(傳遞和變換)。在tensorflow中盖溺,張量大家可以理解為一個n維的矩陣漓糙。
下面import tensorflow as tf 這是每一個tensorflow模型的第一行代碼,導(dǎo)入tensorflow,接著我們執(zhí)行一個加法運算并輸出:

a=tf.add(3,5)
print a

Tensor("Add:0", shape=(), dtype=int32)
結(jié)果不是8烘嘱,這是為什么呢昆禽?上面我們說過在tensorflow中定義計算和執(zhí)行是分開的蝗蛙,要想得到8的結(jié)果就必須用session來執(zhí)行運算

sess = tf.Session()
print sess.run(a)
sess.close()

首先初始化session,然后調(diào)用run()方法來執(zhí)行定義的a 這個運算醉鳖,這樣我們就可以輸出8這個結(jié)果捡硅。session在執(zhí)行的時候會找到你讓他執(zhí)行的運算a的依賴,把依賴的節(jié)點都進(jìn)行計算盗棵,不需要的節(jié)點則不用計算壮韭,這個等下我們會說到。那么現(xiàn)在回到剛剛直接輸出的那個結(jié)果纹因,因為這時a所保存的就是一個op喷屋,他有名字,形狀瞭恰,和參數(shù)類型屯曹,所以直接輸出后就會得到一個描述的結(jié)果。
大家以前經(jīng)常用io的應(yīng)該知道惊畏,我們經(jīng)常使用with open() as f:這種語句恶耽,這樣不需要你去寫close(),具體with語句什么原理就不說了陕截,大家可以百度一下驳棱,那么我們推薦的session寫法也是這種語句:

with tf.Session() as sess:
     print sess.run(a)

接下來我們看一個稍微復(fù)雜一點的例子:

x = 2
y = 3
add_op = tf.add(x, y)
mul_op = tf.mul(x, y)
useless = tf.mul(x, add_op)
pow_op = tf.pow(add_op, mul_op)
with tf.Session() as sess:
     z = sess.run(pow_op)

我們定義了4個op,add_op, mul_op, useless_op, pow_op农曲,然后我們執(zhí)行的時候選擇執(zhí)行pow_op,這樣session就會去找到pow_op所依賴的其他op驻债,然后都進(jìn)行計算乳规,所以上面只有useless_op不會執(zhí)行計算,這也是tensorflow一個非常重要的地方合呐,需要什么才執(zhí)行什么暮的,可以很大的提高效率并且由于各個op都是獨立的運算,這也方便了分布式處理淌实,比如把這個op用這個gpu處理冻辩,那個op用另一個gpu處理,使得極大的數(shù)據(jù)可以很好的進(jìn)行分布式處理拆祈。當(dāng)我們需要運行到幾個計算節(jié)點時恨闪,我們可以將上面的最后一行代碼調(diào)整為

z, not_useless = sess.run([pow_op, useless_op])

使用一個list來執(zhí)行。
上面我們定義x = 2;y = 3放坏,實際上我們定義常量通常使用constant()

a = tf.constant(2, name="a")
b = tf.constant(3, name="b")
x = tf.add(a, b, name="add")

這里的name是為了在tensorboard中方便查看咙咽,至于tensorboard下一次會詳細(xì)介紹,這里先不說淤年,其實就是整個模型的圖表示钧敞。
tensorflow提供了很多operations來創(chuàng)建常量蜡豹,比如tf.zeros ;tf.zeros_like ;tf.ones; tf.fill; tf.constant;還有創(chuàng)建Sequences的tf.linspace; tf.range等溉苛。另外還有隨機常量:

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0,
dtype=tf.float32,seed=None, name=None)
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32,seed=None, name=None)
tf.random_shuffle(value, seed=None, name=None) tf.random_crop(value, size, seed=None, name=None) 
tf.multinomial(logits, num_samples, seed=None, name=None)
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)

這些就不一一詳細(xì)介紹了镜廉,接下來就是變量:tf.constant是一個op,而tf.Variable是一個類

# create variable a with scalar value 
a = tf.Variable(2, name="scalar")
# create variable b as a vector
b = tf.Variable([2, 3], name="vector")
# create variable c as a 2x2 matrix
c = tf.Variable([[0, 1], [2, 3]], name="matrix")
# create variable W as 784 x 10 tensor, filled with zeros W = tf.Variable(tf.zeros([784,10]))

變量在使用前一定要記得初始化愚战,最簡單的初始化全部變量方法:

init = tf.global_variables_initializer() 
with tf.Session() as sess:
       sess.run(init)

初始化一個變量子集:

init_ab = tf.variables_initializer([a, b], name="init_ab") 
with tf.Session() as sess:
       sess.run(init_ab)

初始化單個變量:

W = tf.Variable(tf.zeros([784,10])) 
with tf.Session() as sess:
       sess.run(W.initializer)

輸出變量內(nèi)容會用到Eval()函數(shù):

# W 是一個700 x 100 隨機變量
W = tf.Variable(tf.truncated_normal([700, 10])) 
with tf.Session() as sess:
sess.run(W.initializer) 
print W
print W.eval()
  >> Tensor("Variable/read:0", shape=(700, 10),
  dtype=float32)
  >> [[-0.76781619 -0.67020458......

下面我們介紹 placeholder:
通過placeholder可以存放用于訓(xùn)練的數(shù)據(jù)

tf.placeholder(dtype, shape = None, name = None)

我們直接通過例子進(jìn)行介紹:

# create a placeholder of type float 32-bit, shape is a vector of 3 elements 
a = tf.placeholder(tf.float32, shape=[3])
# create a constant of type float 32-bit, shape is a vector of 3 elements 
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant or a variable 
c=a+b #Shortfortf.add(a,b)
with tf.Session() as sess:
print sess.run(c)

上面這段程序會報錯:# Error because a doesn’t have any value 對于a我們沒有給任何數(shù)據(jù)娇唯,我們將代碼修改為:

# create a placeholder of type float 32-bit, shape is a vector of 3 elements 
a = tf.placeholder(tf.float32, shape=[3])
# create a constant of type float 32-bit, shape is a vector of 3 elements 
b = tf.constant([5, 5, 5], tf.float32)
# use the placeholder as you would a constant or a variable 
c=a+b #Shortfortf.add(a,b)
with tf.Session() as sess:
# feed [1, 2, 3] to placeholder a via the dict {a: [1, 2, 3]}
print sess.run(c, {a: [1, 2, 3]})
# the tensor a is the key, not the string ‘a(chǎn)’
# >> [6, 7, 8]

我們通過字典的形式將數(shù)據(jù)傳給placeholder,這是tensorflow中最普遍的方式
下面我們在看一個例子:先創(chuàng)建兩個op

a = tf.add(2, 5)
b = tf.mul(a, 3)

然后創(chuàng)建一個replace_dict來修改a的值:

with tf.Session() as sess:
# define a dictionary that says to replace the value of 'a' with 15
replace_dict = {a: 15}
# Run the session, passing in 'replace_dict' as the value to 'feed_dict'
sess.run(b, feed_dict=replace_dict) 
# returns 45

feed_dict是tensorflow中用于喂數(shù)據(jù)的方法凤巨,都以字典形式存入视乐,就像上面這一段代碼,feed_dict={a:15}敢茁,那么就把b這個op中的a的值賦值為15佑淀。
回顧一下,介紹了關(guān)于tensorflow的一些很基本的東西彰檬,但是核心思想很重伸刃,就是以圖的形式來表示模型,然后表示和執(zhí)行計算分隔開逢倍,下一篇我會介紹如何用tensor flow從零開始搭建起一個模型捧颅,比如簡單的線性模型,還有經(jīng)典的手寫數(shù)字識別等较雕。所寫的難免有一些小錯誤碉哑,希望大家指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亮蒋,一起剝皮案震驚了整個濱河市扣典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慎玖,老刑警劉巖贮尖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趁怔,居然都是意外死亡湿硝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門润努,熙熙樓的掌柜王于貴愁眉苦臉地迎上來关斜,“玉大人,你說我怎么就攤上這事任连≡榇担” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裁着。 經(jīng)常有香客問我繁涂,道長,這世上最難降的妖魔是什么二驰? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任扔罪,我火速辦了婚禮,結(jié)果婚禮上桶雀,老公的妹妹穿的比我還像新娘矿酵。我一直安慰自己,他們只是感情好矗积,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布全肮。 她就那樣靜靜地躺著,像睡著了一般棘捣。 火紅的嫁衣襯著肌膚如雪辜腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天乍恐,我揣著相機與錄音评疗,去河邊找鬼。 笑死茵烈,一個胖子當(dāng)著我的面吹牛百匆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜投,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼加匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仑荐?” 一聲冷哼從身側(cè)響起矩动,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎释漆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篮迎,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡男图,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜橱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逊笆。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岂傲,靈堂內(nèi)的尸體忽然破棺而出难裆,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布乃戈,位于F島的核電站褂痰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏症虑。R本人自食惡果不足惜缩歪,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谍憔。 院中可真熱鬧匪蝙,春花似錦、人聲如沸习贫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苫昌。三九已至颤绕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜡歹,已是汗流浹背屋厘。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留月而,地道東北人汗洒。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像父款,于是被迫代替她去往敵國和親溢谤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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