Tensorflow(0)
總體認識:
- tensor,即張量,也就是高維數組;flow,即流,表示着張量的關係以及運算;tensorflow就是張量間的計算。
- 張量之間的計算是在圖(graph)中實現的
圖:
- 圖是由幾點與邊組成的。
- 節點,即操作(operation);操作可以是加減乘除的運算,也可以是對常量、變量的初始化。
- 邊連接着節點,表示着節點之間的數據傳遞以及控制依賴;並在圖中以實線表示常規邊,即相連節點只進行數據傳遞;以虛線表示特殊表,即相連節點存在前後執行的依賴關係。
-
node1 = tf.constant(3.0, tf.float32, name='node1') node2 = tf.constant(4.0, tf.float32, name='node1') node3 = tf.add(node1, node2)
建立如上的計算關係,將得到對應的graph;
-
注意直接打印node3,將不會顯示7.0,而是 Tensor("Add:0", shape=(), dtype=float32);即返回一個Tensor值,其中包括節點名,形狀以及類型;要想顯示node3的具體值,需要在會話中進行,TF中只有執行Session時,才能提供數據與顯示結果。
張量
- TF中所有數據均爲張量;本質上張量是數組:零階張量就是一個數、一階張量就是一個向量一個一維數組、n階張量就是n維數組;但是張量不是直接表保存一個數組,保存的是計算過程。
- Tensor("Add:0", shape=(), dtype=float32),其中:第一項爲名字,冒號前表示具體名字,比如此處是加法的意思,冒號之後是序號,表示這是第幾個加法計算;第二項是維度,默認爲空,表示此時是一個標量;第三項是類型,類型極其重要,類型匹配是計算的前提。
- Tensor("Add:0", shape=(), dtype=float32)中的shape:一個張量有幾維shape的括號裏有幾個數(通過數中括號對數確定),並逐內在每維度取元素數放在括號裏;如: [1,2,3]->shape(3)一維且第一維有三個元素;[[1,2,3],[4,5,6]]->shape(2,3)二維且第一維兩個元素第二維3個元素。
- tensor可以像數組一樣的取值,如二階tensor,可以用t[i,j]的形式獲取元素,同樣的下標是從0開始到。
- 張量的類型是可以缺省的,程序會根據所填入得值自行判斷。若傳入的值無小數點,則判斷爲int32;若傳入的值有小數點,將判斷爲float32;由於缺省的存在,一定要注意計算時先確定類型匹配,否則程序很容易出現各種錯誤。
- 定義張量時雖然名字可以缺省,但是最好是帶上,因爲這樣在Tensorboard上可以有更好的可讀性。
操作
- 操作在計算圖中表示爲一個節點。
- 操作可以是加減乘除的運算,也可以是對常量、變量的初始化。
- 操作可以綁定於不同設備上,這爲cpu結合gpu或者多gpu計算提供可能。
會話
- 會話用以整合TF程序運行的所用資源,TF所有的數據計算以及結果顯示均在會話中實現,但是注意在程序結束後應及時關閉會話,防止內存泄漏。
-
tens0 = tf.constant([1,2.3]) sess = tf.Session() print(sess.run(tens0)) sess.close()
-
tens0 = tf.constant([1,2.3]) sess = tf.Session() try: print(sess.run(tens0)) except: print('Eception!') finally: sess.close()
-
tens0 = tf.constant([1,2.3]) with tf.Session() as sess: print(sess.run(tens0))
-
sess = tf.Session() with sess.as_default(): print(tensor.eval())
-
sess = tf.InteractiveSession()
常量與變量
-
constant_name = tf.constant(value,nmae='constant_name')
-
var_name = tf.Variable(value,nmae='vart_name') init = tf.global_variables_initializer() sess.run(init)
-
epoch = tf.Variable(0, name='epoch', trainable=False) # 不更新 update_op = tf.assign(variable_to_be_upadated, newValue) # 人工輸入值給變量
-
value = tf.Variable(0, name='value') one = tf.constant(1, name='one') new_value = tf.add(value, one, name='new_value') update_op = tf.assign(value, new_value) init = tf.global_variables_initializer() sess = tf.Session() with sess.as_default(): sess.run(init) for _ in range(10): sess.run(update_op) print(sess.run(value))
上述代碼實現了利用tf.assign賦值,輸出1到10
-
import tensorflow as tf tf.reset_default_graph() value = tf.Variable(0, name='value') one = tf.constant(1, name='one') new_value = tf.add(value, one, name='new_value') update_value = tf.assign(value, new_value) sum = tf.Variable(0, name='sum') new_sum = tf.add(sum, value, name='sum') update_sum = tf.assign(sum, new_sum) init = tf.global_variables_initializer() sess = tf.Session() with sess.as_default(): sess.run(init) for _ in range(10): sess.run(update_value) sess.run(update_sum) print("value: ", sess.run(value)) print("sum: ", sess.run(sum)) logdir = 'E:/log' writer = tf.summary.FileWriter(logdir, tf.get_default_graph()) writer.close()
上述代碼實現了1+..+10,同樣是利用了tf.assign對變量進行更新。
佔位符
- 對於初未知的變量,用佔位符表示;佔位符本質上是一種變量,所以使用前也需要進行初始化;在神經網絡中,輸入數據常以佔位符表示。
-
x = tf.placeholder(dtype, shape=none, name= none)
-
result = sess.run(operation, feed_dict={intput1:a,input2:b ...........})
Tensorboard
- tensorboard是基於tensorflow日誌,進行信息提取的可視化工具;可與tensorflow在不同的進程裏工作。
-
1.tf.reset_defualt_garph() # 清除默認圖中的計算 2.logdir = 'E:log' # 在指定路徑下建立日誌文件夾 3.定義各種計算...... 4.writer = tf.summary_FileWriter(logdir, tf.get_defualt_graph()) writer.close() ******************以上完成了對定義計算圖,並生成日誌************ ******************以下讀取日誌,並可視化*********************** 1. 在adacoinda的prompt中操作 2.首先切換到日誌所在路徑 3.使用 tensorboard --logdir==日誌路徑 4.命令執行後,會最終彈出一個地址,利用這個地址在瀏覽器進入