TensorFlow实战第七课(dropout解决overfitting)

Dropout 解决 overfitting

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

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

举个Regression(回归)的例子.

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

 建立Dropout层

本次内容需要安装适应sklearn数据库中的数据 没有安装sklearn的同学可以参考一下以下

import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import  LabelBinarizer
keep_prob = tf.placeholder(tf.float32)
...
...
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

这里的keep_prob是保留概率,即我们要保留的结果所占的比例,他作为一个placeholder,在run时传入,当keep_prob=1的时候,相当于100%保留,就是drop没起作用。

下面准备数据:

digits = load_digits()
X = digits.data
y = digits.target
y = LabelBinarizer().fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3)

其中X_train是训练数据,X_test是测试数据。然后添加隐藏层和输出层

# add output layer
l1 = add_layer(xs, 64, 50, ‘l1‘, activation_function=tf.nn.tanh)
prediction = add_layer(l1, 50, 10, ‘l2‘, activation_function=tf.nn.softmax)

添加层的激活函数选用tanh(其实我也不知道为什么,莫烦的课里讲不写tanh函数,其他的函数会报none错误,就不管啦)

训练

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

保留概率是指保留下多少,我们尝试0.5&1.0  观察tensorboard生成的可视化结果

可视化结果

keep_prob=1时,会暴露overfitting的问题,keep_prob=0.5时,Dropout就发挥了作用。

当keep_prob=1时 模型对训练数据的适应性优于测试数据,存在overfitting。红线是train的误差,蓝线是test的误差。

当keep_prob=0.5时

可以明显看到loss的变化

完整代码以及部分注释如下

import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import  LabelBinarizer

#载入数据
digits = load_digits()
X = digits.data
y = digits.target
#preprocessing.LabelBinarizer是一个很好用的工具。
# 比如可以把yes和no转化为0和1
# 或是把incident和normal转化为0和1
y = LabelBinarizer().fit_transform(y)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.3)

def add_layer(inputs,in_size,out_size,layer_name,activation_function=None,):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    biases = tf.Variable(tf.zeros([1,out_size])+ 0.1)
    Wx_plus_b = tf.matmul(inputs,Weights)+biases
    #here to drop
    Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b,)
    tf.summary.histogram(layer_name + ‘outputs‘,outputs)
    return outputs

#define placeholder for inputs to network
keep_prob = tf.placeholder(tf.float32)#保留概率 即我们需要保留的结果所占比
xs = tf.placeholder(tf.float32,[None,64])#8*8
ys = tf.placeholder(tf.float32,[None,10])

#add output layer
l1 = add_layer(xs,64,50,‘l1‘,activation_function=tf.nn.tanh)
prediction = add_layer(l1,50,10,‘l2‘,activation_function=tf.nn.softmax)

#the loss between prediction and real data
#loss
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))

tf.summary.scalar(‘loss‘,cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess = tf.Session()
merged = tf.summary.merge_all()

#summary writer goes in here
train_writer = tf.summary.FileWriter("logs/train",sess.graph)
test_writer = tf.summary.FileWriter("logs/test",sess.graph)

init = tf.global_variables_initializer() #变量初始化

sess.run(init)

for i in range(500):
    #here to determine the keeping probability
    sess.run(train_step,feed_dict={xs:X_train,ys:y_train,keep_prob:0.5})
    if i %50 ==0:
        #record loss
        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})
        train_writer.add_summary(test_result,i)
        test_writer.add_summary(test_result,i)

原文地址:https://www.cnblogs.com/baobaotql/p/11304736.html

时间: 2024-10-09 13:17:39

TensorFlow实战第七课(dropout解决overfitting)的相关文章

tensorflow学习之(八)使用dropout解决overfitting(过拟合)问题

#使用dropout解决overfitting(过拟合)问题 #如果有dropout,在feed_dict的参数中一定要加入dropout的值 import tensorflow as tf from sklearn.datasets import load_digits from sklearn.cross_validation import train_test_split from sklearn.preprocessing import LabelBinarizer #load data

7.windows-oracle实战第七课 --约束

数据的完整性 数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则.数据的完整性使用约束.触发器.函数的方法来实现.在这三个方法中,约束易于维护,具备最好的性能,所以作为首选. 约束:not null.unique(可以为空,不能重复) .primary key.foreign key.check 一个表中只能有一个主键,但是可以有多个unique. 案例: 现有一个商店数据库,有三个表: 商品表goods(商品号goodsId,商品名goodsName,单价unitprice,商品类别cat

Ng第七课:正则化与过拟合问题 Regularization/The Problem of Overfitting

7.1  过拟合的问题 7.2  代价函数 7.3  正则化线性回归 7.4  正则化的逻辑回归模型 7.1  过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设预测可能能够非常好地适应训练集(代价函数可能几乎为 0),但是可能会不能推广到新的数据. 下图是一个回归问题的例子: 第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集:第三个模型是一 个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据.可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,

【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现

CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,能够免费领取30天学习时间,免费拿极客学院VIP,1000+高清视频.学习Android.HTML5.iOS各种开发技术,限时领取.手快的戳:http://e.jikexueyuan.com/invite/index.html?ZnJvbV9jb2RlPVkxblJUZSZ1bmF

Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化”

Coursera公开课笔记: 斯坦福大学机器学习第七课"正则化" NLPJob 斯坦福大学机器学习第七课"正则化"学习笔记,本次课程主要包括4部分: 1) The Problem of Overfitting(过拟合问题) 2) Cost Function(成本函数) 3) Regularized Linear Regression(线性回归的正则化) 4) Regularized Logistic Regression(逻辑回归的正则化) 以下是每一部分的详细解读

【C语言探索之旅】 第二部分第七课:文件读写

内容简介 1.课程大纲 2.第二部分第七课: 文件读写 3.第二部分第八课预告: 动态分配 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写

TensorFlow实战之Softmax Regression识别手写数字

     关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2018年02月21日 23:10:04所撰写内容(http://blog.csdn.net/qq_37608890/article/details/79343860).        本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.相关概念 1.MNIST MNIST(Mixed

第七课 对前面内容的总结

最近忙些,现在抽出个时间总结一下前面所讲的内容. 对于struts1框架的使用,个人认为不仅仅从细节方面去掌握,需要从整体把握,理解这个框架的意思,细节的东西查查资料一般都能解决,所以真个框架的理解很重要.这个同样适用于其他技术的学习,即整体把握再到细节实现,语言Java,php或是其他的,技术原理,框架上都差不多,主要的区别在于语法使用上,所以精通一门语言是十分必要的,这对于以后的工作或是学习都是非常有帮助的.一些大神经常说的话,理解和掌握思想就行,不必拘泥于细节的东西.当然啦,如果你是一个死

TensorFlow实战之CNN实现对鸡蛋的分类

本文标签: TensorFlow TensorFlow实战之CNN 3.1问题分析 为了评估N个鸡蛋中是否有圈养鸡蛋,我们利用卷积神经网络(CNN)让计算机学习圈养鸡蛋和土鸡蛋图片的特征,然后根据鸡蛋的图片将其分类.通过对图片的预处理,将其转化为32*32相同大小的图片.在神经网络加载数据之后,会将其转化为32*32*3的数组.然后通过卷积和池化等一系列操作提取出图片的特征.以达到对鸡蛋进行分类的目的.我们主要用Python语言在TensorFlow中构建卷积神经网络(CNN),让CNN学习圈养