使用tensorflow 你必須明白tensorflow
- 使用圖(graph)來表示計(jì)算任務(wù)
- 在被稱為會話 Session 的上下文context 中執(zhí)行圖
- 使用tensor來表示數(shù)據(jù)拉馋,放在圖的節(jié)點(diǎn)中
- 通過變量(Variable)來維護(hù)狀態(tài)
- 使用feed和fetch 可以為任意的操作(arbitrary operation)賦值或者從其中獲取數(shù)據(jù)
這個(gè)圖菲饼,其實(shí)就是計(jì)算圖,具體原理不需要知道子库,計(jì)算圖就是flow 睬涧,也可以認(rèn)為是工作流圖募胃,op(節(jié)點(diǎn))的執(zhí)行步驟 就被描述成一個(gè)圖 ,tensor之間的轉(zhuǎn)換就是op處的計(jì)算來做的
計(jì)算圖 Tensorflow
一個(gè)TensorFlow圖描述來計(jì)算的過程畦浓,為了進(jìn)行計(jì)算痹束,圖必須在會話 session里被啟動,會話將op分發(fā)到CPU GPU這樣的設(shè)備上讶请,同時(shí)執(zhí)行op的方法祷嘶,這些方法被執(zhí)行后,將產(chǎn)生的tensor返回秽梅,在Python中 返回的 是 numpy ndarray對象
TensorFlow程序經(jīng)常被組織成一個(gè)構(gòu)建階段和一個(gè)執(zhí)行階段抹蚀,在構(gòu)建階段,op的執(zhí)行步驟被描述成一個(gè)圖企垦,在執(zhí)行階段环壤,使用會話執(zhí)行執(zhí)行圖中的op,因此會話開啟執(zhí)行的環(huán)境
因此 我們通常在構(gòu)建階段钞诡,創(chuàng)一個(gè)神經(jīng)網(wǎng)絡(luò)郑现,然后在執(zhí)行階段通過session反復(fù)調(diào)用這個(gè)神經(jīng)網(wǎng)絡(luò)湃崩,執(zhí)行圖中的op
構(gòu)建圖
構(gòu)建圖的第一步,是創(chuàng)建源op接箫,源op不需要任何的輸入攒读,例如常量constant 源op的輸出被傳遞給其他op做運(yùn)算
matrix1=tf.constant([[3.,3.]]) 1x2矩陣
matrix2=tf.constant([[2.] , [2.]]) 2x1矩陣
product=tf.matmul(matrix1,matrix2)
啟動圖
sess = tf.session()
result=sess.run(product) 執(zhí)行上面定義的三個(gè)運(yùn)算
print result 打印獲取的矩陣
任務(wù)完成 關(guān)閉會話:
sess.close()
With 代碼塊
with tf.Session() as sess:
result = sess.run([product])
print result
With代碼塊,自動獲取和釋放資源辛友,除了顯式調(diào)用close外薄扁,也可以使用with代碼塊來自動完成關(guān)閉釋放資源動作
變量 Variables
# 創(chuàng)建一個(gè)變量, 初始化為標(biāo)量 0.
state = tf.Variable(0, name="counter")
#疑問一:這個(gè)name 有什么用?
# 創(chuàng)建一個(gè) op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 注意這里的add 和 給
# 而且無論怎樣 都需要定義 操作op 然后 才可以跑 任何方法 都是有返# 回值的
# 啟動圖后, 變量必須先經(jīng)過`初始化` (init) op 初始化,
# 首先必須增加一個(gè)`初始化` op 到圖中.
init_op = tf.initialize_all_variables()
# 包含變量的情況 必須在session會話中 先執(zhí)行此操作
# 啟動圖, 運(yùn)行 op
with tf.Session() as sess:
# 運(yùn)行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
print sess.run(state)
# 運(yùn)行 op, 更新 'state', 并打印 'state'
for _ in range(3):
sess.run(update)
print sess.run(state)
#疑問2 直接print state 不行嗎废累? 為什還要sess.run一下
繪制操作圖邓梅,然后一步步 用session 執(zhí)行 或許 只跑最終定義的一個(gè)op就行
Fetch 和 Feed
with tf.Session() as sess:
result = sess.run([mul, intermed])
print result
# 取回多個(gè)值
feed 使用一個(gè) tensor 值臨時(shí)替換一個(gè)操作的輸出結(jié)果. 你可以提供 feed 數(shù)據(jù)作為 run() 調(diào)用的參數(shù). feed 只在調(diào)用它的方法內(nèi)有效, 方法結(jié)束, feed 就會消失. 最常見的用例是將某些特殊的操作指定為 "feed" 操作, 標(biāo)記的方法是使用 tf.placeholder() 為這些操作創(chuàng)建占位符.
#也就是說 feed 和 placeholder 結(jié)合使用 否則placeholder 定義的隨時(shí)#被替換的 tensor就沒有意義 始終沒有輸入值的話
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 輸出:
# [array([ 14.], dtype=float32)]