计算机系统应用教程网站

网站首页 > 技术文章 正文

TensorFlow中tf.nn.dropout防止过拟合(overfitting)

btikc 2024-10-17 08:41:18 技术文章 20 ℃ 0 评论

一、什么是过拟合 (Overfitting)

Overfitting 也被称为过度学习,过度拟合。 它是机器学习中常见的问题。

最有效的方式是通过识别精度判断模型是否存在过拟合:比较模型对验证集和训练集的识别精度,如果验证集识别精度大幅低于训练集,则可以判断模型存在过拟合。

举个Classification(分类)的例子。

图中黑色曲线是正常模型,绿色曲线就是overfitting模型。尽管绿色曲线很精确的区分了所有的训练数据,但是并没有描述数据的整体特征,对新测试数据的适应性较差。

过拟合是什么时候发生的?

要获得这个信息,就需要在模型训练过程中动态的监测每次迭代(Epoch)后训练集和验证集的识别精度,一旦出现训练集识别率继续上升而验证集识别率不再提高,就说明过拟合发生了。

举个Regression (回归)的例子:

第三条曲线存在overfitting问题,尽管它经过了所有的训练点,但是不能很好的反应数据的趋势,预测能力严重不足。 TensorFlow提供了强大的dropout方法来解决overfitting问题。

二、dropout原理简述

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

dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率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。

当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。

第五个参数name:指定该操作的名字。

使用举例:

1、dropout必须设置概率keep_prob,keep_prob也可以是一个占位符。

keep_prob = tf.placeholder(tf.float32)

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

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

如下所示,dropout一般只在全连接层而不是卷积层或者池化层使用。

四、具体演示代码

TensorFlow中 keep_prob 参数的官方解释:

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.

对于概率 keep_prob,输出的输入元素按比例增加1/keep_prob,否则输出0。

dropout函数的输出结果是: Tensor of the same shape of x

具体演示代码如下:

import tensorflow as tf

import numpy as np

dropout = tf.placeholder(tf.float32)

x = tf.Variable(tf.ones([10, 10]))

y = tf.nn.dropout(x, dropout)

init = tf.initialize_all_variables()

with tf.Session() as sess:

sess.run(init)

z = sess.run(y, feed_dict = {dropout: 0.5})

print(x.eval())

print(x.eval().sum())

print(z)

print(z.sum())

查看输出结果:

dropout 输出结果:

  • 输入和输出的tensor的shape果然是一样的;
  • 不是0的元素都变成了原来的 1/keep_prob倍;

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表