拟合函数(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