在新的算法理論不斷涌現(xiàn)的同時(shí),各種深度學(xué)習(xí)框架也不斷出現(xiàn)在人們視野,比如Torch,Caffe等等。TensorFlow是Google開發(fā)的第二代機(jī)器學(xué)習(xí)系統(tǒng),于2015年底開源,成為了新一代流行的機(jī)器學(xué)習(xí)的算法框架,感覺有必要掌握一下,所以報(bào)了個(gè)初級(jí)班學(xué)習(xí),做點(diǎn)筆記。
名詞
使用圖(graphs)來表示計(jì)算任務(wù)
其中每一個(gè)運(yùn)算操作(operation)將作為一個(gè)節(jié)點(diǎn)(node)
在計(jì)算圖邊中流動(dòng)(flow)的數(shù)據(jù)被稱為tensor張量
在會(huì)話(Session)的上下文中執(zhí)行圖
通過變量(Variable)維護(hù)狀態(tài)

實(shí)戰(zhàn)案例一
首先通過pip install安裝tensorflow
#導(dǎo)入tf,以下同
import tensorflow as tf
#創(chuàng)建一行兩列的矩陣常量,
m1= tf.constant([[3,3]])
#創(chuàng)建兩行一列的矩陣常量
m2= tf.constant([[2],[3]])
#創(chuàng)建乘法矩陣,matmul是矩陣乘法函數(shù)
product = tf.matmul(m1,m2)
不能直接print(product),必須放到對(duì)話里。
#調(diào)用sess的run方法來執(zhí)行矩陣乘法op,啟用默認(rèn)值Session()
with tf.Session() as sess:
result = sess.run(product)
print(result)
實(shí)戰(zhàn)案例二 變量的使用
#創(chuàng)建變量
x= tf.Variable([1,2])
a= tf.constant([3,3])
#創(chuàng)建減法和加法op
sub= tf.subtract(x,a)
add= tf.add(x,sub)
#初始化全局所有的變量
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(sub))
print(sess.run(add))
實(shí)戰(zhàn)案例三 創(chuàng)建循環(huán)
#創(chuàng)建變量,初始化為0
state = tf.Variable(0,name="counter")
#創(chuàng)建op,使state加1
new_value= tf.add(state,1)
#tf中,不能直接用等號(hào)賦值,所以要用assign來賦值
update= tf.assign(state,new_value)
#變量初始化
init= tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(state)) #這里打印出來是0
for i in range(5):
sess.run(update)
print(sess.run(state))
上面這個(gè)例子有點(diǎn)繞,state這里老師還唯恐不亂的又給了個(gè)名字counter。要搞清楚state,new_value,update之間的關(guān)系。
實(shí)戰(zhàn)案例四 Fetch 同時(shí)運(yùn)行
#定義三個(gè)常量
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
add = tf.add(input2,input3)
mul = tf.multiply(input1,add)
with tf.Session() as sess:
result = sess.run([mul,add])
#這里同時(shí)運(yùn)行乘法和加法op
print(result)
fetch并不是一個(gè)命令,它是指同時(shí)運(yùn)行,這里就是乘法和加法op
實(shí)戰(zhàn)案例五 Feed 占位符
定義三個(gè)占位符
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
#feed的數(shù)據(jù)以字典形式傳入,用feed_dict
print(sess.run(output,feed_dict={input1:[7.],input2:[2]}))
結(jié)果是14.
實(shí)戰(zhàn)案例六 簡單的綜合示例
import numpy as np
#使用np生產(chǎn)100個(gè)隨機(jī)點(diǎn)
x_data = np.random.randn(100)
y_data= x_data*0.1 +0.2
#構(gòu)建一個(gè)線性模型
k = tf.Variable(0.)
b = tf.Variable(0.)
y = k*x_data + b
#定義一個(gè)二次代價(jià)函數(shù)
y_data是樣本的真實(shí)值,y是預(yù)測(cè)值,求出誤差的square平方,再求mean平均值。就是loss啦。
loss = tf.reduce_mean(tf.square(y_data-y))
定義一個(gè)梯度下降法訓(xùn)練的優(yōu)化器 運(yùn)用已經(jīng)封裝好的GradientDescentOptimizer,學(xué)習(xí)率是0.2
optimizer = tf.train.GradientDescentOptimizer(0.2)
#訓(xùn)練的目的就是最小化代價(jià)函數(shù),用minimize
train = optimizer.minimize(loss)
如果loss越小,那么就應(yīng)該k越接近0.1,b越接近0.2.
#初始化變量
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(201): #迭代201次
sess.run(train) #每次會(huì)最小化loss
#每20次打印k和b的值:
if step%20 == 0:
print(step,sess.run([k,b]))
以上案例運(yùn)行結(jié)果,可以看出,tensorflow的擬合結(jié)果很強(qiáng)。

運(yùn)行結(jié)果
課程是dataguru的,有興趣者自行搜索吧。