谈谈Tensorflow的dropout

 2023-09-09 阅读 21 评论 0

摘要:上海站 | 高性能计算之GPU CUDA培训4月13-15日三天密集式训练 快速带你晋级阅读全文>正文共2005个字,1张图,预计阅读时间6分钟。Dropout这个概念已经推出4年了,它的详细描述见论文(https://arxiv.org/abs/1207.0580)。可是呢,它


上海站 | 高性能计算之GPU CUDA培训

4月13-15日

三天密集式训练 快速带你晋级
阅读全文
>


正文共2005个字,1张图,预计阅读时间6分钟。


Dropout这个概念已经推出4年了,它的详细描述见论文(https://arxiv.org/abs/1207.0580)。可是呢,它仿佛是个犹抱琵琶半遮面的美女,难以捉摸!!许多文献都对dropout有过描述,但解释的含糊不清,这里呢,我也不打算解释清楚,只是通过tensorflow来看一看dropout的运行机理。


文章分两部分,第一部分介绍tensorflow中的dropout函数,第二部分是我的思考。


1、tf.nn.dropput函数


首先看官方函数定义:


def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)


输入是:

  • x,你自己的训练、测试数据等

  • keep_prob,dropout概率

  • ……,其它参数不咋用,不介绍了


输出是:


  • A Tensor of the same shape of x


然后我们看看官方API是怎么说这个函数的:


With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0. The scaling is so that the expected sum is unchanged.


注意,输出的非0元素是原来的 “1/keep_prob” 倍!说了这么多,下面给一个程序例子:


import tensorflow as tf dropout = tf.placeholder(tf.float32) x = tf.Variable(tf.ones([10, 10])) y = tf.nn.dropout(x, dropout) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init)print sess.run(y, feed_dict = {dropout: 0.4})


运行的结果如下:


[[ 0.   0.   2.5  2.5  0.   0.   2.5  2.5  2.5  2.5] [ 0.   2.5  2.5  2.5  2.5  2.5  0.   2.5  0.   2.5] [ 2.5  0.   0.   2.5  0.   0.   2.5  0.   2.5  0. ] [ 0.   2.5  2.5  2.5  2.5  0.   0.   2.5  0.   2.5] [ 0.   0.   0.   0.   0.   0.   0.   0.   2.5  2.5] [ 2.5  2.5  2.5  0.   2.5  0.   0.   2.5  2.5  2.5] [ 0.   2.5  2.5  2.5  0.   2.5  2.5  0.   0.   0. ] [ 0.   2.5  0.   2.5  0.   0.   2.5  2.5  0.   0. ] [ 2.5  2.5  2.5  2.5  2.5  0.   0.   2.5  0.   0. ] [ 2.5  0.   0.   0.   0.   0.   2.5  2.5  0.   2.5]]


分析一下运行结果:


  • 输入和输出的tensor的shape果然是一样的

  • 不是0的元素都变成了原来的 “1/keep_prob” 倍


特点分析完毕,小总结一下,dropout这个概念看起来好高大上,然而在程序中实现竟然如此简单!说白了,tensorflow中的dropout就是:使输入tensor中某些元素变为0,其它没变0的元素变为原来的1/keep_prob大小!


2、关于dropout的吐槽


首先引用此篇博文的话:


个人总结:个人感觉除非是大型网络,才采用dropout,不然我感觉自己在一些小型网络上,训练好像很是不爽。之前搞一个比较小的网络,搞人脸特征点定位的时候,因为训练数据不够,怕过拟合,于是就采用dropout,最后感觉好像训练速度好慢,从此就对dropout有了偏见,感觉训练过程一直在波动,很是不爽。


然后,我就自己试了试,看看小型网络中dropout效果到底怎么样,程序片段如下:


def inference(img, dropout=1.0):    fc1 = activation(tf.nn.bias_add(tf.matmul(img, W_fc1), b_fc1))    # dropout    fc1_dropout = tf.nn.dropout(fc1, dropout)    fc2 = tf.nn.bias_add(tf.matmul(fc1_dropout, W_fc2), b_fc2)    return fc2 cross_entropy = tf.nn.softmax_cross_entropy_with_logits(inference(X, dropout), y_) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)


网络很简单,形如 784-30-10 的一个网络,只不过在输出层前用dropout处理了一下,训练的数据是MNIST的手写数据集,然后你猜怎么着?采用dropout以后的训练精度不升反降,后来我把网络隐藏层改成100个神经元,结果依旧,看来,我的网络还是太小了,真的如上面那篇博客所说,dropout用不好的话,真是个累赘!


原文链接:https://www.jianshu.com/p/c9f66bc8f96c


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/27740.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息