Tensorflow学习笔记-过度拟合问题

  神经网络在训练是,并不是希望模型尽量模拟训练的数据,而是希望模型对未来的数据具有准确的判断。因此,模型在训练数据上的表现并不代表对未来数据的表现。如果模型可以完全记住训练数据而使得损失函数为0,这就是引起过度拟合的问题。
  过度拟合训练数据中的随机噪声,虽然可以得到非常小的损失函数,但对未知数据很难做出判断。
  训练处理的模型一般变现出三种情况:
  
  1、模型过于简单:它不能很好地给出数据变化的趋势。
  2、合理的模型:它能很好的预测数据变化的趋势,并且也不会过于关注数据中的噪声。
  3、过拟合:这种模型非常完美的区分不同的类别,由于它过度拟合训练集中的噪声,而忽略了数据变化的整体趋势,因此它不能很好的对未来数据做出判断。
  为了避免过度拟合问题,一个常用的方法就是正则化(Regularization),正则化的思想是在损失函数中加入刻画模型复杂程度的指标。假设一个模型的损失函数为J(θ),但正则化不是直接优化损失函数,而是优化J(θ) + λR(w):
    R(w)刻画的模型的复杂度。
    λ表示模型的复杂度在总损失中的比例。
    θ:模型中的所有参数,包括权重w和偏置项b。
   一般来说模型的复杂度只有w决定,刻化模型复杂度的模型的函数R(w)一般有两种:L1正则化和L2正则化.
   L1正则化:
  

R(w)=||w||1=∑i|wi|

R(w) = ||w||_1 = \sum_i|w_i|
   L2正则化:
  

R(w)=||w||21=∑i|w2i|

R(w) = ||w||_1^2 = \sum_i|w_i^2|
   无论是哪一种正则化,目的都是为了限制w的权重大小,使得模型不能过意拟合训练数据中的噪音。但这两种正则化也有很大的区别:
   1. L1正则化会使参数变得稀疏,也就是说使更多的参数变为0,而L2正则化则不会。
   2. L1正则化不可导,而L2正则化可导。
   因此,在优化时,需要计算损失函数的偏导数,所以对含有L2正则化损失函数的优化更加简洁。
   有时在实际的使用中,会将L1正则化结合L2正则化使用:

R(w)=∑ia|wi|+(1−a)w2i

R(w) = \sum_ia|w_i|+(1-a)w_i^2
   例如:

w = tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
y = tf.matmul(x,w)
loss = tf.reduce_mean(tf.square(y-y_)+tf.contrib.layers.l2_regularizer(λ)(w))

   loss损失函数包含两个部分,第一个部分为均方误差的损失函数,它刻化了模型在训练集的表现,第二部分是L2正则化,它防止模型过度拟合训练集中的噪音。
   下面通过例子来说明L1和正则化的计算:

weights = tf.constant([[1.0,-2.0],[-3.0,4.0]])
with tf.Session() as sess:# 5print(sess.run(tf.contrib.layers.l1_regularizer(.5)(weights)))# 7.5print(sess.run(tf.contrib.layers.l2_regularizer(.5)(weights)))

   在简单的神经网络中,通过上述的方法,可以很好计算带正则化的损失函数。但如果神经网络比较复杂,那么损失函数的定义就会变得比较复杂,这样对造成代码的可读性变差。并且随着神经网络的层数增加,神经网络的定义部分和损失函数的计算不在同一个函数,就可能就会引起出错。因此,为了增强代码的可读性及避免网络结构的设计部分与损失函数的计算不在同一个函数,而需要使用Tensorflow提供的集合,它可以很方便的管理具有同一名称的变量。

