常见的神经网络的优化方法

来源:互联网 发布:网络暴力英文ppt 编辑:程序博客网 时间:2024/05/18 01:26

    上一篇博客使用了TF建立了一个基本的拥有一层隐含层的神经网络。我们感到激动不已!(- -!)不过(根据前人不断地试验和总结)神经网络有那么几个明显的缺点。我们接下来将对上一篇的代码进行适当修改,再进一步提高准确率。前面的定义是一样的,这里不再赘述。

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfmnist=input_data.read_data_sets('MNIST_data/',one_hot=True)sess=tf.InteractiveSession()
in_units=784 h1_units=300w1=tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=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])

hidden1=tf.nn.relu(tf.matmul(x,w1)+b1)
  上一篇中,我们使用的激活函数(将变量映射在0-1之间)是sigmoid函数。这是经典的模拟生物信号的函数,特点是对中央区的信号增益较大,而两侧区的信号增益小。因而大部分神经网络的激活函数均使用sigmoid.
  sigmoid也有缺点,在反向传播中,经过多层传递之后,梯度值会指数级地急剧减小(盖由两侧平缓曲线引起),这使得参数的更新变得十分缓慢,若迭代次数不多,将会错过最优解。因此使用ReLU函数,可以弥补这种梯度弥散的问题。
是的,ReLU就是y=max(0,x)函数。据说,这类似于人脑的阈值响应机制。有着单侧抑制,相对宽阔的兴奋边界以及稀疏激活性(听名字即可理解)
  当然,在最终输出层我们依然使用Sigmoid函数,因为其最接近概率输出分布。
keep_prob=tf.placeholder(tf.float32)
hidden1_drop=tf.nn.dropout(hidden1,keep_prob)y=tf.nn.softmax(tf.matmul(hidden1_drop,w2)+b2)
  dropout方法,太经典了!由于神经网络强大的函数模拟能力,使得经常出现过拟合的现象。dropout思路简单,却非常有效!其思路大致为,在训练时,将神经网络某一层的输出节点数据随机丢弃一部分。例如随机将一张图片的50%的数据删除点,变为黑点,其实质相当于创造出了很多新的随机样本,通过增大样本量,减小特征数量来防止过拟合。
   好比有一张狗狗的图片,当你将图片中随机的,按照一定百分比的像素丢弃,你有很大可能依然能够认出这是狗狗的图片,而这些随机像素点,很有可能抹去一些非狗狗独有的特征,比如狗狗戴的装饰等等(……)这个方法对于之后将要学习的卷积神经网络训练过程十分有效。
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()
这里我们不再使用SGD,而是介绍一种新的方法Adagrad。通常我们对所有参数使用的学习速率都是一样的。但事实上迭代多轮之后,有的参数只需要微调,有的参数的步长依然要很大才能继续加速收敛。我们只需要定义最初的学习速率,之后的运算中,Adagrad会自适应地为各个参数分配不同的学习速率。这里不详细说明,有兴趣的同学可以看看。当然也不是说SGD不好用,这里只是多介绍一种参数的优化方法。事实上经过验证,在这些手写字体样本上,差别不大。最主要的还是dropout带来得精度的质的飞跃。
for i in range(3000):    batch_xs,batch_ys=mnist.train.next_batch(100)    train_step.run({x:batch_xs,y_:batch_ys,keep_prob:0.75})#在训练时保留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}))#在测试时,显然要用100%的数据
   
   执行代码后,看看最后结果,这些辅助方法确实帮我们提高了不少的准确率!当然认真的我们发现,一个神经网络模型下来,有太多的参数需要定义了,最麻烦的是,有时候,一些参数的初始定义,对最后的预测准确率影响很大,例如SDG中的学习速率,迭代次数,隐层节点数,隐层数……要达到最大准确率,参数的设置经验还蛮重要的,这就很麻烦,尤其是通常情况下,训练的花费的时间还很长……
   不过即使你花了好几天,终于找到了一个(→_→)最优的参数组合,即可能使用了很多隐层,很多节点,很多迭代轮次,依然不能将准确度提升到99%以上这样的程度,这种全连接神经网络也是有上限。下一波,我们要开卷积神经网络的车。。。预订车票了先。。。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证被别人做了网贷怎么办 身份证丢了被别人网贷了怎么办 户口身份证被注销了网贷怎么办 首付交了贷款办不下来怎么办 付首付后贷款没有批下来怎么办 交了首付贷款没有办下来怎么办 买房交了首付贷款没批下来怎么办 交完首付办不下来贷款怎么办 房子交了首付贷款办不下来怎么办 浦发银行办理房贷流水不够怎么办 房贷审批过程中突然换工作怎么办 建行快贷结清后无额度怎么办 建设银行快贷逾期2个月怎么办 全职速卖通一个月没订单要怎么办 买家点的好评写的差评怎么办 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办 幸果手机开机数字便按不动了怎么办 苹果6s黑屏但没关机怎么办 苹果6p突然黑屏怎么办单冷接电话 华硕86u的5g掉线找不到怎么办 信而富额度被清0怎么办 贷款回访电话回答错两个问题怎么办 天天中彩票获取期号失败怎么办 借贷宝电话打到家里了怎么办 私人借款付了利息不下款怎么办 别人借钱不还打电话不接怎么办 有信电话给别人打电话不接怎么办