源码级理解Pytorch中的Dataset和DataLoader

设定并理解随机数种子 && Pytorch在Dataloader类中设置shuffle的随机数种子方式 1 PyTorch设置随机数的种子 为了保证模型和数据生成的可再现性,需要设定随机种子。 只要知道随机性来自哪里,设置对应的随机种子即可。 比如使用了numpy.random,则应设置numpy.random.seed(seed)。 2. python调试技巧之设定随机数种子 3.Pytorch在dataloader类中设置shuffle的随机数种子方式 设置随机种子的作用就是让你的每一次训练都乱的一样,即可以让你在单次训练内部数据保持乱序但不同训练之间都是一样的乱序。 阅读详情

朋友,你还在为构建Pytorch中的数据管道而烦扰吗?你是否有遇到过一些复杂的数据集需要设计自定义collate_fn却不知如何下手的情况?你是否有遇到过数据管道加载速度过慢成为训练性能瓶颈却不知道如何优化的情况?

本篇文章就是你需要的,30分钟带你达到对Pytorch中的Dataset和DataLoader的源码级理解,并提供构建数据管道的3种常用方式的范例,扫除你构建数据管道的一切障碍。

〇,Dataset和DataLoader功能简介

Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。

Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素。

而DataLoader定义了按batch加载数据集的方法,它是一个实现了__iter__方法的可迭代对象,每次迭代输出一个batch的数据。

DataLoader能够控制batch的大小,batch中元素的采样方法,以及将batch结果整理成模型所需输入形式的方法,并且能够使用多进程读取数据。

在绝大部分情况下,用户只需实现Dataset的__len__方法和__getitem__方法,就可以轻松构建自己的数据集,并用默认数据管道进行加载。

对于一些复杂的数据集,用户可能还要自己设计 DataLoader中的 collate_fn方法以便将获取的一个批次的数据整理成模型需要的输入形式。

一,深入理解Dataset和DataLoader原理

1,获取一个batch数据的步骤

让我们考虑一下从一个数据集中获取一个batch的数据需要哪些步骤。

(假定数据集的特征和标签分别表示为张量X和Y,数据集可以表示为(X,Y), 假定batch大小为m)

1,首先我们要确定数据集的长度n。

结果类似:n = 1000。

2,然后我们从0到n-1的范围中抽样出m个数(batch大小)。

假定m=4, 拿到的结果是一个列表,类似:indices = [1,4,8,9]

3,接着我们从数据集中去取这m个数对应下标的元素。

拿到的结果是一个元组列表,类似:samples = [(X[1],Y[1]),(X[4],Y[4]),(X[8],Y[8]),(X[9],Y[9])]

4,最后我们将结果整理成两个张量作为输出。

拿到的结果是两个张量,类似batch = (features,labels) ,

其中 features = torch.stack([X[1],X[4],X[8],X[9]])

labels = torch.stack([Y[1],Y[4],Y[8],Y[9]])

2,Dataset和DataLoader的功能分工

上述第1个步骤确定数据集的长度是由 Dataset的__len__ 方法实现的。

第2个步骤从0到n-1的范围中抽样出m个数的方法是由 DataLoader的 sampler和 batch_sampler参数指定的。

sampler参数指定单个元素抽样方法,一般无需用户设置,程序默认在DataLoader的参数shuffle=True时采用随机抽样,shuffle=False时采用顺序抽样。

batch_sampler参数将多个抽样的元素整理成一个列表,一般无需用户设置,默认方法在DataLoader的参数drop_last=True时会丢弃数据集最后一个长度不能被batch大小整除的批次,在drop_last=False时保留最后一个批次。

第3个步骤的核心逻辑根据下标取数据集中的元素 是由 Dataset的 __getitem__方法实现的。

第4个步骤的逻辑由DataLoader的参数collate_fn指定。一般情况下也无需用户设置。

Dataset和DataLoader的一般使用方式如下:

import torch 
from torch.utils.data import TensorDataset,Dataset,DataLoader
from torch.utils.data import RandomSampler,BatchSampler 


ds = TensorDataset(torch.randn(1000,3),
                   torch.randint(low=0,high=2,size=(1000,)).float())
dl = DataLoader(ds,batch_size=4,drop_last = False)
features,labels = next(iter(dl))
print("features = ",features )
print("labels = ",labels )

将DataLoader内部调用方式步骤拆解如下:

