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

news/2024/9/20 18:01:56

前几天师弟在机器学习领域看到了一个对样本选择的方法,目的是从特征的角度均匀选择样本。如下图所示,首先初始化将样本的特征进行加和并归一化,迭代取出样本(取值最大的那个样本,再令样本的值乘以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 = Falsetorch.backends.cudnn.deterministic = True
seed_torch()# 创建自定义数据集
class CustomDataset(Dataset):def __init__(self, data):self.data = datadef __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的生成,从而造成模型陷入局部解。但是理论上,随机取样本仍然可能存在样本不平衡的情况,或许半随机+半均匀采样结合起来才能避免二者问题。

 

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

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

相关文章

动态规划——数学模型精解

动态规划是运筹学的一个分支,主要用于求解多阶段决策过程的优化问题。1950年代初,R.E. Bellman提出了最优性原理,将复杂的多阶段问题分解为一系列单阶段问题逐步求解,开创了动态规划这一方法。1957年,他出版了《Dynamic Programming》,成为该领域的经典著作。动态规划自问…

C#实现系统登录

1, 新建窗口frm_Loginusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace WindowsFormsA…

springboot原理

(原创)springboot原理😄一、配置优先级 > 命令行参数 > java系统属性 > properties文件 > yml文件(主流) > 环境变量1.java系统属性和命令行参数设置在IDEA中的实现如图:上面的箭头是java系统属性配置端口号为9091,下面的箭头是命令行参数配置端口号为100…

深度学习(FCN)

FCN是全卷积网络,用于做图像语义分割。通常将一般卷积网络最后的全连接层换成上采样或者反卷积网络,对图像的每个像素做分类,从而完成图像分割任务。 网络结构如下:这里并没有完全按照原始网络结构实现,而是尝试upsample和convTranspose2d结合的方式,看看有什么效果。 下…

旋转链表

旋转链表 开头: 对于链表的建立已经熟悉,那我们现在讲讲旋转链表的如何实现,当然旋转链表的建立是在已经掌握普通链表的基础上讲解。 正文: 旋转链表,顾名思义就是让链表“动起来”。即:使链表尾部最后的结点转到链表首部的位置。假设已经建立好一条6个结点的链表,它的初…

多线程五-线程通信之wait与notify

wait与notify用于syncronized的线程间通信的一种,wait用来阻塞线程并释放锁,notify用来唤醒线程。他们与condition作用基本一致,但是由于syncronized为jdk实现,阅读源码有难度,所以通过了解其原理,用来帮助我们后续理解condition的源码。 可以通过下面一张图来理解:下面…

帝国cms忘记了后台密码怎么办

如果你忘记了帝国CMS(EmpireCMS)的后台管理员密码,可以通过以下步骤来重置密码: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 打…

如何恢复对帝国CMS的访问,忘记账号密码的解决方案

如果你忘记了帝国CMS的后台管理员账号和密码,可以通过以下步骤来恢复对系统的访问: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 …