常见的神经网络的优化方法
来源:互联网 发布:网络暴力英文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 0
- 常见的神经网络的优化方法
- 卷积神经网络(CNN)的参数优化方法
- 卷积神经网络(CNN)的参数优化方法
- 卷积神经网络(CNN)的参数优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- 常见的几种最优化方法
- RAC 环境下的常见优化方法
- 谈谈常见的迭代优化方法
- 常见的几种优化方法
- 常见的web性能优化方法
- 常见的web性能优化方法
- 编译内核提示mkimage command not found – U-Boot images will not be built
- Java垃圾收集学习笔记
- 华为机试:计算字符串的距离、24点游戏算法
- Http状态码
- 【图论经典题】战争
- 常见的神经网络的优化方法
- JMS发布订阅(Pub/Sub)模式示例
- 前端面试题总结HTML CSS部分
- lua里实现table的序列化和反序列化
- 洛谷P3371 单源最短路径(Dijkstra+堆优化)
- noi 2017 游记
- tensorflow string_to_number to_double
- 【c#】DataTable分页处理
- 打印100的阶乘(大数问题,Java好解)