使用相同模型相同数据集,为什么每次运行得到的损失值都不一样?

news2024/9/27 23:30:07

今天小编在学习 PyTorch 时,突然发现咋每次运行所得损失绘制的曲线都不一样呢?即使小编使用torch.manual_seed()函数固定 torch 的随机数种子每次运行的结果还是不一样,因此小编就写一篇文章记录一下。

数据集

本次使用的数据集是小编自定义的小型数据集:

x1x2x3x4x5x6x7x8x9x10y
464113572142224454321
395519562351303035560
423314352953305133591
512518232728243921300
365820422649285121361
603016412658282326411
282612582346514154270
453710502626272732541
474916372049203744280
465512592638222043561
562713262026452653341

注:

  1. 表格中xi 表示样本特征(输入),而y表示值(输出)。
  2. 制作数据集时,需要先将样本数据导入excel表格,再将文件保存为.csv格式的文件,最后再使用函数np.loadtxt(DATASETS_PATH + “文件名.csv”, delimiter=“,”, dtype=np.float32, skiprows=1)即可完成数据导入。

源码与分析

首先使用 numpy 加载数据集,并且将模型的输入与输出值分别取出。

def dataLoader():
    """
    加载数据集
    """
    xy = np.loadtxt(DATASETS_PATH + "/my_test/my_test.csv", delimiter=",", dtype=np.float32, skiprows=1)
    x_data = torch.from_numpy(xy[:, :-1])
    y_data = torch.from_numpy(xy[:, [-1]])

    return x_data, y_data

定义模型,在这个模型的最初输入是 10 维数据,输出是 1 维数据。

class my_model(nn.Module):
    def __init__(self):
        super(my_model, self).__init__()
        self.network = nn.Sequential(
            nn.Linear(10, 5),
            nn.ReLU(),
            nn.Linear(5, 2),
            nn.ReLU(),
            nn.Linear(2, 1)
        )

    def forward(self, x):
        y_pred = self.network(x)
        return y_pred

网络结构self.network是一个由多个层组成的序列,使用nn.Sequential来组织。这意味着数据将按照定义的顺序依次通过这些层。

  • 第一层:nn.Linear(10, 5),这是一个全连接层,将输入特征从10维减少到5维。
  • 第二层:nn.Sigmoid(),这是一个激活函数,将第一层的输出通过Sigmoid函数,输出值范围在0到1之间,通常用于二分类问题。
  • 第三层:nn.Linear(5, 2),又一个全连接层,将特征从5维减少到2维。
  • 第四层:nn.Sigmoid(),再次使用Sigmoid激活函数。
  • 第五层:nn.Linear(2, 1),将特征从2维减少到1维,这通常意味着模型的输出是一个单一的值。
  • 第六层:nn.Sigmoid(),最后一层也是Sigmoid激活函数。

前向传播forward方法定义了数据通过模型的方式。输入x将通过self.network,即上面定义的序列,最终得到预测值y_pred
输出:模型的输出是一个经过Sigmoid函数的单一值。这意味着无论输入特征如何,模型的输出都将是一个介于0和1之间的值,这通常用于二元分类问题,其中输出可以解释为属于某个类别的概率。
模型训练有六个步骤:数据集加载、模型定义、损失函数定义、优化器定义、训练模型、测试模型。一般情况下数据加载时会得到两部分数据:训练集与测试集,训练集通常用于模型训练或作为测试集的一部分,测试集用于测试所得到模型的准确度也可提高模型的泛化能力。
下面是模型训练的代码,此次训练直接使用所有测试集,且并未添加测试集。

def train():
    # step1 数据加载
    x_data, y_data = dataLoader()
    # step2 模型定义
    model = my_model()

    # step3 损失函数定义
    loss = nn.MSELoss()
    # step4 优化器定义
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    # step5 训练
    loss_list = []
    for i in range(5):
        _loss_list = []
        for epoch in range(100):
            # 前向传播
            y_pred = model(x_data)
            # 计算损失
            loss_value = loss(y_pred, y_data)
            _loss_list.append(loss_value.item())
            # 反向传播
            optimizer.zero_grad()
            loss_value.backward()
            # 更新参数
            optimizer.step()
        loss_list.append(_loss_list)
    # 绘制损失曲线
    draw_liners((range(len(loss_list[0])), loss_list[0], '-', 'liner1'),
                (range(len(loss_list[1])), loss_list[1], '--', 'liner2'),
                (range(len(loss_list[2])), loss_list[2], '-.', 'liner3'),
                (range(len(loss_list[3])), loss_list[3], ':', 'liner4'),
                (range(len(loss_list[4])), loss_list[4], 'solid', 'liner5'),
                labels=['epoch', 'loss vale'], img_name="loss liners0",
                is_display=False, is_save=True, imgs_path=IMAGES_PATH)

