tensorflow学习笔记一

系统架构

tensorflow学习笔记一

运算

正常的运算

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)