tensorflow學習筆記一
阿新 • • 發佈:2018-12-17
系統架構
運算
正常的運算
t=7+8
print(t)
tensorflow計算方式好像不太一樣,需要先寫好資料流圖,需要用session去執行這個圖,
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
sess=tf.Session()
a = tf.constant(10)
b = tf.constant(22)
print(sess.run(a+b))
sess.close()
在 傳 統 的 程 序 操 作 中, 定 義 了 t 的 運 算, 在 運 行 時 就 執 行 了, 並 輸 出 17。 而 在 TensorFlow 中, 數 據 流 圖 中 的 節 點, 實 際 上 對 應 的 是 TensorFlow API 中 的 一 個 操 作, 並 沒 有 真 正 去 運 行:
import tensorflow as tf
t = tf.add( 8, 9)
print( t)
# 輸 出 Tensor(" Add_1: 0", shape =(), dtype = int32)
節選自:Alexander·T·Combs; Rodolfo·Bonnin; 李嘉璇. 機器學習從認知到實踐(第2輯)(套裝共3冊,Python+TensorFlow) (Kindle 位置 9300-9304). 人民郵電出版社.
資料型別
數 據 類 型 | Python 類 型 | 描 述 |
---|---|---|
DT_FLOAT | tf.float32 | 32 位 浮 點 型 |
DT_DOUBLE | tf.float64 | 64 位 浮 點 型 |
DT_INT64 | tf.int64 | 64 位 有 符 號 整 型 |
DT_INT32 | tf.int32 | 32 位 有 符 號 整 型 |
DT_INT16 | tf.int16 | 16 位 有 符 號 整 型 |
DT_INT8 | tf.int8 | 8 位 有 符 號 整 型 |
DT_UINT8 | tf.uint8 | 8 位 無 符 號 整 型 |
DT_STRING | tf.string | 可 變 長 度 的 字 節 數 組, 每 一 個 張 量 元 素 都 是 一 個 字 節 數 組 |
DT_BOOL | tf.bool | 布 爾 型 |
DT_COMPLEX64 | tf.complex64 | 由 兩 個 32 位 浮 點 數 組 成 的 復 數: 實 部 和 虛 部 |
DT_QINT32 | tf.qint32 | 用 於 量 化[ 9] 操 作 的 32 位 有 符 號 整 型 |
DT_QINT8 | tf.qint8 | 用 於 量 化 操 作 的 8 位 有 符 號 整 型 |
DT_QUINT8 | tf.quint8 | 用 於 量 化 操 作 的 8 位 無 符 號 整 型 |
佇列
FIFO先進先出
import tensorflow as tf
# 定義一個能在TensorFlow裡執行的先進先出佇列,佇列長度是3,資料型別是浮點
q = tf.FIFOQueue(3,'float')
# 初始化裡面的資料 入隊
init = q.enqueue_many(([0.1,0.2,0.3],))
# 取一個出佇列。這裡其實並沒有出去,因為還沒放在TensorFlow裡執行
x = q.dequeue()
# 定義y 的型別
y = x + 1
# 把y 放進去 q佇列 ,這裡也算是沒有執行
q_inc = q.enqueue([y])
with tf.Session() as sess:
# 這裡才算是初始佇列。
sess.run(init)
# 計算佇列的長度
quelen = sess.run(q.size())
for i in range(2):
# 執行兩次q_inc 等於上面寫好的類似於函式,需要放在session裡去執行
sess.run(q_inc)
print('---')
quelen = sess.run(q.size())
for i in range(quelen):
print(sess.run(q.dequeue()))
隨機佇列
好像是訓練時候可以進行無序輸入
import tensorflow as tf
# 建立一個隨機佇列
q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes='float')
with tf.Session() as sess:
# 執行10次入隊
for i in range(0,10):
sess.run(q.enqueue(i))
# 執行8次出隊
for i in range(0,8):
print(sess.run(q.dequeue()))
會發現結果是隨機出來的
佇列控制器
import tensorflow as tf
# 定義一個能在TensorFlow裡執行的先進先出佇列,佇列長度是3,資料型別是浮點
q = tf.FIFOQueue(100, 'float')
# 定義一個計數器變數
counter = tf.Variable(0.0)
# 給計數器+1
increment_op = tf.assign_add(counter, tf.constant(1.0))
# 將計數器放入佇列
enqueue_op = q.enqueue([counter])
# 這裡是個佇列管理器
qr = tf.train.QueueRunner(q, enqueue_ops=[increment_op, enqueue_op] * 1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# 這個是協調器,協調session執行緒和本地
coord = tf.train.Coordinator()
enqueue_threads = qr.create_threads(sess, start=True)
# 不然會包session錯誤,
coord.request_stop()
for i in range(10):
print(sess.run(q.dequeue()))
# 在這裡等著佇列結束,不然session結束了,佇列沒結束狂報錯
coord.join(enqueue_threads)