首页 > 其他分享 >踩坑日志3:每一个epoch都会重新随机采样,固定batch容易使模型陷入局部解

踩坑日志3:每一个epoch都会重新随机采样,固定batch容易使模型陷入局部解

时间:2024-09-15 22:46:53浏览次数:9  
标签:样本 torch batch epoch seed 日志 data

前几天师弟在机器学习领域看到了一个对样本选择的方法,目的是从特征的角度均匀选择样本。如下图所示,首先初始化将样本的特征进行加和并归一化,迭代取出样本(取值最大的那个样本,再令样本的值乘以1-样本的值更新所有样本)。这般便可以从理论上均匀的取到不同分布的样本,于是猜想如果这样的方法用于深度学习的样本选择,是否可以弥补batch随机选择样本的“缺陷”。我也认为这很合理,值得一试!

我花了一整个下午实现这个方法,下方图片中,中间的是采用原来随机的方法,左右两幅图是采用上面的方法。实验结果很差,甚至在训练集上都不能过拟合,妥妥的陷入了局部。但是没有道理呀,理论上我们的方法比随机的采样更加具有合理性,应该更能让模型均衡地学习到东西。

 

 

 思索再三,还是上网搜索得到信息“使用固定的batch进行训练,可能会导致模型陷入局部最优”。那么就疑惑了,dataloader中shuffle=True难道就不是固定的了吗?你别说,事实上每一个epoch,dataloader都会重新随机采样。使用下面代码进行验证:

import torch
from torch.utils.data import DataLoader, Dataset
import random
import numpy as np
def seed_torch(seed=12):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed) # 多GPU训练或分布式训练中
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True
seed_torch()

# 创建自定义数据集
class CustomDataset(Dataset):
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]

# 创建包含10个数据样本的数据集
data = torch.arange(10)  # 数据为 [0, 1, 2, ..., 9]
dataset = CustomDataset(data)

# 设置 DataLoader,batch_size=2, shuffle=True
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

# 运行多个 epoch 来验证每个 epoch 的 batch 顺序是否不同
num_epochs = 3
for epoch in range(num_epochs):
    print(f"Epoch {epoch + 1}:")
    for batch in dataloader:
        print(batch.tolist())  # 输出 batch 中的元素
    print('-' * 30)

'''
输出结果:
Epoch 1:
[3, 1]
[7, 0]
[8, 2]
[5, 6]
[4, 9]
------------------------------
Epoch 2:
[2, 6]
[5, 8]
[9, 0]
[1, 3]
[4, 7]
------------------------------
Epoch 3:
[9, 5]
[4, 7]
[8, 0]
[3, 1]
[2, 6]
------------------------------
'''

结果就是,我们之前讨论方法存在问题,直接使用上面的算法会固定batch的生成,从而造成模型陷入局部解。但是理论上,随机取样本仍然可能存在样本不平衡的情况,或许半随机+半均匀采样结合起来才能避免二者问题。

 

标签:样本,torch,batch,epoch,seed,日志,data
From: https://www.cnblogs.com/joker-yyak/p/18415764

相关文章

  • 开学日志5
    今天主要学习了一下java中get和set函数的使用情况publicclassPerson{//私有变量privateStringname;privateintage;//Getter方法publicStringgetName(){returnname;}publicintgetAge(){returnage;}//Setter方法publicvoidsetNa......
  • 一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集
    一、EFK简介Elasticsearch:一个开源的分布式搜索和分析引擎,用于存储和查询日志数据。它是EFK的核心组件,负责高效地存储和检索日志信息。Filebeat:一个轻量级的日志采集器,主要用于将日志文件数据发送到Logstash或Elasticsearch。Filebeat设计用于高效地转发和处理日志......
  • 预警提醒并生成日志,便于后期追溯的智慧地产开源了。
    智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。AI是新形势下数字经济的重要基础设施,具备同各行各业结......
  • 踩坑日志2:dataloader的num_workers问题
    当我想用dataloader多开子进程加快图片加载速度时,发现报有关进程的错误:RuntimeError:Anattempthasbeenmadetostartanewprocessbeforethecurrentprocesshasfinisheditsbootstrappingphase.Thisprobablymeansthatyouarenotu......
  • 踩坑日志1:UserWarning: Plan failed with a cudnnException: CUDNN_BACKEND_EXECUTION
     在运行深度模型时,遇到了下面有关cuDNN的错误,虽然好像不影响模型训练,但是感觉很烦、有一捏捏代码洁癖。D:\anaconda\envs\myPytorch\Lib\site-packages\torch\autograd\graph.py:744:UserWarning:PlanfailedwithacudnnException:CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPT......
  • 优化批处理流程:自定义BatchProcessorUtils的设计与应用
    优化批处理流程:自定义BatchProcessorUtils的设计与应用| 原创作者/编辑:凯哥Java                    | 分类:个人小工具类在我们开发过程中,处理大量的数据集是一项常见的任务。特别是在数据库操作、文件处理或者任何需要对大量数据进行分......
  • 蓝易云服务器 - ubuntu docker日志docker ubuntu desktop
    在Ubuntu桌面上使用Docker时,可以通过以下步骤查看Docker容器的日志:打开终端:在Ubuntu桌面上按下 Ctrl+Alt+T组合键可以打开终端。查看容器ID:运行以下命令查看正在运行的Docker容器的ID。dockerps查看容器日志:使用以下命令查看指定容器的日志,将 CONTAINER_ID替换为你想查看日......
  • 日志系统
    日志系统redolog重做日志redolog为InnoDB引擎特有的物理日志,记录了:“在某个数据页上做了什么修改”的操作,循环写入,具备着占用空间小、顺序写磁盘的优点writepos作为当前记录的位置,一边写一边顺时针移动;checkpoint作为当前要擦除的位置,一边擦出一边顺时针移动,在擦除记录前......
  • MySQL 慢查询日志:解锁数据库性能优化的关键
    在MySQL数据库的使用过程中,性能优化是一个持续的挑战。而慢查询日志就是我们手中的一把利器,能够帮助我们发现和解决性能瓶颈。那么,MySQL中的慢查询日志究竟是什么呢?又该如何使用它来优化性能呢?让我们一起来深入了解。一、慢查询日志的定义与作用慢查询日志是MySQL数据库用来......
  • MySQL 慢查询日志:解锁数据库性能优化的关键
    在MySQL数据库的使用过程中,性能优化是一个持续的挑战。而慢查询日志就是我们手中的一把利器,能够帮助我们发现和解决性能瓶颈。那么,MySQL中的慢查询日志究竟是什么呢?又该如何使用它来优化性能呢?让我们一起来深入了解。一、慢查询日志的定义与作用慢查询日志是MySQL数......