TensorFlow用于进行深度学习的训练,比较常用。我们大多数TF是用于python'的,但是TF的编程过程和普通的python不一样,这个要适应一下才行。
TF是基于之前的深度学习基础的,所以要理解里面的内容,基础还是要学扎实,出门左转,见前面十篇讲解。
掌握基础后,建议先了解一下基本的TF概念,然后按照每个经典的模型进行学习(比如:神经网络,CNN,RNN)。因为每个模型其实代码都差不多,调整一下基本也就可以用于不同的场景。
多调试几次这些网络模型,后面再扩展的学习,那些就是高级用法了。
本章节先介绍基本的TF概念。
TF的基本运行模式:建图->启动图->运行取值
这里的建图其实是数学模型,这个模型是用图表达的,比如这种图:
图瞅一眼就可以了,不用深入理解,只是要大家知道,TF是先建立数学模型(先不计算)然后再导入数据用模型计算的。
那么为了建立模型,TF用张量标识模型中要计算的代数,比如,x,y等。
TF中,有三类张量:
1. 常量constant
import tensorflow as tf
# 创建一个 常量 op, 返回值 'matrix1' 代表这个 1x2 矩阵.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个 常量 op, 返回值 'matrix2' 代表这个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
2. 变量
state = tf.Variable(0, name="counter")
什么时候用变量?通常是在我们整个计算过程中,需要不断迭代的那些代收,我们就做成变量。比如前章节做梯度下降算法时的w,这个w用梯度下降时,就是不断的从初值开始不断的迭代变化的。所以这个地方用变量,给个例子:
# -创建一个变量, 初始化为标量 0. 初始化定义初值
state = tf.Variable(0, name="counter")
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
3. placeholder
这个在中文怎么翻译我也不懂,不过上面几个概念在不同的TF都有说明只是真的不好懂,我总结这个placeholder其实就是迭代要导入的数据。
迭代中不断迭代的用变量,但是样本数据,是要一条一条的数带入公式,进行计算的,这类数据转换成公式,就要用placeholder了,换句话说,placeholder通常在建立好模型,公式后,要导入的(就是feed的,这个后面会讲)。
通过三个类型的张量,建立模型。所以上面给的例子,全部都是模型,注意:只是建立模型,不是进行实际的运算的。
那么,要进行运算应该怎么样呢?就是后面两步启动图和运行取值。
在TF中,启动图,就是创建一个运行session(会话)并初始化:
sess = tf.Session()
......
sess.run(.....) #就是真正的执行运算,并返回结果
......
sess.close()
启动会话tf.Session()
然后用会话tf.run。tf.run就是计算的意思,tf.run(object,feed_dic=xxxxx)这个是使用方法,object是要计算的目标参数。feed_dic就是这个数学模型要带入的数据,当然是带入到placeholder里面的。
我们看看一个完整的例子:
# -创建一个变量, 初始化为标量 0. 初始化定义初值
state = tf.Variable(0, name="counter")
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 才真正通过Tensorflow的initialize_all_variables对这些变量赋初值
init_op = tf.initialize_all_variables()
# 启动默认图, 运行 op
with tf.Session() as sess:
# 运行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
# 取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时,
# 传入一些 tensor, 这些 tensor 会帮助你取回结果.
# 此处只取回了单个节点 state,
# 也可以在运行一次 op 时一起取回多个 tensor:
# result = sess.run([mul, intermed])
print sess.run(state)
# 运行 op, 更新 'state', 并打印 'state'
for _ in range(3):
sess.run(update)
print sess.run(state)
# 输出:
# 0
# 1
# 2
# 3
可以看到,最后的sess.run(state)就是在求state的值
以上部分,是存粹的TF介绍,如果没有AI基础的话,应该也能看懂。
下面再补充一个例子,就是之前最简单的双维度参数拟合单结果的最简单训练(这个需要前面的基础了,但比较简单,只是到梯度下降那里,还不构成神经网络):
# (tensorflow)$ python 用 Python API 写 TensorFlow 示例代码
import tensorflow as tf
import numpy as np
# 用 NumPy 随机生成 100 个数据
x_data = np.float32(np.random.rand(2, 100))
y_data = np.dot([0.100, 0.200], x_data) + 0.300
# 构造一个线性模型
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 初始化变量
init = tf.initialize_all_variables()
# 启动图 (graph)
sess = tf.Session()
sess.run(init)
# 拟合平面
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
# 输出结果为:
0 [[-0.14751725 0.75113136]] [ 0.2857058]
20 [[ 0.06342752 0.32736415]] [ 0.24482927]
40 [[ 0.10146417 0.23744738]] [ 0.27712563]
60 [[ 0.10354312 0.21220125]] [ 0.290878]
80 [[ 0.10193551 0.20427427]] [ 0.2964265]
100 [[ 0.10085492 0.201565 ]] [ 0.298612]
120 [[ 0.10035028 0.20058727]] [ 0.29946309]
140 [[ 0.10013894 0.20022322]] [ 0.29979277]
160 [[ 0.1000543 0.20008542]] [ 0.29992008]
180 [[ 0.10002106 0.20003279]] [ 0.29996923]
200 [[ 0.10000814 0.20001261]] [ 0.29998815]
如果你实在不愿意看前面章节,这里简单补充说明一下吧。
上述这个代码,建立的一个如下的数学模型
y=++b
其中x和w都是矩阵(二维数组),里面包含了,
loss = tf.reduce_mean(tf.square(y - y_data))
这个是计算偏差值,这里用的是方差,即,计算实际的y值和样本的y值之间的差距。
optimizer = tf.train.GradientDescentOptimizer(0.5)
这个是求偏差最小值的方法,即梯度下降。
详细概念不展开,看以前的文章吧。