TensorFlow-2 搭建第一个神经网络

用TensorFlow搭建第一个神经网络。

第一个神经网络

1
import numpy as np
2
import tensorflow as tf
3
import matplotlib.pyplot as plt
4
5
'''
6
TensorFlow: 第一个神经网络
7
输入层(1个神经元)-> 隐藏层(10个神经元)-> 输出层(1个神经元)
8
'''
9
10
11
# 构建一个神经层函数
12
def add_layer(inputs, in_size, out_size, activation_function=None):
13
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
14
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
15
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
16
    if activation_function is None:  # 激励函数为空
17
        outputs = Wx_plus_b
18
    else:
19
        outputs = activation_function(Wx_plus_b)
20
    return outputs
21
22
23
# 导入数据
24
x_data = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis]
25
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)  # 噪声
26
y_data = np.square(x_data) - 0.5 + noise  # 有噪声的一元二次函数
27
28
xs = tf.placeholder(tf.float32, [None, 1])  # 用占位符定义神经网络的输入
29
ys = tf.placeholder(tf.float32, [None, 1])  # 用占位符定义神经网络的输出
30
31
# 搭建网络
32
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)  # 用add_layer()定义隐藏层
33
prediction = add_layer(l1, 10, 1, activation_function=None)
34
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))  # 计算误差
35
36
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)  # 训练以提升准确率,0.1为学习效率(通常小于1)
37
38
init = tf.global_variables_initializer()  # 初始化变量
39
sess = tf.Session()  # 创建会话
40
sess.run(init)
41
42
# 真实数据可视化
43
fig = plt.figure()
44
ax = fig.add_subplot(1, 1, 1)
45
ax.scatter(x_data, y_data)
46
plt.ion()  # 显示图后不暂停
47
plt.show()  # 显示图后暂停
48
49
# 开始训练
50
for i in range(1000):  # 让机器学习1000次
51
    # train_step是学习的内容
52
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
53
    if i % 50 == 0:  # 每50步输出学习误差
54
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
55
        try:
56
            ax.lines.remove(lines[0])
57
        except Exception:
58
            pass
59
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
60
        # 预测数据可视化
61
        lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
62
        plt.pause(0.1)

输出结果

1
0.120945826
2
0.009924126
3
0.008414253
4
0.007410705
5
0.006749772
6
0.006223758
7
0.0058117723
8
0.0055014477
9
0.0052584694
10
0.0050658723
11
0.004908645
12
0.004763277
13
0.0046276315
14
0.004497925
15
0.0043876884
16
0.0042877905
17
0.0041945437
18
0.0041121077
19
0.0040460215
20
0.0039961385

可以看出误差在逐渐减小,说明学习有效。

可视化

原始数据 预测数据

加速神经网络训练(Speed Up Training)

  • Stochastic Gradient Descent (SGD)
  • Momentum
  • AdaGrad
  • RMSProp
  • Adam

Stochastic Gradient Descent (SGD)

  • SGD:将庞大的Data拆分成很多小的data,然后分批次进行神经网络训练。

Momentum 更新方法

  • 大多数途径:W += -Learning rate * dx,即对原始W累加一个负的学习率乘以校正值。
  • Momentum:m = b1 * m - Learning rate * dxW += m,即沿着坡度下降,路径不再那么曲折。

AdaGrad 更新方法

  • AdaGrad:v += dx^2W += -Learning rate * dx / sqrt(v),立足于学习率的更新方法。

RMSProp 更新方法

  • RMSProp:v = b1 * v + (1 - b1) * dx^2W += -Learning rate * dx / sqrt(v),即基本涵盖了 Momentum和AdaGrad的优势。

Adam 更新方法

  • m = b1 * m + (1 - b1) * dx:Momentum
  • v = b2 * v + (1 - b2) * dx^2:AdaGrad
  • W += -Learning rate *m / sqrt(v)
  • Momentum+AdaGrad,有最好的加速效果。

优化器

  • TensorFlow 中有很多不同种类的优化器,最基本最常用的是GradientDescentOptimizer
  • TensorFlow所有优化器:TensorFlow Optimizer