tensorflow之欠拟合与过拟合,正则化缓解

过拟合泛化性弱

欠拟合解决方法:

        增加输入特征项

        增加网络参数

        减少正则化参数

过拟合的解决方法:

        数据清洗

        增大训练集

        采用正则化

        增大正则化参数

正则化缓解过拟合

正则化在损失函数中引入模型复杂度指标,利用给w增加权重,弱化数据集的噪声,loss = loss(y与y_) + REGULARIZER*loss(w)

模型中所有参数的损失函数,如交叉上海,均方误差

利用超参数REGULARIZER给出参数w在总loss中的比例,即正则化权重, w是需要正则化的参数

正则化的选择

L1正则化大概率会使很多参数变为0,因此该方法可通过系数参数,减少参数的数量,降低复杂度

L2正则化会使参数很接近0但不为0,因此该方法可通过减少参数值的大小降低复杂度 

with tf.GradientTape() as tape:h1 = tf.matul(x_train, w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2loss_mse = tf.reduce_mean(tf.square(y_train - y))loss_ragularization = []loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization
variables = [w1, b1, w2, b2】
grads = tape.gradient(loss, variables)

生成网格覆盖这些点,会对每个坐标生成一个预测值,输出预测值为0.5的连成线,这个线就是红点和蓝点的分界线。

# 导入所需模块
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd# 读入数据/标签 生成x_train y_train
df = pd.read_csv('dot.csv')
x_data = np.array(df[['x1', 'x2']])
y_data = np.array(df['y_c'])x_train = x_data
y_train = y_data.reshape(-1, 1)Y_c = [['red' if y else 'blue'] for y in y_train]# 转换x的数据类型,否则后面矩阵相乘时会因数据类型问题报错
x_train = tf.cast(x_train, tf.float32)
y_train = tf.cast(y_train, tf.float32)# from_tensor_slices函数切分传入的张量的第一个维度,生成相应的数据集,使输入特征和标签值一一对应
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)# 生成神经网络的参数,输入层为4个神经元,隐藏层为32个神经元,2层隐藏层,输出层为3个神经元
# 用tf.Variable()保证参数可训练
w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)
b1 = tf.Variable(tf.constant(0.01, shape=[11]))w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)
b2 = tf.Variable(tf.constant(0.01, shape=[1]))lr = 0.005  # 学习率为
epoch = 800  # 循环轮数# 训练部分
for epoch in range(epoch):for step, (x_train, y_train) in enumerate(train_db):with tf.GradientTape() as tape:  # 记录梯度信息h1 = tf.matmul(x_train, w1) + b1  # 记录神经网络乘加运算h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2# 采用均方误差损失函数mse = mean(sum(y-out)^2)loss_mse = tf.reduce_mean(tf.square(y_train - y))# 添加l2正则化loss_regularization = []# tf.nn.l2_loss(w)=sum(w ** 2) / 2loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))# 求和# 例:x=tf.constant(([1,1,1],[1,1,1]))#   tf.reduce_sum(x)# >>>6loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization  # REGULARIZER = 0.03# 计算loss对各个参数的梯度variables = [w1, b1, w2, b2]grads = tape.gradient(loss, variables)# 实现梯度更新# w1 = w1 - lr * w1_gradw1.assign_sub(lr * grads[0])b1.assign_sub(lr * grads[1])w2.assign_sub(lr * grads[2])b2.assign_sub(lr * grads[3])# 每200个epoch,打印loss信息if epoch % 20 == 0:print('epoch:', epoch, 'loss:', float(loss))# 预测部分
print("*******predict*******")
# xx在-3到3之间以步长为0.01,yy在-3到3之间以步长0.01,生成间隔数值点
xx, yy = np.mgrid[-3:3:.1, -3:3:.1]
# 将xx, yy拉直,并合并配对为二维张量,生成二维坐标点
grid = np.c_[xx.ravel(), yy.ravel()]
grid = tf.cast(grid, tf.float32)
# 将网格坐标点喂入神经网络,进行预测,probs为输出
probs = []
for x_predict in grid:# 使用训练好的参数进行预测h1 = tf.matmul([x_predict], w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2  # y为预测结果probs.append(y)# 取第0列给x1,取第1列给x2
x1 = x_data[:, 0]
x2 = x_data[:, 1]
# probs的shape调整成xx的样子
probs = np.array(probs).reshape(xx.shape)
plt.scatter(x1, x2, color=np.squeeze(Y_c))
# 把坐标xx yy和对应的值probs放入contour函数,给probs值为0.5的所有点上色  plt.show()后 显示的是红蓝点的分界线
plt.contour(xx, yy, probs, levels=[.5])
plt.show()# 读入红蓝点,画出分割线,包含正则化
# 不清楚的数据,建议print出来查看

存在过拟合现象,轮廓不够平滑, 使用l2正则化缓解过拟合

