現(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
這就是一個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ù)字識別等较雕。所寫的難免有一些小錯誤碉哑,希望大家指正。