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|

   L2正则化:
  
R(w)=||w||21=i|w2i|

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

   例如:
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:
    # 5
    print(sess.run(tf.contrib.layers.l1_regularizer(.5)(weights)))
    # 7.5
    print(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 var

batch_size = 8

# 使用seed=1 保证每次的出初始化的值都是相同的
w1 = tf.Variable(tf.random_normal([2,3],seed=1))
w2 = tf.Variable(tf.random_normal([3,seed=1))

x = tf.placeholder(tf.float32,shape=[None,2],name='x-input')
y_ = tf.placeholder(tf.float32,name='y-input')

# 定义每层的节点数
layer_dimension = [2,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. 基于canvas使用贝塞尔曲线平滑拟合折线段的方法

    这篇文章主要介绍了基于canvas使用贝塞尔曲线平滑拟合折线段的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 如何在Android平台上使用Tensorflow?

    谷歌为开发者提供了TENSORFLOW开源软件.有什么方法可以在Android上使用它吗?

  3. 直接在Android NDK端使用tensorflow(不使用JAVA api)

    如何在Android上使用Capis构建和链接tensorflow库.你能指导我吗?

  4. 是否有可能在Android上训练tensorflow?

    似乎没有CAPI来训练张量流图并保存到pb.so,在Android平台上有什么办法吗?我可以在Android设备上使用pythonAPI构建tensorflow工作区吗?

  5. python深度学习tensorflow1.0参数和特征提取

    这篇文章主要为大家介绍了python深度学习tensorflow1.0参数和特征提取,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. python神经网络Densenet模型复现详解

    这篇文章主要为大家介绍了python神经网络Densenet模型复现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. python人工智能tensorflow函数tf.get_variable使用方法

    这篇文章主要为大家介绍了python人工智能tensorflow函数tf.get_variable使用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. python神经网络学习数据增强及预处理示例详解

    这篇文章主要为大家介绍了python神经网络学习数据增强及预处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. python机器学习GCN图卷积神经网络原理解析

    这篇文章主要为大家介绍了GCN图卷积神经网络原理及代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. python人工智能tensorflow优化器Optimizer算法汇总

    这篇文章主要为大家介绍了python人工智能tensorflowtf优化器Optimizer算法汇总,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部