# 导入所需模块
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd# 读入数据/标签 生成x_train y_train
df = pd.read_csv('dot.csv')
x_data = np.array(df[['x1', 'x2']])
y_data = np.array(df['y_c'])x_train = x_data
y_train = y_data.reshape(-1, 1)Y_c = [['red' if y else 'blue'] for y in y_train]# 转换x的数据类型,否则后面矩阵相乘时会因数据类型问题报错
x_train = tf.cast(x_train, tf.float32)
y_train = tf.cast(y_train, tf.float32)# from_tensor_slices函数切分传入的张量的第一个维度,生成相应的数据集,使输入特征和标签值一一对应
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)# 生成神经网络的参数,输入层为4个神经元,隐藏层为32个神经元,2层隐藏层,输出层为3个神经元
# 用tf.Variable()保证参数可训练
w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)
b1 = tf.Variable(tf.constant(0.01, shape=[11]))w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)
b2 = tf.Variable(tf.constant(0.01, shape=[1]))lr = 0.005  # 学习率为
epoch = 800  # 循环轮数# 训练部分
for epoch in range(epoch):for step, (x_train, y_train) in enumerate(train_db):with tf.GradientTape() as tape:  # 记录梯度信息h1 = tf.matmul(x_train, w1) + b1  # 记录神经网络乘加运算h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2# 采用均方误差损失函数mse = mean(sum(y-out)^2)loss_mse = tf.reduce_mean(tf.square(y_train - y))# 添加l2正则化loss_regularization = []# tf.nn.l2_loss(w)=sum(w ** 2) / 2loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))# 求和# 例:x=tf.constant(([1,1,1],[1,1,1]))#   tf.reduce_sum(x)# >>>6loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization  # REGULARIZER = 0.03# 计算loss对各个参数的梯度variables = [w1, b1, w2, b2]grads = tape.gradient(loss, variables)# 实现梯度更新# w1 = w1 - lr * w1_gradw1.assign_sub(lr * grads[0])b1.assign_sub(lr * grads[1])w2.assign_sub(lr * grads[2])b2.assign_sub(lr * grads[3])# 每200个epoch,打印loss信息if epoch % 20 == 0:print('epoch:', epoch, 'loss:', float(loss))# 预测部分
print("*******predict*******")
# xx在-3到3之间以步长为0.01,yy在-3到3之间以步长0.01,生成间隔数值点
xx, yy = np.mgrid[-3:3:.1, -3:3:.1]
# 将xx, yy拉直,并合并配对为二维张量,生成二维坐标点
grid = np.c_[xx.ravel(), yy.ravel()]
grid = tf.cast(grid, tf.float32)
# 将网格坐标点喂入神经网络,进行预测,probs为输出
probs = []
for x_predict in grid:# 使用训练好的参数进行预测h1 = tf.matmul([x_predict], w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2  # y为预测结果probs.append(y)# 取第0列给x1,取第1列给x2
x1 = x_data[:, 0]
x2 = x_data[:, 1]
# probs的shape调整成xx的样子
probs = np.array(probs).reshape(xx.shape)
plt.scatter(x1, x2, color=np.squeeze(Y_c))
# 把坐标xx yy和对应的值probs放入contour函数,给probs值为0.5的所有点上色  plt.show()后 显示的是红蓝点的分界线
plt.contour(xx, yy, probs, levels=[.5])
plt.show()# 读入红蓝点,画出分割线,包含正则化
# 不清楚的数据,建议print出来查看

python EmptyDataError No columns to parse from file sites:stackoverflow.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点线面推进未来智造

如今,宁波拥有门类齐全的制造业体系,形成了以石油化工、汽车及零部件、电工电器、纺织服装等为支柱的产业集群。 宁波工业的发展并非一蹴而就,蓝卓总经理谭彰详细解读了宁波制造业的发展历程与当下目标,从工业小市到工业大市、工业…

基于Matlab和Python泰勒图的绘制

一、泰勒图介绍 泰勒图:泰勒图1常用于评价模型的精度,常用的精度指标有相关系数,标准差以及均方根误差(RMSE)。一般而言,泰勒图中的散点代表模型,辐射线代表相关系数,横纵轴代表标准差,而虚线代表均方根误差。泰勒图一改以往用散点图这种只能呈现两个指标来表示模型精度…

Python数据结构的库之Fuk使用详解

概要 fuk 是一个用于处理 Python 数据结构的库,全称为 "Fast and Uncomplicated Kit"。它提供了一系列高效、简洁的数据结构实现,以及对 Python 内置数据结构的扩展。通过使用 fuk,开发者可以更加方便地处理列表、集合、字典等数据类型,提高代码的执行效率和可读…

vite+vue3拍照上传到nodejs服务器

一:效果展示: 拍照效果 二:Nodejs后端接口代码: 三:前端完整代码:

