笔记1:cifar10数据集获取及pytorch批量处理

(1)cifar10数据集预处理

CIFAR-10是一个广泛使用的图像数据集,它由10个类别的共60000张32x32彩色图像组成,每个类别有6000张图像。
CIFAR-10官网
以下为CIFAR-10数据集data_batch_*表示训练集数据,test_batch表示测试集数据
在这里插入图片描述
预处理结果(将CIFAR-10保存为图片格式)
在这里插入图片描述

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: LIFEI
@time: 2024/5/8 15:00 
@file: 加载cifar10数据.py
@project: 深度学习(4):深度神经网络(DNN)
@describe: TEXT
@# ------------------------------------------(one)--------------------------------------
@# ------------------------------------------(two)--------------------------------------
"""
import glob
import pickle
import numpy as np
import cv2 as
import os
#%% md
cifar10官网处理函数:
#%%
def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict
#%% md
利用上面的函数进行读取数据:
#%%
label = ["airplane","automobile", "bird","cat", 'deer',"dog","frog","horse","ship","truck"]  #标签矩阵
filepath = glob.glob("../../test_doucments/cifar-10-batches-py/data_batch_*") # 获取当前文件的路径,返回路径矩阵,获取test数据集时将data_batch——*改为test_batch*
write_path =["./train","./test"] #
print(filepath)
for file in filepath:
    if not file:
        print("空集出错")
    else:
        # print(file)
        data_dic = unpickle(file) # 将二进制表示形式转换回 Python 对象的反序列化过程,结果为字节型数据
        # print(data_dic.keys()) #此处的keys主要有b"data",b"labels",b"filenames"
        index = 0
        for im_data in data_dic[b"data"]:  # 遍历影像矩阵数据
            im_label = data_dic[b"labels"][index] # 赋值标签数据
            im_filename = data_dic[b"filenames"][index] # 赋值影像名字
            index +=1
            # print(f"图像的文件名为:{im_filename}\n",f"图像的所属标签为:{im_label}\n",f"图像的矩阵数据为:{im_data}\n")

            #开始存放数据
            im_label_name = label[im_label]
            im_data_data = np.reshape(im_data,(3,32,32)) # 将影像矩阵数据转换为图像形式

            # 由于需要opencv进行写出图像,因此需要转化通道
            im_data_data = np.transpose(im_data_data,(1,2,0))
            imgname = f"当前图像名称{im_label},所属标签{im_label_name}"
            cv.imshow(str( im_label_name),cv.resize(im_data_data,(500,500))) # 将显示时的图像变大,图像数据本身大小不变
            cv.waitKey(0)
            cv.destroyAllWindows()

            #创建文件夹
            for path in write_path:
                if not os.path.exists("{}/{}".format(path,im_label_name)): #查看存储路径中的文件夹是否存在
                    os.mkdir("{}/{}".format(path,im_label_name)) # 没有就创建文件
                else:
                    break
            cv.imwrite("{}/{}/{}".format(write_path[0],im_label_name,str(im_filename,'utf-8')),im_data_data)
            # #write_path[1]写出测试数据的时候将write_path[0]改为write_path[1]
#%% md
将cifar10数据转为图片格式并保存

(2)利用pytorch将图像转为张量数据

或是批量读取训练集和测试集数据
在这里插入图片描述

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: LIFEI
@time: 2024/5/8 15:00 
@file: 加载cifar10数据.py
@project: 深度学习(4):深度神经网络(DNN)
@describe: TEXT
@# ------------------------------------------(one)--------------------------------------
@# ------------------------------------------(two)--------------------------------------
"""
# 导入库
import glob
from torchvision import transforms
from torch.utils.data import Dataset,DataLoader
import cv2 as cv
# DataLoader参考网址https://blog.csdn.net/sazass/article/details/116641511

from PIL import Image

label_name = ["airplane","automobile", "bird","cat", 'deer',"dog","frog","horse","ship","truck"]
label_list = {} # 创建一个字典用于存储标签和下标
index = 0
for name in label_name:  # 也可以采用for index,name in enumerate(label_name)
    label_list[name] = index # 字典的常规赋值操作
    index += 1

def default_loder(path):
    return Image.open(path).convert("RGB") 
    
    # 也可采用opencv读取,但是建议不要使用,因为后面的train因为不识别会报错
    # img = cv.imread(path)
    # return cv.cvtColor(img,cv.COLOR_BGR2RGB)


# 定义训练集数据的增强   下面的Compose表示拼接需要增强的操作
train_transform = transforms.Compose([
    transforms.RandomCrop(28,28), #进行随机裁剪为28*28大小
    transforms.RandomHorizontalFlip(), #垂直方向翻转
    transforms.RandomVerticalFlip(), #水平方向的翻转
    transforms.RandomRotation(90), #随机旋转90度
    transforms.RandomGrayscale(0.1), #灰度转化
    transforms.ColorJitter(0.3,0.3,0.3,0.3), #随机颜色增强
    transforms.ToTensor() #将数据转化为张量数据
])

# 定义pytorh的dataset类
class MyData(Dataset):
    def __init__(self,im_list,
                 transform = None,
                 loder = default_loder):     #初始化函数
        super(MyData,self).__init__() #初始化这个类

        # 获取图片的路径以及标签号
        images = []
        for item_data in im_list:
            # 注意下面这一步,split("\\")根据不同的操作系统会不相同,有的是"/"
            img_label_name = item_data.split("\\")[-2] #通过遍历每一个路径进行获取当前图片的文字标签
            images.append([item_data,label_list[img_label_name]])

        self.images = images
        self.tranform =transform
        self.loder = loder

    def __getitem__(self, index_num): # 此处的index_num是在训练的时候反复传进来的值
        img_path , img_label = self.images[index_num] #这里的
        img_data = self.loder(img_path)  # 这里用到了self.loder(path)==>default_loder(path)外置函数

        if self.tranform is not None: # 判断数据是否增强
            img_data = self.tranform(img_data)
        return img_data,img_label

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

train_list = glob.glob("./train/*/*.png") # glob.glob 获取改路径下的所有文件路径并返回为列表
test_list = glob.glob("./test/*/*.png")

train_dataset = MyData(train_list,transform = train_transform)
test_dataset = MyData(test_list,transform = transforms.ToTensor()) #测试集无需进行图像增强操作,直接转为张量

train_data_loder = DataLoader(dataset =train_dataset,
                              batch_size=6,
                              shuffle=True,
                              num_workers=4) #4线程
test_data_loder = DataLoader(dataset =test_dataset,
                              batch_size=6,
                              shuffle=False,
                              num_workers=4)
print(f"训练集的大小:{len(train_dataset)}")
print(f"测试集的大小:{len(test_dataset)}")

注:以上代码非原创,仅供个人记录学习笔记,若有侵权,请联系我删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楠楠星球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值