PyTorch 图像分类识别(一)定义及加载自己的数据集并可视化
文章目錄
- 前言
- 一、Dataset、DataLoader是什么?
- 二、如何定義Dataset?
- 1.定義 Dataset
- 三、如何使用DataLoader?
- 1. 使用Dataloader加載數(shù)據(jù)集
- 四、可視化源數(shù)據(jù)
- 五、完整代碼
- 參考
前言
深度學(xué)習(xí)初入門小白,技藝不精,寫下筆記記錄自己的學(xué)習(xí)過(guò)程。歡迎評(píng)論區(qū)交流提問(wèn),力所能及之問(wèn)題,定當(dāng)毫無(wú)保留之相授。
一、Dataset、DataLoader是什么?
Dataset:是一個(gè)包裝類,用來(lái)將數(shù)據(jù)包裝為Dataset類,然后傳入DataLoader中。
Dataloader:通過(guò)DataLoader這個(gè)函數(shù),我們?cè)诩虞d數(shù)據(jù)集時(shí)候,批次讀取數(shù)據(jù)及多線程并行處理,這樣可以加快我們讀取數(shù)據(jù)集的速度。
二、如何定義Dataset?
Dataset類是Pytorch中數(shù)據(jù)集加載類中應(yīng)該繼承的父類。通常包括這三部分:
1.*def __init__(self)* 2.*def __getitem__(self, index):* 3.*def __len__(self):*其中父類中的兩個(gè)私有成員函數(shù),__len__和__getitem__必須被重載!
1.定義 Dataset
#root1和root2分別為訓(xùn)練集,驗(yàn)證集存放圖片路徑及標(biāo)簽的txt路徑 root1 = r"C:\Users\asus\Desktop\mstar_classification\mstar\train.txt" root2 = r"C:\Users\asus\Desktop\mstar_classification\mstar\val.txt"# 1、構(gòu)建數(shù)據(jù)集類 class Mydata(Dataset):# __init__# 該函數(shù)可以包含多個(gè)參數(shù),如數(shù)據(jù)的讀取路徑和對(duì)數(shù)據(jù)的處理設(shè)置等一系列設(shè)定# txt:存放著圖片數(shù)據(jù)的路徑和標(biāo)簽信息,words[0]為圖片的路徑,words[1]為圖片的標(biāo)簽,如下圖所示。(txt需要事先生成,如何生成先挖個(gè)坑)# imgs:按行讀取txt,并依次存放到列表中# transform為:圖片數(shù)據(jù)增強(qiáng),下文中會(huì)講def __init__(self, txt, transform=None, target_transform=None):super(Mydata, self).__init__()imgs = []fh = open(txt, 'r')for line in fh:line = line.strip('\n')line = line.rstrip()words = line.split()imgs.append((words[0], int(words[1]))) # imgs中包含有圖像路徑和標(biāo)簽self.txt = txtself.imgs = imgsself.transform = transformself.target_transform = target_transform# __getitem__# 接收一個(gè)index,然后返回圖片路徑和標(biāo)簽,這個(gè)index通常指的是一個(gè)list的index,這個(gè)list的每個(gè)元素就包含了圖片數(shù)據(jù)的路徑和標(biāo)簽信息。# 在本代碼中,這個(gè)list為imgs[]# 圖片打開方式為Image.open,三通道RGB格式。若數(shù)據(jù)集圖片為單通道,可在transform中添加transforms.Grayscale(1)函數(shù)。def __getitem__(self, index):fn, label = self.imgs[index]img = Image.open(os.path.join(self.txt[:-4], fn))#self.txt[:-4],下文加載txt時(shí),路徑中不需要有后綴,所以去掉.txt四個(gè)字符if self.transform is not None:img = self.transform(img)return img, label#__len__ #返回樣本的總數(shù)量, 該方法提供了dataset的大小def __len__(self):return len(self.imgs)train_transform = transforms.Compose([transforms.RandomHorizontalFlip(), transforms.ColorJitter(),transforms.Grayscale(1), transforms.ToTensor(),transforms.Normalize([0.5], [0.5])]) test_transform = transforms.Compose([transforms.Grayscale(1), transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])train_data = Mydata(txt=root1, transform=train_transform) test_data = Mydata(txt=root2, transform=test_transform)txt中存放著圖片的路徑及標(biāo)簽
三、如何使用DataLoader?
該函數(shù)的作用是將數(shù)據(jù)整理成一個(gè)batch,即根據(jù)batch_size的大小一次性在數(shù)據(jù)集中取出batch_size個(gè)數(shù)據(jù)。例如數(shù)據(jù)集中有100條數(shù)據(jù),batch_size的值為20,則每次在100條數(shù)據(jù)中取出20條數(shù)據(jù)。
torch.utils.data.DataLoader(dataset,batch_size,shuffle,drop_last,num_workers) # dataset: 加載torch.utils.data.Dataset對(duì)象數(shù)據(jù),即為上文中的train_data和test_data # batch_size: 每個(gè)batch的大小 # shuffle:是否對(duì)數(shù)據(jù)進(jìn)行打亂 # drop_last:是否對(duì)無(wú)法整除的最后一個(gè)datasize進(jìn)行丟棄 # um_workers:表示加載的時(shí)候子進(jìn)程數(shù),一般GPU使用1. 使用Dataloader加載數(shù)據(jù)集
train_loader = DataLoader(dataset=train_data, batch_size=32, shuffle=True) test_loader = DataLoader(dataset=test_data, batch_size=64)四、可視化源數(shù)據(jù)
examples = enumerate(train_loader) batch_idx, (examples_data, examples_targets) = next(examples)fig = plt.figure() for i in range(6):plt.subplot(2, 3, i+1)plt.tight_layout()#自動(dòng)調(diào)整子圖參數(shù),使之填充滿整個(gè)圖像區(qū)域plt.imshow(examples_data[i][0], interpolation='none')plt.title("Category:{}".format(examples_targets[i]))plt.xticks([])plt.yticks([]) plt.show()五、完整代碼
注意:
1.數(shù)據(jù)集的路徑需要改成自己的
2.前提需要生成相應(yīng)的txt文件
參考
https://blog.csdn.net/sinat_42239797/article/details/90641659
https://blog.csdn.net/ChaoFeiLi/article/details/109764566
https://blog.csdn.net/l8947943/article/details/103733473
https://blog.csdn.net/kahuifu/article/details/108654421
https://blog.csdn.net/wangkaidehao/article/details/104209685
總結(jié)
以上是生活随笔為你收集整理的PyTorch 图像分类识别(一)定义及加载自己的数据集并可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: group by 用法解析
- 下一篇: WPS 万分位分隔符