pytorch第四次作业-DataLoder与数据预处理

1. 采用步进(Step into)的调试方法从 for i, data in enumerate(train_loader) 这一行代码开始,进入到每一个被调用函数,直到进入RMBDataset类中的__getitem__函数,记录从 for循环到RMBDataset的__getitem__所设计的类与函数?

  1. 第一步:for i, data in enumerate(train_loader)
  2. 第二步:DataLoader类,__iter__函数,判断是多进程还是单进程
  3. 第三步:_SingleProcessDataLoaderIter类,__next__函数
  4. 第四步,_BaseDataLoaderIter类,_next_index函数
  5. 第五步,BatchSampler类,__iter__函数 ,明确每个batchsize应该读取哪些数据
  6. 第六步,RandomSampler类,__iter__函数
  7. 第七步,_MapDatasetFetcher类,fetch函数
  8. 第八步,RMBDataset类,__getitem__函数

2. 训练RMB二分类模型,熟悉数据读取机制,并且从kaggle中下载猫狗二分类训练数据,自己编写一个DogCatDataset,使得pytorch可以对猫狗二分类训练集进行读取。


import os
import random
from PIL import Image
from torch.utils.data import Dataset
import numpy as np
import torch
from torch.utils.data import DataLoader
import torchvision.transforms as transforms

random.seed(1)
dogcat_label = {'dog': 0, 'cat': 1}

class DogCatDataset(Dataset):
    def __init__(self, data_dir, transform=None):
        """
        DogCat分类任务的Dataset
        :param data_dir: str, 数据集所在路径
        :param transform: torch.transform,数据预处理
        """
        self.label_name = {'dog': 0, 'cat': 1}
        self.data_info = self.get_img_info(data_dir)    # data_info 存储所有图片路径和标签,在DataLoader中通过index读取样本
        self.transform = transform

    def __getitem__(self, index):
        path_img, label = self.data_info[index]
        img = Image.open(path_img).convert('RGB')   # 0~255

        if self.transform is not None:
            img = self.transform(img)   # 在这里做transform,转为tensor等等

        return img, label

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

    def get_img_info(self, data_dir):
        data_info = list()
        for root, dirs, _ in os.walk(data_dir):
            img_names = os.listdir(root)
            img_names = list(filter(lambda x: x.endswith('.jpg'), img_names))

            # 遍历图片
            for i in range(len(img_names)):
                img_name = img_names[i]
                path_img = os.path.join(root, img_name)
                label = dogcat_label[img_name[:3]]
                data_info.append((path_img, int(label)))

        return data_info


def set_seed(seed = 1):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)

def main():
    set_seed()
    rmb_label = {"1": 0, "100": 1}

    # 参数设置
    BATCH_SIZE = 16

    # step 1 数据
    train_dir = os.path.join('data', 'DogCat')

    norm_mean = [0.485, 0.456, 0.406]
    norm_std = [0.229, 0.224, 0.225]

    train_transform = transforms.Compose([
        transforms.Resize((32, 32)),
        transforms.RandomCrop(32, padding=4),  # 裁剪
        transforms.ToTensor(),  # 转换成Tensor, 并进行归一化
        transforms.Normalize(norm_mean, norm_std),
    ])

    valid_transform = transforms.Compose([
        transforms.Resize((32, 32)),
        transforms.ToTensor(),  # 转换成Tensor, 并进行归一化
        transforms.Normalize(norm_mean, norm_std),
    ])

    # 构建MyDataset实例
    train_data = DogCatDataset(data_dir=train_dir, transform=train_transform)

    # 构建DataLoader实例
    train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

    print(len(train_loader)) # 结果为1563,一共有25000张图片,BATCHSIZE为16,所以有  BATCH_SIZE * 1563 = 25008

if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aidanmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值