基本知识:
使用 TensorFlow, 必须明白 TensorFlow:
使用图 (graph) 来表示计算任务.
在被称之为 会话 (Session) 的上下文 (context) 中执行图.
使用 tensor 表示数据.(数据表示成张量)
通过 变量 (Variable) 维护状态.
使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.

TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].

一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.

1.计算图
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.

例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练 op.

2.构建图

构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.

Python 库中, op 构造器的返回值代表被构造出的 op 的输出, 这些返回值可以传递给其它 op 构造器作为输入.

TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点. 这个默认图对 许多程序来说已经足够用了. 阅读 Graph 类 文档 来了解如何管理多个图.

在一个会话中启动图

构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.

二种方式启动默认图:
1.

# 启动默认图.
sess = tf.Session()
result = sess.run(product)
print result
# 任务完成, 关闭会话.
sess.close()

2.

with tf.Session() as sess:
  result = sess.run([product])
  print result

为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.

基本概念:
tensor(张量)
TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor. 你可以把 TensorFlow tensor 看作是一个 n 维的数组或列表. 一个 tensor 包含一个静态类型 rank, 和 一个 shape.

一个张量有一个静态类型和动态类型的维数. 张量的维数来被描述为阶.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶是张量维数的一个数量描述.

你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量.对于一个二阶张量你可以用语句t[i, j]来访问其中的任何元素.而对于三阶张量你可以用’t[i, j, k]’来访问其中的任何元素.

数据类型
除了维度,Tensors有一个数据类型属性.你可以为一个张量指定下列数据类型中的任意一个类型:

Fetch
为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果.

变量:

demo

import tensorflow as tf

sess = tf.Session()
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)

print("node3:", node3)

print(sess.run(node3))

开启会话,创建一个包含三个结点的图,计算node1+node2.

但是这个计算是静态的,我们可以使用placeholders实时的输入数据。

import tensorflow as tf

sess = tf.Session()

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)

adder_node = a + b  #定义二个参数a,b.  后面再进行操作

#rank=1
print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 5], b: [4, 9]}))
print(sess.run(adder_node, {a: [1, 5, 7], b: [4, 9, 9]}))

#rank=2
print(sess.run(adder_node, {a: [[1, 5], [1, 5]], b: [[4, 9], [1, 5]]}))

#rank=3
print(sess.run(adder_node, {a: [[[1, 5], [1, 5]]], b: [[[4, 9], [1, 5]]]}))
print(sess.run(adder_node, {a: [[[1, 5]], [[1, 5]]], b: [[[4, 9]], [[1, 5]]]}))

demo

import tensorflow as tf

sess = tf.Session()

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)

adder_node = a + b  #定义二个参数a,b. 后面再进行操作
add_and_triple = adder_node * 3
print(sess.run(add_and_triple, {a: 3, b: 4.5}))

计算流图为:

结果:22.5

在机器学习中,我们通常会想要一个可以接受任意输入的模型。 为了使模型可训练,我们需要能够修改图形以获得具有相同输入的新输出。 Variables允许我们向图表添加可训练的参数。

当调用tf.constant时,常量被初始化,它们的值永远不会改变。 相比之下,当您调用tf.Variable时,变量不会被初始化。 要初始化TensorFlow程序中的所有变量,必须显式调用特殊操作。

import tensorflow as tf
sess = tf.Session()
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(linear_model, {x:[1,2,3,4]}))

我们创建了一个模型,但是我们不知道它有多好。 为了评估培训数据模型,我们需要一个y占位符来提供所需的值,我们需要编写一个损失函数。损失函数测量当前模型与提供的数据之间的距离。 我们将使用线性回归的标准损耗模型,它将当前模型和提供的数据之间的三角形的平方相加。linear_model - y创建一个向量,其中每个元素都是对应的示例的错误增量。我们调用tf.square的计算平方错误。 然后,我们求和所有平方误差,创建一个单一的标量,调用tf.reduce_sum计算出所有样本的误差:

import tensorflow as tf

sess = tf.Session()

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b

init = tf.global_variables_initializer()
sess.run(init)



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这样的操作进行更改。 例如,W = -1和b = 1是我们模型的最优参数。 我们可以相应地改变W和b:

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]}))