栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

过拟和处理方法.md

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

过拟和处理方法.md

原理

作用 权重衰减 L2正则化 可以避免模型过拟合问题。
思考 L2正则化项有让w变小的效果 但是为什么w变小可以防止过拟合呢
原理 1 从模型的复杂度上解释 更小的权值w 从某种意义上说 表示网络的复杂度更低 对数据的拟合更好 这个法则也叫做奥卡姆剃刀 而在实际应用中 也验证了这一点 L2正则化的效果往往好于未经正则化的效果。 2 从数学方面的解释 过拟合的时候 拟合函数的系数往往非常大 为什么 如下图所示 过拟合 就是拟合函数需要顾忌每一个点 最终形成的拟合函数波动很大。在某些很小的区间里 函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值 绝对值 非常大 由于自变量值可大可小 所以只有系数足够大 才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大 所以可以在一定程度上减少过拟合情况。
公式推导 见参考链接 1 2

代码及实现方式见

核心思路 1.创建一个正则化方法 2.将这个正则化方法应用到变量上
见参考链接 2

参考链接

https://blog.csdn.net/program_developer/article/details/80867468
https://zhuanlan.zhihu.com/p/95883569

我自己的代码实现方式

思路 取出可训练的参数 之后计算其参数的l2 loss 加入到原来的loss中

# 原本的loss
loss tf.losses.mean_squared_error(y, out)
# l2 loss
loss_regularization []
for p in net.trainable_variables: # net 为按照 keras 自定义layer定义的模型
 loss_regularization.append(tf.nn.l2_loss(p)) # 加入l2_loss 
loss_regularization tf.reduce_sum(tf.stack(loss_regularization))
loss loss 1e-4 * loss_regularization # 1e-4 为scale
Learning Rate 衰减 原理

在训练模型的时候 通常会遇到这种情况 我们平衡模型的训练速度和损失 loss 后选择了相对合适的学习率 learning rate 但是训练集的损失下降到一定的程度后就不在下降了 比如training loss一直在0.7和0.9之间来回震荡 不能进一步下降。如下图所示

学习率衰减 learning rate decay 就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是 学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法
线性衰减。例如 每过5个epochs学习率减半。
指数衰减。例如 随着迭代轮数的增加学习率自动发生衰减 每过5个epochs将学习率乘以0.9998。具体算法如下
decayed_learning_rate learning_rate*decay_rate^(global_step/decay_steps)
其中decayed_learning_rate为每一轮优化时使用的学习率 learning_rate为事先设定的初始学习率 decay_rate为衰减系数 decay_steps为衰减速度。

代码实现 参考链接
https://www.cnblogs.com/baby-lily/p/10962574.html关键参数
tf.train.exponential_decay() 
learning_rate, 初始的学习率的值
global_step, 迭代步数变量
decay_steps, 带迭代多少次进行衰减
decay_rate, 迭代decay_steps次衰减的值
staircase False, 默认为False 为True则不衰减

tf.train.exponential_decay(initial_learning_rate, global_step global_step, decay_steps 1000, decay_rate 0.9)表示没经过1000次的迭代 学习率变为原来的0.9。

增大批次处理样本的数量也可以起到退化学习率的作用。

演示代码

思路

引入 learning_rate tf.train.exponential_decay(...)

以控制optimizer 的learning_rate具体数值opt tf.train.GradientDescentOptimizer(learning_rate)

以 global_step作为计数器 add_global以在训练过程中作为计数器增加operator

最终实现 过程中learning rate decay的效果。

import tensorflow as tf
import numpy as np
global_step tf.Variable(tf.constant(0))
initial_learning_rate 0.1
learning_rate tf.train.exponential_decay(initial_learning_rate,
 global_step global_step,
 decay_steps 10,
 decay_rate 0.5)
opt tf.train.GradientDescentOptimizer(learning_rate)
add_global global_step.assign_add(1)
with tf.Session() as sess:
 tf.global_variables_initializer().run()
 print(sess.run(learning_rate))
 for i in range(50):
 g, rate sess.run([add_global, learning_rate])
 print(g, rate)

结果

1 0.0933033
2 0.08705506
3 0.08122524
4 0.07578582
5 0.070710674
46 0.004123463
47 0.0038473257
48 0.003589682
49 0.0033492916
50 0.003125
结合训练代码
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics
import os, sys
#os.chdir( ../ )
#----------constants ---------------
R1, R2 0.6, 0.4 # loss for lm and llc
LR 1e-4
ILR 1e-3
NTrain 5*int(1e4)
format_print_sub_real lambda x: {:^10} .format( %0.2f %(x))
format_print_sub_str lambda x: {:^10} .format(x)
format_print lambda x, ifReal: .join(list(map(format_print_sub_real, x))) if ifReal else .join(list(map(format_print_sub_str, x)))
#-------------------------
from db import train_batch, test_batch
from fcnet import CNNSplit
myNetwork CNNSplit()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号