TensorFlow入門-Session、Variable、placeholder
Tensorflow 是谷歌2015年11月正式開源的計算框架。主要依賴Protocol Buffer和Bzael兩個工具包:
- Protocl Buffer是谷歌開發的結構化數據處理工具
- Bzael 是谷歌的自動化構建工具,谷歌內部大部分應用均通過它來編譯
Tensorflow 是谷歌2015年11月正式開源的計算框架。主要依賴Protocol Buffer和Bzael兩個工具包:
- Protocl Buffer是谷歌開發的結構化數據處理工具
- Bzael 是谷歌的自動化構建工具,谷歌內部大部分應用均通過它來編譯
Tensorflow的名字已經說明其最重要的兩個概念:
- Tensor就是張量,即多維數組,所有數據都通過張量的形式表示。一個張量主要保存三個屬性:名字(name),維度(shape)和類型。
- Flow就是流,體現了計算模型,Tensorflow中每個計算都是計算圖上的一個節點,節點之間的邊描述了計算間的依賴關係
Tensorflow支持14種不同類型,主要包括:
- 實數(tf.float32, tf.float64)
- 整數(tf.int8, tf.int16, tf.int32, tf.int64, tf.unit8)
- 布爾型(tf.bool)
- 複數(tf.complex64, tf.complex128)
1. 會話
Tensorflow使用會話(Session)執行定義好的運算,會話擁有並管理Tensorflow程序運行時的所有資源,計算完成後需要關閉會話回收資源。
爲解決異常退出時的資源釋放問題,Tensorflow通過Python上下文管理器來使用會話(將所有計算放在with
內部),當上下文管理器退出時自動釋放所有資源。
x = tf.constant([[1.0,2.0]]) #x(1,2)
w = tf.constant([[3.0],[4.0]]) #w(2,1)
y = tf.matmul(x,w) #y(1,1)
with tf.Session() as sess:
print(sess.run(y))
2. 變量
Tensorflow支持14種不同類型,主要包括:
- 實數(tf.float32, tf.float64)
- 整數(tf.int8, tf.int16, tf.int32, tf.int64, tf.unit8)
- 布爾型(tf.bool)
- 複數(tf.complex64, tf.complex128)
tf.Variable(<initial-value>, name=<optional-name>)
用於生成一個初始值爲initial-value(必須指定)的變量
tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None)
獲取已存在的變量(要求不僅名字,而且初始化方法等各個參數都一樣),若不存在,就新建一個(可以用各種初始化方法,如xavier_initializer
不用明確指定值)。
常用的生成隨機數/數組的函數有:
tf.random_normal()
:生成正態分佈隨機數tf.truncated_normal()
:生成去掉過大偏離點的正態分佈隨機數tf.random_uniform()
:生成均勻分佈隨機數tf.zeros
:表示生成全0數組tf.ones
:表示生成全1數組tf.fill
:表示生成全定值數組tf.constant
:表示生成直接給定值的數組
例:
tf.Variable(tf.random_normal([2,3],stddev=2, mean=0, seed=1))
,表示生成正態分佈隨機數,形狀兩行三列,標準差是2,均值是0,隨機種子是1tf.Variable(tf.Truncated_normal([2,3],stddev=2, mean=0, seed=1))
,表示去掉偏離過大的正態分佈, 也就是如果隨機出來的數據偏離平均值超過兩個標準差,這個數據將重新生成random_uniform(shape=7,minval=0,maxval=1,dtype=tf.int32, seed=1)
,表示從一個均勻分佈[minval maxval)中隨機採樣,注意定義域是左閉右開,即
包含minval,不包含 maxvaltf.zeros([3,2],int32)
表示生成[[0,0],[0,0],[0,0]]tf.ones([3,2],int32)
表示生成[[1,1],[1,1],[1,1]tf.fill([3,2],6)
表示生成[[6,6],[6,6],[6,6]]tf.constant([3,2,1])
表示生成[3,2,1]。
3. placeholder
Tensorflow通過placeholder佔位符機制用於提供輸入數據,相當於定義一個位置,這個位置中的數據在程序運行時再指定。在定義時需要指定數據類型(不可改變)。這樣在程序中就不需要生成大量常量來提供輸入數據,而只需要將數據通過placeholder傳入Tensorflow計算圖。
#使用佔位符 一次輸入一組數據
x = tf.placeholder(tf.float32,shape=(1,2))
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(y,feed_dict={x:[[0.7,0.5]]}))
#使用佔位符 一次輸入多組數據
x = tf.placeholder(tf.float32,shape=(None,2))
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(y,feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))
print(sess.run(w1))
print(sess.run(w2))