Vue基础--v-model/v-for/事件属性/侦听器

目录 一 v-model表单元素 1.1 v-model绑定文本域的value 1.1.1 lazy属性:光标离开再发请求 1.1.2 number属性:如果能转成number就会转成numer类型 1.1.3 trim属性:去文本域输入的前后空格 1.2v-model绑定单选checkbox 1.3代码展示 二 …

esp8266+micropython+irsend红外发射调试记录

在网上搜索esp8266micropython的红外发射库,没找到,发现 接收库是有的,可以参考:基于MicroPython的ESP8266连接外设IO(二)_micropython 红外接收-CSDN博客 可惜没有发射,很不方便。 这里都有介…

PHP财务记账管理系统小程序源码

理财小能手必备!揭秘财务记账管理系统的魔力✨ 🌟 引入篇:告别糊涂账,拥抱财务自由 你是否曾为月底的账单头疼不已?是否觉得自己的钱总是莫名其妙地消失?别担心,财务记账管理系统来拯救你的钱…

【机器学习】必会数学知识:一文掌握数据科学核心数学知识点(下),收藏~

核心数学知识点 1、引言2、数据科学必会数学知识2.13 K均值聚类2.14 决策树2.15 随机森林2.16 梯度下降2.17 随机梯度下降(SGD)2.18 卷积2.19 拉普拉斯变换2.20 傅里叶变换2.21 信息论2.22 时间序列分析2.23 生成模型与判别模型2.24 支持向量机&#xff…

基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui

背景和意义 随着互联网和数字媒体行业的快速发展,视频网站作为重要的内容传播平台之一,用户量和内容丰富度呈现爆发式增长。本研究旨在设计并实现一种基于Python的哔哩哔哩数据分析系统,采用Flask框架、MySQL数据库以及echarts数据可视化技术…

NSObject‘s MetaClass 的 super_class 指向谁 ?

在 Objective-C 运行时系统中,NSObject 是所有类的根类。为了理解 NSObject 的元类(MetaClass)以及它的 super_class 指针指向谁,我们需要理解元类的继承关系。 类和元类的关系 每个类对象都有一个 isa 指针,指向其元…

46、lvs集群- 博客

1、lvs集群: lvs:linux virtual server----章文嵩发起的开源项目,阿里。linux的内核层面实现负载均衡的软件。 主要作用:将多个后端服务器组成一个高可用,高性能的服务器集群,通过负载均衡的算法将客户端的…

基于cmake为项目自动获取git分支tag的版本号和commitid

目录 1. 引言2. 实现过程2.1 工程目录规划2.2 c程序文件2.3 CMakeLists.txt2.4 GitVersion.cmake文件2.5 BuildNumber.cmake文件1. 引言 在项目构建的时候,我们经常会希望能够将git提交的分支信息和提交号(commitid)以及当前版本发布的tag信息作为版本号自动构建到程序里面,以…

自建搜索引擎-基于美丽云

Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…

通过git将文件push到github 远程仓库

1.先git clone 代码地址 git clone htttp://github.com/用户名/test.git 2. 添加文件 例如:touch 1.txt 3.将文件添加到暂存区 git add 1.txt 4.提交 git commit -m "commit 1.txt" 5.与远程仓库建立关联 git remote add 远程仓库名 远程仓库…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

详解[USACO07OPEN] Cheapest Palindrome G(洛谷PP2890)(区间DP经典题)

题目 思路 考虑区间DP。 设dp[i][j]为从i到j这段区间被修正为回文串的最小花费 c[cc][1]为添加字符cc的花费 c[cc][2]为删去字符cc的花费 s为题目给出的字符串。 用[i 1,j]区间转移:这种转移相当于在[i1,j]区间的左边加入一个字符,让[i,j]变为回文的方…

云仓适合什么商家?

1、电商平台和网店: 对于拥有大量在线订单但没有自建仓储和物流能力的小型和中型电商企业,云仓可以在成本和效率上提供显著优势,帮助快速处理订单并缩短配送时间。 —————————————————————————————————— …

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代,内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出,快速传播并吸引大量观众,成为了每个创作者关注的焦点。近日,一款名为“迅狐视频号矩阵系统”的神器震撼来袭,它以其…

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物?

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物? 关于uv胶的毒性问题,或许我们可以这样深入探讨。UV胶,如同一位戴着神秘面纱的访客,在我们的生活中悄然出现,却带着诸多疑问。那么&#xff0…

二维码生成需知:名片二维码尺寸多少合适?电子名片二维码制作方法?

随着数字化时代的到来,二维码在各个领域的应用越来越广泛,名片作为商业交流的重要工具之一,也开始逐渐融入二维码的元素。通过在名片上添加二维码,我们可以轻松实现信息的快速传递和分享。然而,名片二维码的尺寸选择成…