核心概念
- 计算图
- 又称为有向图,数据流图
- 数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。
- “节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。
- “线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。
- 张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train_step = optimizer.minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
if i % 50 == 0:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
- 操作
- 一个运算操作代表了一种类型的抽象运算,比如矩阵乘法或向量加法
- 一个运算操作可以有自己的属性,但是所有属性都必须被预先设置,或者能够在创建计算图时根据上下文推断出来
- 通过设置运算操作的属性可以用来支持不同的tensor元素类型,比如让向量加法支持浮点数或者整数
- 运算核是一个运算操作在某个具体的硬件的实现
- 在tf中,可以通过注册机制加入新的运算操作或者为已有的运算操作添加新的计算核
- 变量
- 当训练模型时,用变量 来存储和更新参数。变量包含张量(tensor)存放于内存的缓存区。建模时,它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析时被加载。
- 创建
- 当创建一个变量时,你将一个张量作为初始值传入构造函数Variable()。Tensorflow提供一系列的操作符来初始化张量,初始值是常量或者是随机值
- 所有这些操作符都需要指定张量的shape。那个形状自动成为变量的shape。变量的shape通常是固定的,但tf提供了高级的机制来重新调整其行列数
- 初始化
- 会话
实现原理
- TensorFlow有一个重要组件client,也就是客户端,它通过Session的接口与master以及多个worker相连接。每一个worker可以与多个硬件设备相连,比如CPU和GPU,并负责管理这些硬件。Master则负责指导所有的worker按照流程执行计算图。
- TensorFlow有单机模式和分布式模式。