未添加随机数种子时,得到结果:
跑.png
添加随机数种子后得到结果
p1.png
在 pytorch 中可使用torch.manual_seed(11) 添加随机数种子,添加随机数种子用于初始化随机数生成器的状态,能够确保实验的可重复性。

问题阐述与分析

好!那么问题来了。

  • 上述八张图片中曲线的线型大致一致,均为单调减函数,同一个 liner 相差并不是特别大,但不同 liner 数值上相差非常大。
  • 未添加随机数种子时,每次训练所得到的曲线虽然线型一致,但是值存在一定的误差。
  • 而添加随机数种子后,每次重新训练每个单独的 liner 都一样,但是不同 liner 值却不一样。

询问 AI 后,看 AI 的结果:

使用相同模型和数据集进行训练时,每次运行得到的损失值可能会不同,这可能是由以下几个因素导致的:

  1. 初始化权重的差异:神经网络在训练前需要初始化权重,不同的初始化方法或随机种子会导致权重初始化值不同,从而影响最终的损失值 。
  2. 学习率设置:如果学习率过大,可能会导致损失值突然变得很大,即模型训练出现“跑飞”的情况 。
  3. 数据集的划分和顺序:即使是相同的数据集,不同的数据划分和读取顺序也可能导致每次训练损失值波动 。
  4. 优化器的选择和配置:不同的优化器(如SGD、Adam等)或其配置参数(如动量、衰减率等)会影响模型训练的动态过程,进而影响损失值 。
  5. 正则化策略:正则化项的加入和参数(如L1、L2正则化的系数)会影响损失函数的值,不同的正则化设置可能导致损失值的变化 。
  6. 梯度消失或爆炸问题:在深度学习中,梯度消失或爆炸问题可能导致模型训练不稳定,从而影响损失值的稳定下降 。
  7. 训练过程中的随机性:如Dropout等引入随机性的操作,每次执行时都可能不同,进而影响损失值 。
  8. 数据预处理:数据的标准化、归一化等预处理步骤的不同,也可能导致损失值的波动 。
  9. 模型结构设计:模型结构的不同,如层数、神经元数量等,也会影响损失值的最终结果 。
  10. 损失函数的选择:不同的损失函数可能对模型训练过程中的损失值有不同的影响,特别是在分类问题中,交叉熵损失函数的选择会对损失值产生影响 。

小编的想法:

  • 计算精度:因为计算机内部参与运算的数据大小会受到一定的限制,这就有可能会造成最终结果产生一定误差。在控制台中打印每次 loss 得到结果loss_value.item()=0.2310512214899063,个人猜测这种可能性较小。
  • 模型的随机性:神经网络算法具有一定的随机性,如初始化随机权重,因此用同样的数据训练同一个网络会得到不同的结果。模型定义时,可使用下面这段代码查看模型参数。
self.linear = nn.Linear(in_features, out_features)
for name, p in self.linear.named_parameter():
    print(name, ": ", p)
  • 第三方库的随机性:在本模型中,并未引入任何第三方库,因此小编认为此种情况不符合这个实例。

【Python 】数据可视化入门:使用 Matplotlib、Numpy 和 SciPy 绘制精美曲线曲面图

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

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

相关文章

MySQL数据管理 - 查询语句

文章目录 查询数据1 查询指定列2 条件查询3 合并查询4 模糊查询5 聚合函数查询6 对值进行排序7 分组查询8 分页查询9 数据库关联查询1 内连接 INNER JOIN2 LEFT JOIN3 右连接 10 数据库子查询参考 查询数据 数据库最常用的操作就是查询,也是数据操作的基础&#xf…

MySQL基础练习题23-门店处理

