一 概念介绍
理论研究表明,神经网络隐含层,层数越多,所需要的隐含节点可以越少。
1.过拟合
有一种方法叫Dropout,在使用复杂的卷积神经网络训练图像数据时尤其有效,简单说,就是将神经网络某一层的输出节点数据随机丢弃一部分。实质上等于创造出了很多新的随机样本,通过增大样本量、减少特征数量来防止过拟合。
2.调参
拿SGD来举例,不同的学习速率可能会有不同的局部最优解。Adagrad等自适应的方法可以减轻调试参数的负担。
3.梯度弥散
在ReLu激活函数出现之前,大多用Sigmoid激活函数,但是Sigmoid函数在反向传播中梯度值会逐渐减小,经过多层的传递后会呈指数级急剧减小,这种情况下,根据训练数据的反馈来更新神经网络的参数会非常缓慢。
二 Tensorflow实现多层感知器
1.导入库
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
2.初始化模型参数结构
in_units = 784 # 输入节点数
h1_units = 300 # 隐含层输出节点数
W1 = tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=0.01))
b1 = tf.Variable(tf.zeros([h1_units]))
W2 = tf.Variable(tf.zeros([h1_units,10]))
b2 = tf.Variable(tf.zeros([10]))
x = tf.placeholder(tf.float32,[None,in_units])
keep_prob = tf.placeholder(tf.float32) # Dropout的比率,一种防止过拟合的方法。
hidden1 = tf.nn.relu(tf.matmul(x,W1) + b1) # 隐含层
hidden1_drop = tf.nn.dropout(hidden1,keep_prob) # 随机将一部分节点置为0,keep_prob即为保留数据而不置为0的比例。
y = tf.nn.softmax(tf.matmul(hidden1_drop,W2) + b2)
y_ = tf.placeholder(tf.float32,[None,10]) # 预测结果
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),
reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy) #利用Adagrad缓解参数调优问题。
3.模型训练
tf.global_variables_initializer().run()
for i in range(3000):
batch_xs,batch_ys = mnist.train.next_batch(100) #一共30W样本
train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75}) # 保留75%的节点,其余都置为0
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) # 预测相等的样本数
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) # 准确率
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels,
keep_prob: 1.0}))
# 评估
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) # 预测相等的样本数
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) # 准确率
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels,
keep_prob: 1.0}))
三 总结
多层神经网络(MLP)加入了隐含层,解决了单层神经网络无法解决XOR问题,引入了非线性。
早期的神经网络没有隐含层,无法解决XOR问题。因为没有隐含层的神经网络是线性的
相比之前的SoftMax,我们的准确率大幅提升,这里我们添加一个隐含层,并使用了 Dropout、Adagrad、ReLU方法。