TensorsTensorFlow的数据中央控制单元是tensor(张量),一个tensor由一系列的原始值组成,这些值被形成一个任意维数的数组。
The Computational Graph 计算图
TensorFlow核心程序由两个部分组成:
- Building the computational graph 构建计算图
- Running the computational graph 运行计算图
节点与会话
TensorFlow 是图计算,op为计算的节点,运行时需要用tf.session来执行graph
import tensorflow as tf
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0)# also tf.float32 implicitly
print(node1, node2)
结果:
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0",shape=(), dtype=float32)
要想得到答应结果,需要调用session会话来运行:
sess = t f.Session()
print(sess.run([node1, node2])
node3 = tf.add(node1, node2)
print("node3:", node3)
print("sess.run(node3):", sess.run(node3))
结果:
node3:Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3):7.0
TensorFlow提供一个统一的调用称之为TensorBoard,它能展示一个计算图的图片;如下面这个截图就展示了这个计算图
TensorFlow中的数据变量
-
constant:常量,当被调用时常量被初始化,其值是不可以改变的
-
variable:变量,每次需要使用sess.run(tf.golbal_variables_initializer())来初始化变量,可以用tf.assign来改变这个值
-
placeholder: 可以参数化的接收外部的输入,通过feed_dict来传递参数
-
Constant
常量,当被调用时常量被初始化,其值是不可以改变的 -
Variable
变量,每次需要使用sess.run(tf.golbal_variables_initializer())来初始化变量,可以用tf.assign来改变这个值
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
'''初始化variable'''
init = tf.global_variables_initializer()
sess.run(init)
要实现初始化所有全局变量的TensorFlow子图的的处理是很重要的,直到我们调用sess.run,这些变量都是未被初始化的。
既然x是一个占位符,我们就可以同时地对多个x的值进行求值linear_model,例如:
print(sess.run(linear_model, {x: [1,2,3,4]}))
# 输出为: [0. 0.30000001 0.60000002 0.90000004]
- Placeholder占位符
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
print(sess.run(adder_node, {a:3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2,4]}))
结果:
7.5
[3. 7.]
Loss function 损失函数 或 cost function
- 损失函数是模型输出和观测结果间概率分布差异的量化
- 均方误差损失最为常用,平方避免了真负值低消,平方关系又放大了较大误差与较小误差间的差距(对较大误差惩罚力度更大,二队较小误差更为容忍)
- 在最小二乘法中,它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小),其表达式为
- 我们将会使用一个标准的损失模式来线性回归,它的增量平方和就是当前模型与提供的数据之间的损失
,linear_model - y创建一个向量,其中每个元素都是对应的示例错误增量。这个错误的方差我们称为tf.square。然后
,我们合计所有的错误方差用以创建一个标量,用tf.reduce_sum抽象出所有示例的错误
y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x: [1,2,3,4], y: [0, -1, -2, -3]}))
输出的结果为
23.66
- 我们分配一个值给W和b(得到一个完美的值是-1和1)来手动改进这一点,一个变量被初始化一个值会调用tf.Variable,
但是可以用tf.assign来改变这个值,例如:fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x: [1,2,3,4], y: [0, -1, -2, -3]}))
最终打印的结果是:
0.0
- tf.train APITessorFlow提供optimizers(优化器),它能慢慢改变每一个变量以最小化损失函数,最简单的优化器是
gradient descent(梯度下降),它根据变量派生出损失的大小,来修改每个变量。通常手工计算变量符号是乏味且容易出错的,
因此,TensorFlow使用函数tf.gradients给这个模型一个描述,从而能自动地提供衍生品,简而言之,优化器通常会为你做这个。例如:
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init)# reset values to incorrect defaults.
for iin range(1000):
sess.run(train, {x: [1,2,3,4], y: [0, -1, -2, -3]})
print(sess.run([W, b]))
输出结果为
[array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]