# step1: 确定数据集长度 (Dataset的 __len__ 方法实现)
ds = TensorDataset(torch.randn(1000,3),
                   torch.randint(low=0,high=2,size=(1000,)).float())
print("n = ", len(ds)) # len(ds)等价于 ds.__len__()

# step2: 确定抽样indices (DataLoader中的 Sampler和BatchSampler实现)
sampler = RandomSampler(data_source = ds)
batch_sampler = BatchSampler(sampler = sampler, 
                             batch_size = 4, drop_last = False)
for idxs in batch_sampler:
    indices = idxs
    break 
print("indices = ",indices)

# step3: 取出一批样本batch (Dataset的 __getitem__ 方法实现)
batch = [ds[i] for i in  indices]  #  ds[i] 等价于 ds.__getitem__(i)
print("batch = ", batch)

# step4: 整理成features和labels (DataLoader 的 collate_fn 方法实现)
def collate_fn(batch):
    features = torch.stack([sample[0] for sample in batch])
    labels = torch.stack([sample[1] for sample in batch])
    return features,labels 

features,labels = collate_fn(batch)
print("features = ",features)
print("labels = ",labels)

3,Dataset和DataLoader的核心源码

以下是 Dataset和 DataLoader的核心源码,省略了为了提升性能而引入的诸如多进程读取数据相关的代码。

import torch 
class Dataset(object):
    def __init__(self):
        pass
    
    def __len__(self):
        raise NotImplementedError
        
    def __getitem__(self,index):
        raise NotImplementedError
        

class DataLoader(object):
    def __init__(self,dataset,batch_size,collate_fn = None,shuffle = True,drop_last = False):
        self.dataset = dataset
        self.sampler =torch.utils.data.RandomSampler if shuffle else \
           torch.utils.data.SequentialSampler
        self.batch_sampler = torch.utils.data.BatchSampler
        self.sample_iter = self.batch_sampler(
            self.sampler(self.dataset),
            batch_size = batch_size,drop_last = drop_last)
        self.collate_fn = collate_fn if collate_fn is not None else \
            torch.utils.data._utils.collate.default_collate
        
    def __next__(self):
        indices = next(iter(self.sample_iter))
        batch = self.collate_fn([self.dataset[i] for i in indices])
        return batch
    
    def __iter__(self):
        return self

我们来测试一番

class ToyDataset(Dataset):
    def __init__(self,X,Y):
        self.X = X
        self.Y = Y 
    def __len__(self):
        return len(self.X)
    def __getitem__(self,index):
        return self.X[index],self.Y[index]
    
X,Y = torch.randn(1000,3),torch.randint(low=0,high=2,size=(1000,)).float()
ds = ToyDataset(X,Y)

dl = DataLoader(ds,batch_size=4,drop_last = False)
features,labels = next(iter(dl)) 
print("features = ",features )
print("labels = ",labels )

完美, 和预期一致!

二,使用Dataset创建数据集

Dataset创建数据集常用的方法有:

  • 使用 torch.utils.data.TensorDataset 根据Tensor创建数据集(numpy的array,Pandas的DataFrame需要先转换成Tensor)。

  • 使用 torchvision.datasets.ImageFolder 根据图片目录创建图片数据集。

  • 继承 torch.utils.data.Dataset 创建自定义数据集。

此外,还可以通过

  • torch.utils.data.random_split 将一个数据集分割成多份,常用于分割训练集,验证集和测试集。

  • 调用Dataset的加法运算符(+)将多个数据集合并成一个数据集。

1,根据Tensor创建数据集

import numpy as np 
import torch 
from torch.utils.data import TensorDataset,Dataset,DataLoader,random_split
# 根据Tensor创建数据集

from sklearn import datasets 
iris = datasets.load_iris()
ds_iris = TensorDataset(torch.tensor(iris.data),torch.tensor(iris.target))

# 分割成训练集和预测集
n_train = int(len(ds_iris)*0.8)
n_val = len(ds_iris) - n_train
ds_train,ds_val = random_split(ds_iris,[n_train,n_val])

print(type(ds_iris))
print(type(ds_train))
# 使用DataLoader加载数据集
dl_train,dl_val = DataLoader(ds_train,batch_size = 8),DataLoader(ds_val,batch_size = 8)

for features,labels in dl_train:
    print(features,labels)
    break
# 演示加法运算符(`+`)的合并作用