# 定义神经网络的权重,并将损失函数加入到collection中
def get_weight(shape,lamba):var = tf.Variable(tf.random_normal(shape),dtype=tf.float32)tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lamba)(var))return varbatch_size = 8# 使用seed=1 保证每次的出初始化的值都是相同的
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))x = tf.placeholder(tf.float32,shape=[None,2],name='x-input')
y_ = tf.placeholder(tf.float32,shape=[None,1],name='y-input')# 定义每层的节点数
layer_dimension = [2,10,10,10,2]
n_layers = len(layer_dimension)
cur_layer = x
in_dimension = layer_dimension[0]for i in range(1,n_layers):out_dimension = layer_dimension[i]# 生成当前的权重变量,并将它的L2正则化加入图上的集合weight = get_weight([in_dimension,out_dimension],0.001)bias = tf.Variable(tf.constant(0.1,shape=[out_dimension]))cur_layer = tf.nn.relu(tf.matmul(cur_layer,weight) + bias)in_dimension = layer_dimension[i]# 将模型在训练数据中表现的损失函数加入集合中
mse_loss = tf.reduce_mean(tf.square(y_ - cur_layer),name='mes_loss')
tf.add_to_collection('losses',mse_loss)
# 将每个环节的损失函数加起来就是最终的损失函数。
loss = tf.add_n(tf.get_collection('losses'))

Tensorflow学习笔记-过度拟合问题相关推荐

  1. tensorflow学习笔记——过拟合

    对于神经网络过拟合问题,一般有以下解决方法: 1.引入dropout,在训练的时候,让一部分神经元随机失活,增加网络稀疏性,有利于特征选择,防止过拟合: 2.引入batch normalizatin, ...

  2. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  3. python tensorflow学习笔记(六)最小二乘法

    说明:本文不包括TensorFlow相关内容 概念 概念:回归分析 回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法.运用十分广泛,回归 ...

  4. Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题

    Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 参考文章: (1)Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 (2)http ...

  5. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  6. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  7. TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅

    TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...

  8. Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

    简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节 ...

  9. Win10:tensorflow学习笔记(4)

    前言 学以致用,以学促用.输出检验,完整闭环. 经过前段时间的努力,已经在电脑上搭好了深度学习系统,接下来就要开始跑程序了,将AI落地了. 安装win10下tensforlow 可以参照之前的例子:w ...

最新文章

  1. 2020年度“社区之星”出炉!原来社区里的技术大佬们是这样成长起来的!
  2. APP启动速度是门面,如何做到极致优化?
  3. Touchpad Synaptics 触摸板(中文) [zt]
  4. 64位Win7安装Oracle12C临时位置权限错误解决方案
  5. 标签内超出的文字显示省略号
  6. SendMessage、PostMessage原理和源代码详解
  7. linux安装到内存中,Linux安装识别大内存的补丁程序
  8. 20201219:力扣219周周赛题解
  9. 《java程序员全攻略:从小工到专家》连载一:外行人眼中的IT人
  10. linux 卸载theano,centos 安装theano
  11. 安装微软的消息队列服务器,MSMQ消息队列的安装、启用
  12. IP范围表示法(网络子网划分)
  13. 闲聊人工智能产品经理(AIPM)—方法论
  14. 贝叶斯与朴素贝叶斯入门及实战
  15. Power BI 可视化:直观了解分类百分比的饼图树视觉
  16. Swift vs. Kotlin 漫谈之扩展篇
  17. android8关机界面,修改android 的关机界面
  18. 干草的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 集中式存储与分布式存储
  20. Creo,SolidWorks,Freecad,QCad,DraftSight,QutoCad

热门文章

  1. C#连接数据库的登录界面
  2. 羽化效果的HeatMap
  3. Butter Knife(黄油刀)的基本使用
  4. HEVC代码学习39:decodeCtu和xDecodeCU函数
  5. 关于结构体指针的帖子
  6. python职场应用英语作文_作文范文之职场心得英语作文
  7. 【IOS invalid signature】记录一次微信H5跳转小程序的坑
  8. probuff html5,上分神器!Reno5 Pro自带Buff,游戏手感没谁了
  9. 记录Android修改报名顺便迁移androidx
  10. 搭建win10家庭服务器,不是翻墙!是私有云!