目录 题目 准备数据 分析数据 方法一 方法二 题目 从分店明细表中获取门店面积。 准备数据 -- 创建库 drop database if exists db_1; create database db_1; use db_1;-- 创建门店面积表 tb_store_area CREATE TABLE tb_store_area (store_no VARCHAR(50),area…

[器械财讯]TRiCares完成近4亿融资,推动Topaz三尖瓣置换系统发展

一、融资成功助力临床研究 法国医疗器械公司TRiCares近期宣布,其D轮融资成功筹集5000万美元,所得资金将专用于支持其核心产品——经导管三尖瓣置换系统(TTVR)Topaz的临床研究和开发。这笔资金将用于在美国和欧盟开展临床研究&…

手持红外热成像仪的使用方法_鼎跃安全

手持红外热成像仪是一种便携设备,方便在现场进行温度检测和成像。他们能将物体发出的不可见红外能量转化为可见的热图像,直观展示物体表面的温度分布情况;广泛应用于电气设备维修、环保检查、应急救援等领域。接下来,我们一起来了…

行业原型:智慧教育线上平台-学院原型

行业原型预览链接: 文件类型:.rp 支持版本:Axrure RP 8 文档名称:智慧教育线上平台-学院 文件大小:1.80 MB 目录内容介绍 文档内容介绍 回复“211110” 领取

《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)

1.简介 在我们日常工作中进行UI自动化测试时,保证测试的稳定性至关重要。其中一个关键方面是正确地定位和操作网页中的元素。在网页中,元素可能处于不同的状态,有些可能在页面加载完成之前不在DOM中,需要某些操作后才会出现&…

视频剪辑sdk,跨平台部署,助力企业差异化竞争

在这个内容为王的时代,视频已成为连接用户、传递价值的核心媒介。无论是社交媒体、在线教育、短视频平台还是新闻资讯,高质量的视频内容都是吸引用户、提升用户体验的关键。然而,对于众多企业而言,如何高效、专业地处理视频内容&a…

字节跳动春节抖音视频红包系统设计与实现--图文解析

字节跳动春节抖音视频红包系统设计与实现–图文解析 原作者:字节跳动技术团队 原文链接:https://www.toutiao.com/article/7114224228030841374 原标题:2022 春节抖音视频红包系统设计与实现 我们做了什么 业务背景 在春节活动期间&…

洛谷 P10034 「Cfz Round 3」Circle

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这是道好题。 建图,对每一个 i → p i i \to p_{i} i→pi​ 都建立一个有向边,就可以得到一个…

记一次学习--[网鼎杯 2018]Comment二次注入

目录 本文章只展示二次注入过程,后续获取flag并不展示 靶场 网站流程、密码的破解和目录的查询以及对于源代码获取 密码暴力破解 网站目录扫描 网站源代码获取 网站流程 尝试注入 注入代码 本文章只展示二次注入过程,后续获取flag并不展示 靶场…

IntelliJ IDEA 2024.2 夏季大版本发布,不得不说,更强了!

因 CSDN 上传大小限制,本文推荐微信中阅读,动图更完整,微信中阅读,请欢迎关注公众号:CodeFit 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创…

Katalon Studio 使用教程——自动获取元素定位功能

这个功能很实用,简单来讲可以形容为,想要哪里点哪里,so easy。 比如你想定位某个输入框,只需要按住【Alt】,点一下输入框,系统就自动记录下来这个输入框叫什么,它的xpath是什么。你想要按钮就点…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题:LLaVA-OneVision:Easy Visual Task Transfer 论文地址:https://arxiv.org/abs/2408.03326 GitHub:https://llava-vl.githu…

4岁小孩孤独症的表现

在儿童的成长过程中,孤独症(也称自闭症)的早期识别与干预至关重要。对于4岁的孩子而言,孤独症的表现可能已经开始显现,家长和教育者需保持高度敏感,以便及时采取措施。 社交互动障碍:4岁孤独症儿…

Stable Diffusion绘画 | 图生图-上传重绘蒙版

上传重绘蒙版,可以弥补局部重绘的缺点,能够更精细的修改画面中的指定区域 使用PS制作的蒙版图片为耳朵下方区域,可以为图片中的女生带上不同款式的耳环。 参数配置: 调整提示词: 生成图片如下所示: 调整提…

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

文章目录 龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非…

分享一个基于数据可视化的交通感知与车辆检测协同系统(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

【SQL】产品销售分析 I

目录 题目 分析 代码 题目 销售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | ---------------…

【省流】入网,继续更!

大家好,我是一名默默学习的计算机小菜菜 在几分钟前我决定继续学习计算机知识和写博客 在这之前我已经停写了很久了,因为我真的找不到相关工作啊啊啊,有点萎靡,经常性精神内耗, 而之所以我死灰复燃(可能不…

NeRF的代码复现以及人工智能入门

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…