ds_data = ds_train + ds_val

print('len(ds_train) = ',len(ds_train))
print('len(ds_valid) = ',len(ds_val))
print('len(ds_train+ds_valid) = ',len(ds_data))

print(type(ds_data))

2,根据图片目录创建图片数据集

import numpy as np 
import torch 
from torch.utils.data import DataLoader
from torchvision import transforms,datasets
#演示一些常用的图片增强操作
from PIL import Image
img = Image.open('./data/cat.jpeg')
img
# 随机数值翻转
transforms.RandomVerticalFlip()(img)
#随机旋转
transforms.RandomRotation(45)(img)
# 定义图片增强操作

transform_train = transforms.Compose([
   transforms.RandomHorizontalFlip(), #随机水平翻转
   transforms.RandomVerticalFlip(), #随机垂直翻转
   transforms.RandomRotation(45),  #随机在45度角度内旋转
   transforms.ToTensor() #转换成张量
  ]
) 

transform_valid = transforms.Compose([
    transforms.ToTensor()
  ]
)
# 根据图片目录创建数据集

def transform_label(x):
    return torch.tensor([x]).float()

ds_train = datasets.ImageFolder("./eat_pytorch_datasets/cifar2/train/",
            transform = transform_train,target_transform= transform_label)
ds_val = datasets.ImageFolder("./eat_pytorch_datasets/cifar2/test/",
                              transform = transform_valid,
                              target_transform= transform_label)


print(ds_train.class_to_idx)

# 使用DataLoader加载数据集

dl_train = DataLoader(ds_train,batch_size = 50,shuffle = True)
dl_val = DataLoader(ds_val,batch_size = 50,shuffle = True)


for features,labels in dl_train:
    print(features.shape)
    print(labels.shape)
    break

3,创建自定义数据集

下面我们通过另外一种方式,即继承 torch.utils.data.Dataset 创建自定义数据集的方式来对 cifar2构建 数据管道。

from pathlib import Path 
from PIL import Image 

class Cifar2Dataset(Dataset):
    def __init__(self,imgs_dir,img_transform):
        self.files = list(Path(imgs_dir).rglob("*.jpg"))
        self.transform = img_transform
        
    def __len__(self,):
        return len(self.files)
    
    def __getitem__(self,i):
        file_i = str(self.files[i])
        img = Image.open(file_i)
        tensor = self.transform(img)
        label = torch.tensor([1.0]) if  "1_automobile" in file_i else torch.tensor([0.0])
        return tensor,label 
    
    
train_dir = "./eat_pytorch_datasets/cifar2/train/"
test_dir = "./eat_pytorch_datasets/cifar2/test/"
# 定义图片增强
transform_train = transforms.Compose([
   transforms.RandomHorizontalFlip(), #随机水平翻转
   transforms.RandomVerticalFlip(), #随机垂直翻转
   transforms.RandomRotation(45),  #随机在45度角度内旋转
   transforms.ToTensor() #转换成张量
  ]
) 

transform_val = transforms.Compose([
    transforms.ToTensor()
  ]
)
ds_train = Cifar2Dataset(train_dir,transform_train)
ds_val = Cifar2Dataset(test_dir,transform_val)


dl_train = DataLoader(ds_train,batch_size = 50,shuffle = True)
dl_val = DataLoader(ds_val,batch_size = 50,shuffle = True)


for features,labels in dl_train:
    print(features.shape)
    print(labels.shape)
    break

三,使用DataLoader加载数据集

DataLoader能够控制batch的大小,batch中元素的采样方法,以及将batch结果整理成模型所需输入形式的方法,并且能够使用多进程读取数据。

DataLoader的函数签名如下。

DataLoader(
    dataset,
    batch_size=1,
    shuffle=False,
    sampler=None,
    batch_sampler=None,
    num_workers=0,
    collate_fn=None,
    pin_memory=False,
    drop_last=False,
    timeout=0,
    worker_init_fn=None,
    multiprocessing_context=None,
)

一般情况下,我们仅仅会配置 dataset, batch_size, shuffle, num_workers,pin_memory, drop_last这六个参数,

有时候对于一些复杂结构的数据集,还需要自定义collate_fn函数,其他参数一般使用默认值即可。

DataLoader除了可以加载我们前面讲的 torch.utils.data.Dataset 外,还能够加载另外一种数据集 torch.utils.data.IterableDataset。

和Dataset数据集相当于一种列表结构不同,IterableDataset相当于一种迭代器结构。它更加复杂,一般较少使用。

  • dataset : 数据集

  • batch_size: 批次大小

  • shuffle: 是否乱序

  • sampler: 样本采样函数,一般无需设置。

  • batch_sampler: 批次采样函数,一般无需设置。

  • num_workers: 使用多进程读取数据,设置的进程数。

  • collate_fn: 整理一个批次数据的函数。

  • pin_memory: 是否设置为锁业内存。默认为False,锁业内存不会使用虚拟内存(硬盘),从锁业内存拷贝到GPU上速度会更快。

  • drop_last: 是否丢弃最后一个样本数量不足batch_size批次数据。

  • timeout: 加载一个数据批次的最长等待时间,一般无需设置。

  • worker_init_fn: 每个worker中dataset的初始化函数,常用于 IterableDataset。一般不使用。

#构建输入数据管道
ds = TensorDataset(torch.arange(1,50))
dl = DataLoader(ds,
                batch_size = 10,
                shuffle= True,
                num_workers=2,
                drop_last = True)
#迭代数据
for batch, in dl:
    print(batch)
tensor([43, 44, 21, 36,  9,  5, 28, 16, 20, 14])
tensor([23, 49, 35, 38,  2, 34, 45, 18, 15, 40])
tensor([26,  6, 27, 39,  8,  4, 24, 19, 32, 17])
tensor([ 1, 29, 11, 47, 12, 22, 48, 42, 10,  7])

【深度学习笔记1】-pytorch的dataloader参数shuffle设置true或false Pytorch在处理时序数据过程中数据加载器的shuffle是否设置为true的情况讨论 阅读详情

相关推荐

pytorch 的 DataLoader中的shuffer与随机种子

好多博客都只说简单shuffer与随机种子,没有说清楚他们具体作用,这次我来具体说说。 DataLoader用于加载数据到模型中 在pytorch 中的数据加载到模型的操作顺序是这样的: ① 创建一个 Dataset 对象 (自己去实现以下这个类,内部使用yeild返回一组数据数据) ② 创建一个 DataLoader 对象 ③ 循环这个 DataLoader 对象,将img, label加载到模型中进行训练 DataLoader中的shuffer=False表示不打乱数据的顺序,然后以batch为单位从

qq_44901346的博客 2万+

PyTorch | 如何控制dataloader的随机shuffle

前言在使用PyTorch进行训练或者测试的过程中,一般来说dataloader在每个epoch返回的样本顺序是不一样的,但在某些特殊情况中,我们可能希望dataloader按照固定的顺序进行多个epoch。本文作者给出了一个简单方便的实现思路,附详解代码。作者:魏鸿鑫@知乎编辑:CV技术指南原文:https://zhuanlan.zhihu.com/p/51569736...

idol24的博客 7543

PyTorch DataLoader核心参数详解与性能调优实战指南

在深度学习模型训练中,数据加载与预处理是影响整体效率的关键环节。PyTorch的DataLoader作为数据管道的核心组件,通过其多进程并行加载机制,能够有效解决CPU数据预处理与GPU模型计算之间的速度不匹配问题,从而显著提升训练效率。其核心原理在于采用生产者-消费者模型,利用num_workers参数创建工作进程,实现数据加载与模型计算的重叠执行。在工程实践中,合理配置batch_size、shuffle、pin_memory等参数,并结合自定义collate_fn处理可变长度数据,是构建高效数据流的基

weixin_30655569的博客 415

在pytorch中将数据打包为DataLoader后每个epoch中的打乱策略

在pytorch中将数据打包为DataLoader后每个epoch中的打乱策略

xfysq_的博客 4238

PyTorch | 从零构建自定义Dataset与DataLoader:原理、实践与源码解析

本文详细解析了如何在PyTorch中从零构建自定义Dataset与DataLoader,涵盖核心原理、实践技巧与源码分析。通过实例代码展示如何高效处理各类数据格式,优化数据加载性能,并解决多进程、内存管理等常见问题,帮助开发者掌握PyTorch数据管道的深度定制方法。

weixin_29483277的博客 289

DiffusionDriverV2源码级解读

结合扩散模型与强化学习的端到端大模型

mocun172的博客 525

实践教程|源码级理解Pytorch中的Dataset和DataLoader

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达前言本文30分钟带你达到对Pytorch中的Dataset和DataLoader的源码级理解,并提供构建数据管道的3种常用方式的范例,扫除你构建数据管道的一切障碍。作者:梁云1991来源:算法美食屋仅用于学术分享,若侵权请联系删除朋友,你还在为构建Pytorch中的数据管道而烦扰吗?你是否有遇到过一些复杂的数据集需要设计自定义...

小白学视觉 383

Continuous Thought Machine源码级拆解:连续思维如何重塑长序列建模

在深度学习序列建模领域,Transformer以并行注意力机制成为主流,但面对超长上下文时计算复杂度二次增长的问题日益凸显。状态空间模型(SSM)与递归神经网络(RNN)重新受到关注,它们通过固定维度的隐状态压缩历史信息,实现线性复杂度推理。连续思维机器(Continuous Thought Machine)正是这一方向的前沿实践,其核心思想是让模型内部维持一个随时间平滑演化的连续状态,而非离散的token级缓存。从源码层面审视,这种设计涉及状态更新门控、多时间尺度记忆、并行扫描优化等关键技术,也需要解决数

weixin_33851604的博客 360

PyTorch深度学习实战:从环境搭建到图像分类全流程解析

深度学习正从学术研究走向工业落地,而神经网络的核心思想,是让程序通过海量数据自动学习特征与规律,替代传统人工编写规则的方式。理解这一原理后,选择合适的开发框架便成为关键。PyTorch凭借动态计算图、自然的Python风格和完善的生态,成为入门与实战的主流选择。其底层的张量操作与自动求导机制,更是让开发者无需手动推导复杂的梯度公式,即可高效训练模型。在计算机视觉领域,图像分类是最经典的应用场景之一,结合卷积神经网络、损失函数与优化器等基础组件,即可从零搭建一个可运行的识别项目。本文以PyTorch为主线,从

weixin_33910385的博客 487

PyTorch手撕DCGAN:从噪声到数字的完整训练闭环解析

生成对抗网络(GAN)是深度生成模型的核心范式,其本质是通过生成器与判别器的极小极大博弈,学习真实数据的隐式分布。理解GAN不能止步于‘对抗’比喻,而需深入梯度流动、架构约束与训练动态——例如转置卷积的棋盘效应、BatchNorm在生成器输入层的禁用逻辑、噪声分布对梯度方差的影响等关键技术细节,直接决定模型能否收敛与泛化。这些原理在DCGAN中体现得尤为清晰:它用卷积结构建模空间先验,以Tanh输出匹配[-1,1]归一化,通过精心设计的BN开关策略保障模式多样性。本文聚焦MNIST上的可复现DCGAN实现,

huqiyes的专栏 448

AI学习者的进度同步协议:从环境错位到可验证实践

在AI学习过程中,'学不会'往往不是因为概念缺失,而是环境配置、代码实现与预期行为之间的细微错位——这种‘路径熵’导致大量时间消耗在调试torch.cuda.is_available()为False或LoRA微调结果波动等具体问题上。其本质是开发环境、开源框架(如Hugging Face Transformers、PyTorch)与真实社区实践(GitHub Issues、Discord讨论)三者未对齐。通过构建可复现的最小项目、函数级源码深挖和认知断层实测验证,学习者能将模糊的学习目标转化为可测量、可回溯

weixin_30263277的博客 570

Adagrad自适应优化原理与稀疏数据训练实战

Adagrad是一种基于历史梯度平方累积的自适应学习率优化算法,其核心原理是为每个参数动态调整更新步长,实现‘因材施教’的参数更新策略。该机制天然适配稀疏数据场景,尤其在推荐系统、自然语言处理等高维稀疏特征建模中展现出优异的收敛稳定性与鲁棒性。相比Adam等现代优化器,Adagrad具备更强的可解释性与白盒诊断能力,便于定位训练异常。本文深入剖析其数学本质、PyTorch底层实现细节,并结合稀疏文本分类任务提供可复现的工程实践方案,涵盖梯度裁剪、BatchNorm适配、早停策略及Adagrad专属避坑指南。

482

AI工程师成长加速器:6个实战型技术社区推荐

人工智能(AI)工程能力并非孤立习得,而是在真实问题驱动的协作环境中持续进化。理解AI社区的本质,是掌握从模型开发、调试优化到生产部署全链路的关键一环;其核心原理在于通过高密度问题沉淀、可验证响应与角色多元的深度互动,构建知识复用与信任传递机制;这种机制显著提升问题解决效率与技术决策质量,尤其在模型上线卡点、论文复现偏差、边缘端性能调优等典型工程场景中价值突出;本文聚焦六个经三年实测验证的AI技术社区,覆盖Hugging Face、PyTorch Forum、ML Ops Slack等平台,强调‘带错误日志

weixin_33901641的博客 387

PyTorch实战:FCN与UNet图像分割算法源码解析与工程实现

图像分割作为计算机视觉的核心任务,旨在实现像素级的语义理解,其核心原理是通过深度学习模型对图像中的每个像素进行分类。全卷积网络(FCN)通过将传统分类网络的全连接层替换为卷积层,实现了对任意尺寸输入的密集预测,奠定了现代分割网络的基础。UNet则以其独特的U型对称编码器-解码器架构和跳跃连接,在医学影像等需要精细边界的场景中表现出色,有效融合了深层语义信息与浅层细节特征。这些技术的工程价值在于能够直接应用于自动驾驶感知、医学影像分析和工业质检等实际场景。本文聚焦于PyTorch框架下的实战,深入解析FCN和

weixin_34128839的博客 414

2020年StyleGAN2人脸生成与梯度追踪实战解析

生成对抗网络(GAN)是生成式AI早期实现高保真人脸合成的核心范式,其原理依赖判别器与生成器的动态博弈,在潜在空间中构建可微分、可干预的数据分布映射。技术价值在于突破传统图像建模的重构约束,支持亚像素级细节生成与细粒度语义控制;典型应用场景涵盖AI头像服务、虚拟人内容生产及AIGC可解释性审计。而梯度追踪与潜在空间监控(如W空间漂移检测、层间梯度热力图)构成模型可观测性的工程基石,使‘黑箱生成’具备调试路径与质量锚点。本文聚焦2020年工业级落地关键——StyleGAN2架构下的全链路拆解与Tracking

aiman5818的博客 341

Stable Diffusion数学原理与图像生成器实操指南

扩散模型本质上是一种基于马尔可夫链的高维分布变换方法,其核心在于将不可解的端到端图像生成问题,分解为可控的正向加噪与反向去噪两个可微过程。该技术依托贝叶斯推断框架,通过神经网络学习噪声预测(ε₀),实现从纯噪声中逐步重建结构化图像。其工程价值体现在训练稳定、生成可控、可解释性强,广泛应用于AIGC、工业设计、医学影像合成等需高质量可控生成的场景。本文深入剖析Stable Diffusion数学原理与扩散过程可逆建模机制,并提供从零构建图像生成器的完整实操路径。

corg81763的博客 608

Adagrad优化器原理与工业级调优实战指南

Adagrad是一种面向稀疏梯度场景的自适应优化算法,其核心原理是为每个参数维护历史梯度平方和,实现逐参数学习率缩放,从而解决高维稀疏数据中‘信噪比失衡’问题。该机制天然适配NLP词向量、推荐系统Embedding表及金融风控等典型稀疏建模任务,在参数尺度差异大、更新频率极不均衡的场景下展现出优于SGD、RMSProp甚至Adam的收敛稳定性与业务鲁棒性。本文结合PyTorch源码级解析、稀疏梯度专项优化及多优化器公平对比实验,系统阐述Adagrad的数学直觉、超参数工程调优(如lr/eps匹配、initi

weixin_34072637的博客 347

MLP训练中优化器选型与调优实战指南

优化器是深度学习训练动态系统的核心控制器,其本质是梯度信号的加权、累积与缩放机制。从SGD的随机噪声鲁棒性,到Adam的自适应一阶/二阶矩估计,不同优化器在收敛速度、泛化能力、内存开销和硬件适配性上存在根本差异。尤其在MLP这类前馈网络中,特征稀疏性、批量大小、梯度分布形态及混合精度训练等工程约束,会显著改变优化器的实际表现——例如Adagrad在高维稀疏特征下易致学习率归零,而AdamW通过解耦weight_decay提升MLP泛化性能。本文聚焦真实工业级MLP场景,覆盖原理剖析、PyTorch实现、lo

weixin_34121304的博客 387
上一篇: 《20天吃掉那只Pytorch》视频教程登录B站啦
下一篇: 30分钟吃掉pytorch中的各种归一化层
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值