TensorFlow 入門:Session、Variable、placeholder

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,隨機種子是1
  • tf.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,不包含 maxval
  • tf.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)) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章