TensorFlow-1 基础架构

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: **})。因此,placeholderfeed_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.

Dropout 解决 overfitting

  • Overfitting 也被称为过度学习,过度拟合。
  • 简单说就是对训练数据拟合效果特别好,但是对测试数据预测能力很差。
  • TensorFlow提供了强大的dropout方法来解决overfitting问题。
  • 保留概率keep_prob是我们要保留结果所占比例,作为一个placeholder,在run时传入。当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。