Multi_Layer Perceptron

"""深度学习特点:层数越深,概念越抽象,需要背诵的知识点(神经网络隐含节点)就越少。不过实际应用中,使用层数较深的神经网络会遇到许多困难,比如容易过拟合,参数难以调试,梯度弥散,等等。
过拟合:
指模型预测准确率在训练集上升高,但是在测试集上反而下降了,通常意味着泛化性不好。
为了解决这个问题,Hinton教授团队提出了一个思路简单但是非常有效的方法,Dropout.其实也算是一种bagging方法,我们可以理解成为每次丢弃节点数据是对特征的一种采样。
相当于我们训练了一个ensemble的神经网络模型,对每个样本都做特征采样,只不过没有训练多个神经网络模型,只有一个融合的神经网络。
参数难以调试:
尤其是SGD的参数,对SGD设置不同的学习速率,最后得到的结果可能差异巨大,神经网络通常不是一个凸优化的问题,它处处充满了局部最优。因此就有像Adagrad,Adam,Adadelta等自适应的方法可以减轻调试参数的负担。
对于这些优化算法,通常我们使用它默认的参数设置就可以取得一个比较好的效果。而SGD则需要对学习速率,Momentum,Nesterov等参数进行比较复杂的调试。
梯度弥散(Gradient Vanishment):
在Relu激活函数出现之前,神经网络的训练全部都是用Sigmoid作为激活函数,但是当神经网络层数较多时,Sigmoid函数在反向传播中,梯度值会逐渐减小(呈指数级急剧减小)。
直到Relu的出现,才比较完美的解决了梯度弥散的问题,Relu是一个简单的非线性函数y=max(0,x),它在坐标轴上是一条折线。
当然神经网络的输出层一般都还是Sigmoid函数,因为它最接近概率输出分布。

使用全连接神经网络(Fully Connected Network, FCN , MLP的另一种说法),也是有局限的,即使我们使用很深的网络、很多的隐藏节点、很大的迭代轮数,也很难在MNIST数据集上达到99%以上的准确率(但使用CNN可以)
"""


from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf 
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess= tf.InteractiveSession()

in_units = 784
h1_units = 300
w1 = tf.Variable(tf.truncated_normal([in_units,h1_units], stddev=0.1))  #将权重初始化为截断的正太分布,其标准差为0.1
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)

hidden1 = tf.nn.relu(tf.matmul(x, W1) +b1)
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)
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)

tf.global_variables_initializer().run()   
for i in range(3000):   #3000个batch.每个batch包含100个样本,一共30万的样本,相当于是对全数据集进行了5轮(epoch)迭代。
    batch_xs, batch_ys = mnist.train.next_batch(100)
    train_step.run({x:batch_xs,y_:batch_ys, keep_prob:0.75})   #训练时设为0.75
 
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}))   #预测时设为1.0



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页