Contents
  1. 1. TensorFlow计算模型—计算图(Computation Graph)
  2. 2. TensorFlow数据模型—张量(Tensor)
  3. 3. Tensorflow运行模型—会话(Session)
  4. 4. 占位符(tf.placeholder)
  5. 5. 变量(tf.Variable)
  6. 6. TensorFlow实现线性回归

Tensorflow是谷歌开源的一款深度学习工具,与其他深度学习工具(比如caffe、Deeplearning4j等)相比,其受关注度和欢迎程度尤为突出。在谷歌内部,Tensorflow已经广泛用于语音搜索、广告、电商、图片、街景图、翻译、Youtube等众多产品中。

TensorFlow计算模型—计算图(Computation Graph)

  1. TensorFlow中的所有计算都会被转化为计算图上的节点,节点之间的边描述了计算之间的依赖关系
  2. TF是一个通过计算图的形式表示计算的编程系统
  3. TF程序通常分两个阶段:1. 定义计算图中所有的计算; 2. 执行计算
  4. TF程序自动维护一个默认的计算图,可通过tf.get_default_graph函数获取
  5. 不同计算图上的张量和运算不共享

1
2
3
4
5
6
7
import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = a + b
# 或者直接使用tf的add方法
result1 = tf.add(a, b, name='add')

TensorFlow数据模型—张量(Tensor)

  1. TF管理数据的形式
  2. 张量:可简单地理解为多维数组

    • 零阶张量为标量,表示一个数
    • 一阶张量为一个一维数组
    • n阶张量为一个n维数组
  3. TF中的张量并没有真正保存数据,而是存储的运算结果的引用,即张量保存的是如何得到结果的计算过程

  4. 张量主要保存三个属性:名字(name)、维度(shape)、类型(dtype)。以如下张量为例Tensor(“a_3:0”, shape=(2,), dtype=float32)
    • “a_3:0”: a_3表示计算图中节点的名称,而冒号后面的”0”表示当前张量来自该节点第一个输出(编号从0开始)
    • shape=(2,): 表示张量为一个一维数组,数组长度为2
    • dtype=float32: Tensorflow会对参与运算的所有张量进行类型的检查,当发现类型不匹配时会报错
  5. 张量的使用大致可分为两类:

    • 作为中间计算结果的引用,提高程序的可读性
    • 通过张量获得计算结果,即真实的数据tf.Session().run()

      Your CPU supports instructions that this TensorFlow binary was not compiled
      Python环境下使用sesson.run会有如上提示,主要意思就是提示你可以通过**加速CPU,暂时可以使用如下命令忽略

      1
      2
      import os
      os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

Tensorflow运行模型—会话(Session)

  1. Session用于管理TF程序运行时的所有资源
  2. 两种模式:
    • 明确调用会话生成函数和关闭会话函数
    • 通过Python上下文管理器使用会话
  3. TF不会自动生成默认的会话,需要手动指定。默认的会话被指定后可通过tensor_obj.eval()计算张量的取值
  4. 交互环境下,使用tf.InteractiveSession,该函数会自动将生成的会话注册为默认会话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 明确创建及关闭一个会话
sess = tf.Session()
print(sess.run(result))
sess.close()
# 通过Python上下文管理器来管理会话
with tf.Session() as sess:
print(sess.run(result))
# 手动指定默认的会话
sess = tf.Session()
with sess.as_default():
print(result.eval())
# tf.InteractiveSession
sess = tf.InteractiveSession()
print(result.eval())
sess.close()

占位符(tf.placeholder)

用于传递真实的样本,创建时不必指定初始值,可在运行时,通过Session.run函数的feed_dict的参数指定(feed_dict可省略)

1
2
3
4
5
6
7
8
9
10
sess = tf.InteractiveSession()
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b
print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, {a: 3, b: 4.5}))

变量(tf.Variable)

用于可变的训练变量,如模型的权重或者偏置

  • 创建时必须提供初始值
  • 变量的值会随在模型的训练而更改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sess = tf.InteractiveSession()
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 = 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]}))
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]}))
## tf.train
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init) # 重新设置初始化参数
for i in range(1000):
sess.run(train, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]})
print(sess.run([W, b]))

TensorFlow实现线性回归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})
print("W: %s b: %s loss: %s" % (curr_W, curr_b, curr_loss))
Contents
  1. 1. TensorFlow计算模型—计算图(Computation Graph)
  2. 2. TensorFlow数据模型—张量(Tensor)
  3. 3. Tensorflow运行模型—会话(Session)
  4. 4. 占位符(tf.placeholder)
  5. 5. 变量(tf.Variable)
  6. 6. TensorFlow实现线性回归