pytorch加載自己的圖像數(shù)據(jù)集實(shí)例
之前學(xué)習(xí)深度學(xué)習(xí)算法,都是使用網(wǎng)上現(xiàn)成的數(shù)據(jù)集,而且都有相應(yīng)的代碼。到了自己開始寫論文做實(shí)驗(yàn),用到自己的圖像數(shù)據(jù)集的時(shí)候,才發(fā)現(xiàn)無從下手 ,相信很多新手都會(huì)遇到這樣的問題。
參考文章http://chabaoo.cn/article/177613.htm
下面代碼實(shí)現(xiàn)了從文件夾內(nèi)讀取所有圖片,進(jìn)行歸一化和標(biāo)準(zhǔn)化操作并將圖片轉(zhuǎn)化為tensor。最后讀取第一張圖片并顯示。
# 數(shù)據(jù)處理 import os import torch from torch.utils import data from PIL import Image import numpy as np from torchvision import transforms transform = transforms.Compose([ transforms.ToTensor(), # 將圖片轉(zhuǎn)換為Tensor,歸一化至[0,1] # transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5]) # 標(biāo)準(zhǔn)化至[-1,1] ]) #定義自己的數(shù)據(jù)集合 class FlameSet(data.Dataset): def __init__(self,root): # 所有圖片的絕對路徑 imgs=os.listdir(root) self.imgs=[os.path.join(root,k) for k in imgs] self.transforms=transform def __getitem__(self, index): img_path = self.imgs[index] pil_img = Image.open(img_path) if self.transforms: data = self.transforms(pil_img) else: pil_img = np.asarray(pil_img) data = torch.from_numpy(pil_img) return data def __len__(self): return len(self.imgs) if __name__ == '__main__': dataSet=FlameSet('./test') print(dataSet[0])
顯示結(jié)果:
補(bǔ)充知識:使用Pytorch進(jìn)行讀取本地的MINIST數(shù)據(jù)集并進(jìn)行裝載
pytorch中的torchvision.datasets中自帶MINIST數(shù)據(jù)集,可直接調(diào)用模塊進(jìn)行獲取,也可以進(jìn)行自定義自己的Dataset類進(jìn)行讀取本地?cái)?shù)據(jù)和初始化數(shù)據(jù)。
1. 直接使用pytorch自帶的MNIST進(jìn)行下載:
缺點(diǎn): 下載速度較慢,而且如果中途下載失敗一般得是重新進(jìn)行執(zhí)行代碼進(jìn)行下載:
# # 訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)的下載 # 訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)的下載 trainDataset = torchvision.datasets.MNIST( # torchvision可以實(shí)現(xiàn)數(shù)據(jù)集的訓(xùn)練集和測試集的下載 root="./data", # 下載數(shù)據(jù),并且存放在data文件夾中 train=True, # train用于指定在數(shù)據(jù)集下載完成后需要載入哪部分?jǐn)?shù)據(jù),如果設(shè)置為True,則說明載入的是該數(shù)據(jù)集的訓(xùn)練集部分;如果設(shè)置為False,則說明載入的是該數(shù)據(jù)集的測試集部分。 transform=transforms.ToTensor(), # 數(shù)據(jù)的標(biāo)準(zhǔn)化等操作都在transforms中,此處是轉(zhuǎn)換 download=True # 瞎子啊過程中如果中斷,或者下載完成之后再次運(yùn)行,則會(huì)出現(xiàn)報(bào)錯(cuò) ) testDataset = torchvision.datasets.MNIST( root="./data", train=False, transform=transforms.ToTensor(), download=True )
2. 自定義dataset類進(jìn)行數(shù)據(jù)的讀取以及初始化。
其中自己下載的MINIST數(shù)據(jù)集的內(nèi)容如下:
自己定義的dataset類需要繼承: Dataset
需要實(shí)現(xiàn)必要的魔法方法:
__init__魔法方法里面進(jìn)行讀取數(shù)據(jù)文件
__getitem__魔法方法進(jìn)行支持下標(biāo)訪問
__len__魔法方法返回自定義數(shù)據(jù)集的大小,方便后期遍歷
示例如下:
class DealDataset(Dataset): """ 讀取數(shù)據(jù)、初始化數(shù)據(jù) """ def __init__(self, folder, data_name, label_name,transform=None): (train_set, train_labels) = load_minist_data.load_data(folder, data_name, label_name) # 其實(shí)也可以直接使用torch.load(),讀取之后的結(jié)果為torch.Tensor形式 self.train_set = train_set self.train_labels = train_labels self.transform = transform def __getitem__(self, index): img, target = self.train_set[index], int(self.train_labels[index]) if self.transform is not None: img = self.transform(img) return img, target def __len__(self): return len(self.train_set)
其中l(wèi)oad_minist_data.load_data也是我們自己寫的讀取數(shù)據(jù)文件的函數(shù),即放在了load_minist_data.py中的load_data函數(shù)中。具體實(shí)現(xiàn)如下:
def load_data(data_folder, data_name, label_name): """ data_folder: 文件目錄 data_name: 數(shù)據(jù)文件名 label_name:標(biāo)簽數(shù)據(jù)文件名 """ with gzip.open(os.path.join(data_folder,label_name), 'rb') as lbpath: # rb表示的是讀取二進(jìn)制數(shù)據(jù) y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8) with gzip.open(os.path.join(data_folder,data_name), 'rb') as imgpath: x_train = np.frombuffer( imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28) return (x_train, y_train)
編寫完自定義的dataset就可以進(jìn)行實(shí)例化該類并裝載數(shù)據(jù):
# 實(shí)例化這個(gè)類,然后我們就得到了Dataset類型的數(shù)據(jù),記下來就將這個(gè)類傳給DataLoader,就可以了。 trainDataset = DealDataset('MNIST_data/', "train-images-idx3-ubyte.gz","train-labels-idx1-ubyte.gz",transform=transforms.ToTensor()) testDataset = DealDataset('MNIST_data/', "t10k-images-idx3-ubyte.gz","t10k-labels-idx1-ubyte.gz",transform=transforms.ToTensor()) # 訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)的裝載 train_loader = dataloader.DataLoader( dataset=trainDataset, batch_size=100, # 一個(gè)批次可以認(rèn)為是一個(gè)包,每個(gè)包中含有100張圖片 shuffle=False, ) test_loader = dataloader.DataLoader( dataset=testDataset, batch_size=100, shuffle=False, )
構(gòu)建簡單的神經(jīng)網(wǎng)絡(luò)并進(jìn)行訓(xùn)練和測試:
class NeuralNet(nn.Module): def __init__(self, input_num, hidden_num, output_num): super(NeuralNet, self).__init__() self.fc1 = nn.Linear(input_num, hidden_num) self.fc2 = nn.Linear(hidden_num, output_num) self.relu = nn.ReLU() def forward(self,x): x = self.fc1(x) x = self.relu(x) y = self.fc2(x) return y # 參數(shù)初始化 epoches = 5 lr = 0.001 input_num = 784 hidden_num = 500 output_num = 10 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 產(chǎn)生訓(xùn)練模型對象以及定義損失函數(shù)和優(yōu)化函數(shù) model = NeuralNet(input_num, hidden_num, output_num) model.to(device) criterion = nn.CrossEntropyLoss() # 使用交叉熵作為損失函數(shù) optimizer = optim.Adam(model.parameters(), lr=lr) # 開始循環(huán)訓(xùn)練 for epoch in range(epoches): # 一個(gè)epoch可以認(rèn)為是一次訓(xùn)練循環(huán) for i, data in enumerate(train_loader): (images, labels) = data images = images.reshape(-1, 28*28).to(device) labels = labels.to(device) output = model(images) # 經(jīng)過模型對象就產(chǎn)生了輸出 loss = criterion(output, labels.long()) # 傳入的參數(shù): 輸出值(預(yù)測值), 實(shí)際值(標(biāo)簽) optimizer.zero_grad() # 梯度清零 loss.backward() optimizer.step() if (i+1) % 100 == 0: # i表示樣本的編號 print('Epoch [{}/{}], Loss: {:.4f}' .format(epoch + 1, epoches, loss.item())) # {}里面是后面需要傳入的變量 # loss.item # 開始測試 with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: images = images.reshape(-1, 28*28).to(device) # 此處的-1一般是指自動(dòng)匹配的意思, 即不知道有多少行,但是確定了列數(shù)為28 * 28 # 其實(shí)由于此處28 * 28本身就已經(jīng)等于了原tensor的大小,所以,行數(shù)也就確定了,為1 labels = labels.to(device) output = model(images) _, predicted = torch.max(output, 1) total += labels.size(0) # 此處的size()類似numpy的shape: np.shape(train_images)[0] correct += (predicted == labels).sum().item() print("The accuracy of total {} images: {}%".format(total, 100 * correct/total))
以上這篇pytorch加載自己的圖像數(shù)據(jù)集實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
PyTorch中Tensor的數(shù)據(jù)類型和運(yùn)算的使用
這篇文章主要介紹了PyTorch中Tensor的數(shù)據(jù)類型和運(yùn)算的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09numpy中以文本的方式存儲(chǔ)以及讀取數(shù)據(jù)方法
今天小編就為大家分享一篇numpy中以文本的方式存儲(chǔ)以及讀取數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-067個(gè)流行的Python強(qiáng)化學(xué)習(xí)算法及代碼實(shí)現(xiàn)詳解
目前流行的強(qiáng)化學(xué)習(xí)算法包括?Q-learning、SARSA、DDPG、A2C、PPO、DQN?和?TRPO。這些算法已被用于在游戲、機(jī)器人和決策制定等各種應(yīng)用中,本文我們將對其做一個(gè)簡單的介紹,感興趣的可以學(xué)習(xí)一下2023-01-01python打包exe文件并隱藏執(zhí)行CMD命令窗口問題
這篇文章主要介紹了python打包exe文件并隱藏執(zhí)行CMD命令窗口問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01python實(shí)現(xiàn)漫天飄落的七彩花朵效果
要實(shí)現(xiàn)漫天飄落的七彩花朵效果,你可以使用Python的圖形庫,如Pygame或Pyglet,這些庫可以幫助你創(chuàng)建動(dòng)畫和圖形效果,本文給大家介紹了如何使用python實(shí)現(xiàn)漫天飄落的七彩花朵效果,感興趣的朋友可以參考下2024-01-01Python基于pandas爬取網(wǎng)頁表格數(shù)據(jù)
這篇文章主要介紹了Python基于pandas獲取網(wǎng)頁表格數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05