TensorFlow是Google开发的一款神经网络的Python外部的结构包,也是一个采用数据流图来进行数值计算的开源软件库。TensorFlow让我们可以先绘制计算结构图,也可以称是一系列可人机交互的计算操作,然后把编辑好的Python文件转换成更高效的C++文件,并在后端进行计算。
为什么要使用TensorFlow?
TensorFlow被认定为神经网络中最好用的库之一,它擅长的任务就是训练深度神经网络。通过使用TensorFlow我们就可以快速的入门神经网络,大大降低了深度学习(也就是深度神经网络)的开发成本和开发难度。最重要的是,TensorFlow完全开源。
线性回归
1 | import numpy as np |
2 | import tensorflow as tf |
3 | |
4 | ''' |
5 | TensorFlow: 线性回归 |
6 | ''' |
7 | |
8 | # 创建数据 |
9 | x_data = np.random.rand(100).astype(np.float32) |
10 | y_data = x_data*2.0 + 0.5 # 真实函数 |
11 | |
12 | # 搭建模型 |
13 | Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) |
14 | biases = tf.Variable(tf.zeros([1])) |
15 | y = Weights*x_data + biases # 拟合函数 |
16 | |
17 | # 计算误差 |
18 | loss = tf.reduce_mean(tf.square(y-y_data)) |
19 | |
20 | # 误差传递(梯度下降法) |
21 | optimizer = tf.train.GradientDescentOptimizer(0.5) |
22 | train = optimizer.minimize(loss) |
23 | |
24 | # 训练 |
25 | init = tf.global_variables_initializer() |
26 | sess = tf.Session() # 创建会话 |
27 | sess.run(init) # 必须步骤 |
28 | |
29 | # 输出训练结果 |
30 | print('step', 'Weights', 'biases') |
31 | for step in range(201): |
32 | sess.run(train) |
33 | if step % 20 == 0: |
34 | print(step, sess.run(Weights), sess.run(biases)) |
训练结果
1 | step Weights biases |
2 | 0 [0.24800181] [1.9143714] |
3 | 20 [1.5050483] [0.7566634] |
4 | 40 [1.87493] [0.5648566] |
5 | 60 [1.968396] [0.51638865] |
6 | 80 [1.9920139] [0.5041413] |
7 | 100 [1.997982] [0.5010464] |
8 | 120 [1.9994901] [0.5002644] |
9 | 140 [1.9998711] [0.5000668] |
10 | 160 [1.9999673] [0.5000169] |
11 | 180 [1.9999917] [0.50000435] |
12 | 200 [1.9999979] [0.5000011] |
最终得到的拟合模型y=x*1.9999979+0.5000011
与真实函数y_data = x_data*2.0 + 0.5
非常接近。
Session会话控制
Session
是 Tensorflow 为了控制和输出的执行语句,运行 session.run()
可以获得你需要的运算结果。下面是Session
的两种打开方式。
1 | import tensorflow as tf |
2 | |
3 | ''' |
4 | TensorFlow: Session会话控制 |
5 | ''' |
6 | |
7 | matrix1 = tf.constant([[3, 3]]) |
8 | matrix2 = tf.constant([[2], |
9 | [2]]) |
10 | product = tf.matmul(matrix1, matrix2) # matrix multiply |
11 | |
12 | # method 1 |
13 | sess = tf.Session() |
14 | result1 = sess.run(product) |
15 | print(result1) |
16 | sess.close() |
17 | |
18 | # method 2 |
19 | with tf.Session() as sess: |
20 | result2 = sess.run(product) |
21 | print(result1) |
输出结果
1 | [[12]] |
2 | [[12]] |
Variable变量
在 TensorFlow 中,定义了某字符串是变量,它才是变量。state = tf.Variable()
1 | import tensorflow as tf |
2 | |
3 | ''' |
4 | TensorFlow: Variable 变量 |
5 | ''' |
6 | |
7 | state = tf.Variable(0, name='counter') # define variable |
8 | print(state.name) |
9 | |
10 | one = tf.constant(1) |
11 | |
12 | new_value = tf.add(state, one) |
13 | update = tf.assign(state, new_value) |
14 | |
15 | init = tf.global_variables_initializer() # must have initialize if define variables |
16 | |
17 | with tf.Session() as sess: |
18 | sess.run(init) # 激活init这一步骤 |
19 | for _ in range(3): |
20 | sess.run(update) |
21 | print(sess.run(state)) |
输出结果
1 | counter:0 |
2 | 1 |
3 | 2 |
4 | 3 |
Placeholder传入值
placeholder
是 TensorFlow 中的占位符,暂时储存变量。如果想要从外部传入data,那就需要用到 tf.placeholder()
,把需要传入的值放在feed_dict={}
并一一对应每一个 input
,然后以这种形式传输数据 sess.run(***, feed_dict={input: **})
。因此,placeholder
与 feed_dict={}
是绑定在一起出现的。
1 | import tensorflow as tf |
2 | |
3 | ''' |
4 | TensorFlow: Placeholder传入值 |
5 | ''' |
6 | |
7 | # define type of placeholder in TensorFlow(often type is float32) |
8 | input1 = tf.placeholder(tf.float32) |
9 | input2 = tf.placeholder(tf.float32) |
10 | |
11 | # tf.multiply do multiply between input1 and input2 |
12 | ouput = tf.multiply(input1, input2) |
13 | |
14 | with tf.Session() as sess: |
15 | print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]})) |
输出结果
1 | [14.] |
Activation Function激励函数
- 激励函数是为了解决不能用线性方程(linear function)概括的问题,把整个神经网络简化成式子:
y = Wx
(W是需要求解的参数,y是预测值,x是输入值)即可解决。 - 激励函数必须是可微分的,因为在 backpropagation 误差反向传递的时候,只有这些可微分的激励函数才能把误差传递回去。
- 在卷积神经网络 Convolutional neural networks 的卷积层中,推荐的激励函数是 relu。在循环神经网络中 recurrent neural networks,推荐的是 tanh 或者是 relu 。
- 激励函数运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经系统。
- 激励函数的实质是非线性方程。 Tensorflow 里面处理较为复杂的问题时都会需要运用激励函数
activation function
。
Activation Functions in TensorFlow
The activation ops provide different types of nonlinearities for use in neural networks. These include smooth nonlinearities (sigmoid
, tanh
, elu
, selu
, softplus
, and softsign
), continuous but not everywhere differentiable functions (relu
, relu6
, crelu
and relu_x
), and random regularization (dropout
).
All activation ops apply componentwise, and produce a tensor of the same shape as the input tensor.
tf.nn.relu
tf.nn.relu6
tf.nn.crelu
tf.nn.elu
tf.nn.selu
tf.nn.softplus
tf.nn.softsign
tf.nn.dropout
tf.nn.bias_add
tf.sigmoid
tf.tanh
Dropout 解决 overfitting
- Overfitting 也被称为过度学习,过度拟合。
- 简单说就是对训练数据拟合效果特别好,但是对测试数据预测能力很差。
- TensorFlow提供了强大的dropout方法来解决overfitting问题。
- 保留概率
keep_prob
是我们要保留结果所占比例,作为一个placeholder
,在run
时传入。当keep_prob=1
的时候,相当于100%保留,也就是dropout没有起作用。