Tensorflow 基本概念
Table of Contents
1 Tensorflow 介绍
1.0.1 基本概念
- 使用图 (Graphs) 来表示 计算规划;
- 使用 Tensor 表示 数据
- 图中的节点称之为 操作 (operation), 一个操作获得 0 个或 n 个 Tensor
- 使用 feed 为操作 赋值, 使用 fetch 从操作中 取值
- 在被称之为会话(Session)的上下文(Context)中 执行 图(graphs)
- 通过变量(variable)维护 状态
1.0.2 tensorflow 使用流程总结
3步骤: 准备数据, 图构建, 图计算 | | | | | | 数, 构, 计 | | | | / \ 一模,两函,两器 运行两器
1.0.3 eg: 创建图和计算图
import tensorflow as tf # graph => feed/fetch(op(tensor)) # | # | do computation # v # session # ======= 构图 ====== # tensors shape 1*2 cons1 = tf.constant([[1, 2]]) # tensors shape 2*1 cons2 = tf.constant([[1], [2]]) # ops matrix multiply mat_product = tf.matmul(cons1, cons2) print(mat_product) # 这个只会打印 'result1' 对象引用信息 # ======= 对话 方式1 ====== # 必须执行关闭操作 sess = tf.Session() result = sess.run(result1) print(result) # 这个只会打印 'result1' 对象引用信息 sess.close() # ======= 对话 方式2 ====== # 不用执行关闭操作 with tf.Session() as sess: result = sess.run(result1) print(result) # 这个只会打印 'result1' 对象引用信息
1.0.4 eg: 变量的使用
- 使用之前必须初始化(初始化是一个op,图执行计算之前,必须先运行该初始化op)
import tensorflow as tf x = tf.Variable([1, 2]) a = tf.constant([3, 3]) # 减法 op sub = tf.subtract(x, a) # 加法 op add = tf.add(x, sub) # initializer op init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print(sess.run(sub)) # error FailedPreconditionError (see above for # traceback): Attempting to use uninitialized value Variable_1 print(sess.run(add))
1.0.5 eg: 变量循环自增
# variable, initialize with 0 # state = 0 state = tf.Variable(0, name='counter') # 加法 op, 使state加1 # new_value = state + 1 new_value = tf.add(state, 1) # 赋值 op # state = new_value update = tf.assign(state, new_value) init= tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print(sess.run(state)) for _ in range(5): sess.run(update) print(sess.run(state))
1.0.6 eg: fetch and feed
fetch 和 feed 是 sess.run()
参数的两种进阶形式, fetch 是说第一个参数(输出节点)
可以使 one node, 也可以是 list of nodes; feed 是说第二个参数(输入节点)可以以字典
({占位符引用:list of values, 占位符引用: list of values, 占位符引用: list of
values, ...}
) 的形式给图中的占位符喂数据. 这里为什么字典值是 list of values
因为这里实际上应该是 Dataset, run() 函数会每次从中取一行(也就是一个sample)输入
placeholder中.
关于 variable 和 placeholder 的区别, variable 是一个 dependent 量, 他的值需要依赖其他 node 值, 这有点像是 y = x + 3 中的 y. 他常常用在 hypothesis function 的表达中, 比如 y=wx+b 其中. w,b 就是 variable; placeholder 不是 dependent 量, 他的值不需要依赖计算, 而是直接从外部给出, 可以说 placeholder 是为 variable 生. y=wx+b 中 x 和 y 就是 placeholder 他们代表已知的数据集和标签.
注意, placeholder 的shape与数据集的shape是一样的. 假设你要输入的数据集是 (60000, 784) 维度,那么你设置的 placeholder 也应该是 (60000, 784)
variable ===> initializer
placeholder ===> run(xxx, feed_dict{}})
- fetch 是指图在会话中计算的时候可以一次计算多个节点
import tensorflow as tf # fetch 同时执行多个 op 得到运行结果 input1 = tf.constant(3.0) input2 = tf.constant(2.0) input3 = tf.constant(5.0) # add op add = tf.add(input2, input3) # multiply op mul = tf.multiply(input1, add) with tf.Session() as sess: # print(sess.run(mul)) result = sess.run([mul, add]) # fetch print(result)
- feed 是指以字典形式给 placeholder 喂数据.
# 创建占位符 input1 = tf.placeholder(tf.float32) input2 = tf.placeholder(tf.float32) # multiply op output = tf.multiply(input1, input2) with tf.Session() as sess: # 以字典形式 feed 数据 print(sess.run(output, feed_dict={input1:[7.0], input2:[2.0]}))
1.0.7 简单实例
import numpy as np import tensorflow as tf # 1. 数据集准备 # 使用numpy生成100个随机点 x_data = np.random.rand(100) y_data = x_data * 0.1 + 0.2 # 2. 图构建 # 构造一个线性"模"型 b = tf.Variable(0.) k = tf.Variable(0.) y = k * x_data + b # 二次代价"函"数 loss = tf.reduce_mean(tf.square(y_data - y)) # 优化"器" optimizer = tf.train.GradientDescentOptimizer(0.2) # 最小化代价"函"数(argmin 函数) train = optimizer.minimize(loss) # 初始化"器" init = tf.global_variables_initializer() # 3. 图计算 with tf.Session() as sess: sess.run(init) # 运行初始化"器" for step in range(201): sess.run(train) # 运行优化"器" if step % 20 == 0: print(step, sess.run([k, b, loss]))