TensorFlow - 基础笔记

自学TensoFlow,备忘笔记

TensorFlow - 基础笔记

1 概念

1.1 TensorFlow基本概念

TensorFlow包含以下主要元素

  • graph
    • 表示计算
    • 一个graph包含若干节点,即op ( operation
  • op
    • graph的节点
    • 输入/输出为0或n个tensor
  • Session
    • 执行graph
  • tensor
    • 表示数据
    • 例如:a mini-batch of images可表示为4-D array, [batch, height, width, channels]
  • Variable
    • 维护状态信息
  • feed / fetch
    • feed 数据传入
    • fetch 数据传出

1.2 TensorFlow过程原理

  1. 打开Session
  2. Session启动graph
  3. Sessiongraph的节点ops(operation)分发到可用的设备上,如CPUs/GPUs,并提供执行op的methods
  4. op收到0或n个tensor后执行methods以计算,methods执行后,输出的相应的0或n个tensor

注:

  1. 在Python 语言中, 将返回numpy的ndarray 对象; 在C 和C++ 语言中, 将返回tensorflow::Tensor实例。

2 TensorFlow编程

2.1 两个阶段

TensorFlow程序通常包含以下两个阶段:

  1. construction phase 构建阶段,组装出graph
  2. execution phase 执行阶段,用Session执行graph的ops

2.2 构建图并执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import tensorflow as tf

# create constants
matrix1 = tf.constant([[3., 3.]]) # 1×2的矩阵[3 3]
matrix2 = tf.constant([[2.], [2,]]) # 2×1的矩阵[2; 2]

# create a matmul(matrix multiply) op
product = tf.matmul(matrix1, matrix2)

# with-block
# by using with-block, session would be closed and release resources automatically
with tf.Session() as sess:
result = sess.run(product)
print(result)

# or
# construct session, launch graph, execute and close mannually
#
# sess = tf.Session()
# result = sess.run(product)
# print(result)
# sess.close()
  • TensorFlow事实上通过一个“翻译”过程,将定义的graph转化为不同的可用计算资源间实现分布计算的操作(op, operations),如:CPU或GPU。通常不需要用户指定具体使用的CPU或GPU,TensorFlow能自动检测并尽可能的充分利用找到的第一个GPU进行运算。

2.3 指定设备

1
2
3
4
5
6
7
with tf.Session() as sess:
with tf.device("/gpu:0"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.], [2,]])
product = tf.matmul(matrix1, matrix2)
result = sess.run(product)
print(result)
  • 通过tf.device(...)指定用于执行的设备

设备字符串:

  • "/cpu:0"
    • 1st CPU, 即设备的CPU
  • "/gpu:0"
    • 1st GPU, 即设备的GPU
  • "/gpu:1"
    • 2nd GPU, 即设备的第二块GPU(如果有)
  • 以此类推…

2.4 Tensor

TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,ops(operations)之间传递的数据都是tensor

你可以把tensor看作是一个n维的数组或列表。一个tensor包含一个static type, 一个rank和一个shape

2.5 Variable

Variable维持graph执行过程中的状态信息。

例如,使用Variable实现一个计数器(Counter):

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
state = tf.Variable(0, name="counter")
one = tf.constant(1)
# Create an Op to add one to `state`.
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# Variables must be initialized by running an `init` Op after having
# launched the graph. We first have to add the `init` Op to the graph.
init_op = tf.initialize_all_variables()

# Launch the graph and run the ops.
with tf.Session() as sess:
# Run the 'init' op
sess.run(init_op)
# Print the initial value of 'state'
print(sess.run(state))
# Run the op that updates 'state' and print 'state'.
for _ in range(3):
sess.run(update)
print(sess.run(state))

# output:

# 0
# 1
# 2
# 3

2.6 Fetch

1
2
3
4
5
6
7
8
9
10
11
12
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
result = sess.run([mul, intermed])
print(result)

# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
  • Fetch both mul‘s result and intermed‘s result.

2.7 Feed

1
2
3
4
5
6
7
8
9
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

# output:
# [array([ 14.], dtype=float32)]
  • 使用tf.placeholder(...)来创建占位符,用于直接给op传入一个tensor

TensorFlow also provides a feed mechanism for patching a tensor directly into any operation in the graph.

TensorFlow.org

TensorFlow官方文档中文版 - 极客学院