tensorflow實踐(二) 基本原理學習和框架使用
Tensorflow 是google大腦小組的工程師們開發的用於機器學習和深度神經網路方面的研究,它通過一個數據流圖來進行計算。[本文是對Tensorflow社群資料進行學習和實踐,其中文社群還是很好的學習資源]
一、基本概念:
1、 資料流程圖 data flow graphs
它的資料流圖如下圖所示(來源於網路):
2、 節點【nodes】: 圖中的各種形狀的方塊,表示的是某種數學操作【op】
3、 線【edges】: 表示節點間相互聯絡的多維資料陣列,在tensorflow中,稱為 張量【tensor】。個人理解為數學中的向量矩陣如:
三個元素的一維向量 [ 1, 2, 3 ], 2x2 的二維向量 [ [ 1, 1],[1, 1 ] ]
4、 重塑節點【Reshape】:前面說了 節點表示計算, 所以reshape是一個計算節點,用於進行矩陣的行數、列數、維度的調整。經常用這個節點進行降低維度計算
5、 啟用函式層【ReLULayer】:實現了對輸入資料的非負處理,將小於零的資料進行了截斷。
6、 邏輯層【Logit layer】: 實現邏輯迴歸,實現分類器計算
7、 計算梯度【Gradients】:計算梯度
8、 梯度下降訓練【SGD Trains】:進行梯度下降訓練優化
二、tensorflow的基本使用
一般來說,tensorflow使用圖(graph)來表示計算任務,在會話 (Session) 的上下文 (context) 中執行圖 ;使用tensor 表示資料,變數 (Variable)記錄計算狀態;使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料;
下面看看執行結果import tensorflow as tf # 建立一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作為一個節點 # 加到預設圖中. # # 構造器的返回值代表該常量 op 的返回值. matrix1 = tf.constant([[3., 3.]]) # 建立另外一個常量 op, 產生一個 2x1 矩陣. matrix2 = tf.constant([[2.],[2.]]) # 建立一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作為輸入. # 返回值 'product' 代表矩陣乘法的結果. product = tf.matmul(matrix1, matrix2) #Session 物件在使用完後需要關閉以釋放資源. 除了顯式呼叫 close 外, 也可以使用 "with" 程式碼塊 來自動完成關閉動作. #注意下面第二句和第三局的縮排 with tf.Session() as sess: result = sess.run([product]) print result
1、變數
變數的使用,需要通過初始化加入到圖中
import tensorflow as tf
# 建立一個變數, 初始化為標量 0.
count = tf.Variable(0, name="counter")
# 建立一個 op, 其作用是使 count 增加 1
one = tf.constant(1)
new_value = tf.add(count, one)
update = tf.assign(count, new_value)
# 啟動圖後, 變數必須先經過初始化,
# 首先必須增加一個`初始化` op 到圖中.
init_op = tf.initialize_all_variables()
# 啟動圖, 執行 op
with tf.Session() as sess:
# 執行 'init' op
result = sess.run(init_op)
print sess.run(count)
# 執行 op, 更新count值
sess.run(update)
print sess.run(count)
執行結果如下
之所以會多列印一個1,是因為 tf.assign( oldValue, newValue) 函式會列印
2) Fetch 拿取、獲取
可以一次傳入多個tensor 獲取結果
import tensorflow as tf
#定義兩個常量
x = tf.constant(3)
y = tf.constant(4)
# 建立3個 op,計算x平方和y平方和
xx = tf.mul(x, x)
yy = tf.mul(y, y)
zz = tf.add(xx, yy)
# 啟動圖, 執行 op
with tf.Session() as sess:
result = sess.run([xx, yy, zz])
print result
執行結果 不因為 sess.run([xx,yy,zz]) 中間的tensor 順序而改變結果
3) feed
tensorflow提供了佔位符和feed填入的機制,對於計算中的引數(預先用佔位符定義),通過feed_dict的方式進行代入實際計算值的方法
import tensorflow as tf
#定義兩個常量
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# 建立3個 op,計算x平方和y平方和
xx = tf.mul(x, x)
yy = tf.mul(y, y)
zz = tf.add(xx, yy)
# 啟動圖, 執行 op
with tf.Session() as sess:
result = sess.run([xx, yy, zz], feed_dict={x:[3.], y:[4.]} )
print result
計算結果如下: