TensorFlow实现MLP多层感知机模型

  

<强>一、多层感知机简介

  

Softmax回归可以算是多分类问题物流回归,它和神经网络的最大区别是没有隐含层。理论上只要隐含节点足够多,即时只有一个隐含层的神经网络也可以拟合任意函数,同时隐含层越多,越容易拟合复杂结构。为了拟合复杂函数需要的隐含节点的数目,基本上随着隐含层的数量增多呈指数下降的趋势,也就是说层数越多,神经网络所需要的隐含节点可以越少。层数越深,概念越抽象,需要背诵的知识点就越少。在实际应用中、深层神经网络会遇到许多困难,如过拟合,参数调试,梯度弥散等。

  

过拟合是机器学习中的一个常见问题,是指模型预测准确率在训练集上升高,但是在测试集上的准确率反而下降,这通常意味着模型的泛化能力不好,过度拟合了训练集。针对这个问题,辛顿教授团队提出了辍学的解决办法,在使用CNN训练图像数据时效果尤其有效,其大体思路是在训练时将神经网络某一层的输出节点数据随机丢失一部分。这种做法实质上等于创造出了许多新的随机样本,通过增大样本量,减少特征数量来防止过拟合。

  

参数调试问题尤其是SGD (StochasticGradient后裔)的参数,对SGD设置不同的学习率学习速率,最后得到的结果可能差异巨大。神经网络的优化通常不是一个简单的凸优化问题,它处处充满了局部最优。有理论表示,神经网络可能有很多个局部最优解都可以达到比较好的分类效果,而全局最优很可能造成过拟合,对SGD,我们希望一开始学习率大一些,加速收敛,在训练的后期又希望学习率小一些,这样可以低速进入一个局部最优解。不同的机器学习问题的学习率设置也需要针对性的调试,像Adagrad,亚当,Adadelta等自适应的方法可以减轻调试参数的负担。对于这些优化算法,通常我们使用其默认的参数设置就可以得到比较好的效果。

  

梯度弥散(梯度消失)是另一个影响深层神经网络训练的问题,在ReLU激活函数出现之前,神经网络训练是使用乙状结肠作为激活函数。非线性的乙状结肠函数在信号的特征空间映射上,对中央区的信号增益较大,对两侧区的信号增益小。当神经网络层数较多时,乙状结肠函数在反向传播中梯度值会逐渐减小,到达前面几层的梯度值就变得非常小了,在神经网络训练的时候,前面几层的神经网络参数几乎得不到训练更新。指导ReLU, y=max (0, x)的出现才比较完美的解决了梯度弥散的问题。信号在超过某个阈值时,神经元才会进入兴奋和激活的状态,否则会处于抑制状态.ReLU可以很好的反向传递梯度,经过多层的梯度反向传播,梯度依旧不会大幅减小,因此非常适合深层神经网络的训练.ReLU对比于乙状结肠的主要特点有以下几点:(1)单侧抑制;(2)相对宽阔的兴奋边界;(3)稀疏激活性。目前,ReLU及其变种学人,PReLU, RReLU已经成为最主流的激活函数。实践中大部分情况下(包括延时,CNN, RNN)将隐含层的激活函数从乙状结肠替换为ReLU都可以带来训练速度和模型准确率的提升。当然神经网络的输出层一般都是乙状结肠函数,因为它最接近概率输出分布。

  

<强>二,TensorFlow实现过程

  

完整代码:

  

        进口tensorflow特遣部队   从tensorflow.examples.tutorials。mnist进口input_data      mnist=input_data。read_data_sets (“MNIST_data/? one_hot=True)   in_units=784 #输入节点数   h2_units=300 #隐含层节点数   W1=tf.Variable (tf。truncated_normal ([in_units, h2_units], stddev=0.1)) #初始化隐含层权重W1,服从默认均值为0,标准差为0.1的截断正态分布   b1=tf.Variable (tf.zeros ([h2_units])) #隐含层偏置b1全部初始化为0   W2=tf.Variable (tf。0 ([h2_units 10]))   b2=tf.Variable (tf.zeros ([10]))   x=tf.placeholder (tf。float32(没有,in_units))   keep_prob=tf.placeholder (tf.float32) #辍学失活率      #定义模型结构   hidden1=tf.nn.relu (tf。matmul (x, W1) + b1)   hidden1_drop=tf.nn。辍学(hidden1 keep_prob)   y=tf.nn.softmax (tf。matmul (hidden1_drop W2) + b2)      #训练部分   y_=tf.placeholder (tf。float32,[没有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)      #定义一个InteractiveSession会话并初始化全部变量   税=tf.InteractiveSession ()   .run tf.global_variables_initializer () ()   correct_prediction=tf.equal (tf。arg_max (y, 1),特遣部队。arg_max (y_ (1))   精度=tf.reduce_mean (tf。铸造(correct_prediction tf.float32))   因为我在范围(3001):   batch_xs batch_ys=mnist.train.next_batch (100)   train_step.run ({x: batch_xs y_: batch_ys, keep_prob: 0.75})   如果我% 200==0:   #训练过程每200步在测试集上验证一下准确率、动态显示训练过程   print(我training_arruracy:的准确性。eval ({x: mnist.test。图片,y_: mnist.test.labels,   keep_prob: 1.0}))   print (final_accuracy:,准确性。eval ({x: mnist.test。图片,y_: mnist.test。标签,keep_prob: 1.0}))      

TensorFlow实现MLP多层感知机模型