1. 首页 > 生活百科

拟合函数(matlab怎么拟合函数)

在开始了解Regularizer 正则函数的使用之前,需要先了解 tf.add_to_collection()、tf.get_collection() 和 tf.add_n() 函数的使用。这些3个函数分别用来实现:添加正则项到列表中、从列表中获取正则项列表、以及把正则项列表中的元素相加,并最终实现损失函数+正则项,预防过拟合。

下面3张图,分别表示欠拟合(Underfitting)、正确拟合、过拟合(Overfitting)。

  • 太简单 -- 欠拟合,没有充分的挖掘数据间的规律。
  • 太复杂 -- 过拟合,过分挖掘数据间的规律了。

在机器学习算法中,我们常常将原始数据集分为三部分:training data(训练集)、validation data(验证集),testing data(测试集)

这个validation data是什么?它其实就是用来避免过拟合的,在训练过程中,我们通常用它来确定一些超参数(比如根据validation data上的accuracy来确定early stopping的epoch大小、根据validation data确定learning rate等等)。那为啥不直接在testing data上做这些呢?因为如果在testing data做这些,那么随着训练的进行,我们的网络实际上就是在一点一点地overfitting我们的testing data,导致最后得到的testing accuracy没有任何参考意义。

因此,training data的作用是计算梯度更新权重,validation data如上所述,testing data则给出一个accuracy以判断网络的好坏。

避免过拟合的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay-权重衰减),dropout。

tf.add_to_collection()、tf.get_collection() 和 tf.add_n() 函数

tf.add_to_collection('list_name', element):是把多个变量放入一个集合里,也就是把多个变量统一放在一个列表中。

tf.get_collection('list_name'):返回名称为 list_name 的列表。

tf.add_n:把一个列表的元素相加并返回。

注意:使用tf.add_n对列表元素进行相加时,列表内元素类型必须一致,否则会报错。

具体示例代码如下所示。

import tensorflow as tf;

tf.reset_default_graph()

v1 = tf.get_variable(name='v1', shape=[1], initializer=tf.constant_initializer(1))

tf.add_to_collection('loss', v1)

v2 = tf.get_variable(name='v2', shape=[1], initializer=tf.constant_initializer(2))

tf.add_to_collection('loss', v2)

with tf.Session() as sess:

sess.run(tf.global_variables_initializer())

print(tf.get_collection('loss'))

print(sess.run(tf.get_collection('loss')))

print(sess.run(tf.add_n(tf.get_collection('loss'))))

输出结果:

[<tf.Variable 'v1:0' shape=(1,) dtype=float32_ref>, <tf.Variable 'v2:0' shape=(1,) dtype=float32_ref>]

[array([1.], dtype=float32), array([2.], dtype=float32)]

[3.]

Regularizer 正则函数

在损失函数上加上正则项是防止过拟合的一个重要方法,下面介绍如何在TensorFlow中使用正则项。

TensorFlow中对参数使用正则项分为两步:

1. 创建一个正则方法(函数/对象);

2. 将这个正则方法(函数/对象)应用到参数上;

如何创建一个正则函数?

tf.contrib.layers.l1_regularizer(scale, scope=None)

返回一个用来执行L1正则化的函数,函数的签名是func(weights)。

参数:

  • scale: 正则项的系数
  • scope: 可选的scope name

tf.contrib.layers.l2_regularizer(scale, scope=None)

返回一个执行L2正则化的函数。

tf.contrib.layers.sum_regularizer(regularizer_list, scope=None)

返回一个可以执行多种(个)正则化的函数。意思是,创建一个正则化方法,这个方法是多个正则化方法的混合体。

参数: regularizer_list: regulizer的列表。

L1/L2 正则函数的示例代码:

下面是通过regularizer 正则函数来防止过拟合的部分演示代码:

# 定义正则项系数,表示正则项的权重

REGULARIZATION_RATE = 0.0001

# 定义正则函数

regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)

# 只有全连接层的权重需要加入正则化

fc1_weights = tf.get_variable("weight", [nodes, FC_SIZE], initializer=tf.truncated_normal_initializer(stddev=0.1))

# tf.add_to_collection函数向当前计算图中添加张量集合

if regularizer != None:

tf.add_to_collection('losses', regularizer(fc1_weights))

# 定义损失函数,其中加上了正则项

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))

cross_entropy_mean = tf.reduce_mean(cross_entropy)

loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))

损失函数由损失项(loss term)和正则项(regularization term)组成。

本文由admin发布,不代表思恒百科立场,转载联系作者并注明出处:http://www.pneumabooks.com/shenghuobaike/29068.html

留言与评论(共有 0 条评论)
   
验证码:

联系我们

在线咨询:点击这里给我发消息

微信号:weixin888

工作日:9:30-18:30,节假日休息