赞
踩
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数据转为图片格式并保存
或是批量读取训练集和测试集数据
#!/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)}")
注:以上代码非原创,仅供个人记录学习笔记,若有侵权,请联系我删除
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。