tensorflow--神经网络--1--tf.nn.dropout防止过拟合

一、Dropout原理简述

tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层。

Dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。示意图如下:

但在测试及验证中:每个神经元都要参加运算,但其输出要乘以概率p。

二、tf.nn.dropout函数说明

tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None,name=None) 

上面方法中常用的是前两个参数:

  • 第一个参数x:指输入
  • 第二个参数keep_prob: 设置神经元被选中保留的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5
  • 第五个参数name:指定该操作的名字。

举例说明:

import tensorflow as tf

keep_prob = tf.placeholder(tf.float32)
x = tf.Variable(tf.ones([5, 5]))
y = tf.nn.dropout(x, keep_prob”)

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

print sess.run(x)
print sess.run(y, feed_dict = {keep_prob”: 0.75})

结果为:

[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
[[1.3333334 1.3333334 0.        1.3333334 1.3333334]
 [1.3333334 1.3333334 1.3333334 1.3333334 1.3333334]
 [0.        1.3333334 1.3333334 1.3333334 1.3333334]
 [1.3333334 0.        1.3333334 0.        1.3333334]
 [1.3333334 1.3333334 1.3333334 1.3333334 1.3333334]]
  • 输入和输出的tensor的shape果然是一样的
  • 1-keep_prob” 比例的数据会变成0
  • 不是0的元素都变成了原来的 “1/keep_prob” 倍

三、使用举例:

1、dropout必须设置概率keep_prob,并且keep_prob也是一个占位符,跟输入是一样的

keep_prob = tf.placeholder(tf.float32)

2、train的时候才是dropout起作用的时候,train和test的时候不应该让dropout起作用

sess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5})  

train_result = sess.run(merged, feed_dict={xs: X_train, ys: y_train, keep_prob: 1})  
test_result = sess.run(merged, feed_dict={xs: X_test, ys: y_test, keep_prob: 1})  

3、tf实现dropout其实,就一个函数,让一个神经元以某一固定的概率失活

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn