resnet实现cifar10分类(pytorch实现)

本文详细介绍如何使用PyTorch加载CIFAR10数据集,包括数据预处理、创建DataLoader以及使用ResNet18模型进行训练的过程。通过实践演示,展示了数据可视化、模型训练及评估的具体步骤。

目录

 

数据加载(创建dataset对象)

创建一个   DataLoader对象

部分数据可视化

 创建模型(two methods)没有使用GPU

采用torchvision.models中的自带模型(resnet)

自写模型

循环DataLoader对象,将数据加载到模型中训练

10epoch训练效果如下

 


数据加载(创建dataset对象)

使用torchvision模块中的datasets在线下载数据

cirfar_train = datasets.CIFAR10('cifar',True, transform=transforms.Compose([
          transforms.Resize((32,32)), #对图片进行裁剪
          transforms.ToTensor(),#转换为Tensor张量
          transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]) #归一化
]),download=True)
cirfar_test = datasets.CIFAR10('cifar',False, transform=transforms.Compose([
          transforms.Resize((32,32)),
          transforms.ToTensor(),
          transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
]),download=True)

创建一个   DataLoader对象

DataLoader:它是PyTorch中数据读取的一个重要接口,属于torch.utils,data,该接口定义在dataloader.py中,只要是用PyTorch来训练模型基本都会用到该接口(除非用户重写…),该接口的目的:将自定义的Dataset根据batch size大小、是否shuffle等封装成一个Batch Size大小的Tensor,用于后面的训练。

DataLoader(object)的参数:简单介绍如下,具体详情可以使用help(DataLoader)自行查看

     dataset(Dataset): 传入的数据集
     batch_size(int, optional): 每个batch有多少个样本
    shuffle(bool, optional): 在每个epoch开始的时候,对数据进行重新排序
    sampler(Sampler, optional): 自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
    batch_sampler(Sampler, optional): 与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)
    num_workers (int, optional): 这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0)
    collate_fn (callable, optional): 将一个list的sample组成一个mini-batch的函数
    pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.

    drop_last (bool, optional): 如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了…
    如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。

    timeout(numeric, optional): 如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric应总是大于等于0。默认为0
    worker_init_fn (callable, optional): 每个worker初始化函数 If not None, this will be called on each
    worker subprocess with the worker id (an int in [0, num_workers - 1]) as
    input, after seeding and before data loading. (default: None)

部分数据可视化

在数据可视化的时候需要进行坐标轴交换,不然会报错,因为显示图片的正常维度是(numpy形式)H*W*C

而 torch包的图片是:C*H*W

使用的是torch.Tensor.permute接口来变换维度

具体函数参数与介绍如下:

Help on method_descriptor:

permute(...)
    permute(*dims) -> Tensor
    
    Returns a view of the original tensor with its dimensions permuted.
    
    Args:
        *dims (int...): The desired ordering of dimensions #目标维度
#假如之前 x.shape为(128,32,33,3) 使用x.permute(0,3,2,1)后x.shape为(128,3,33,32)
    
    Example:
        >>> x = torch.randn(2, 3, 5)
        >
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值