Es ist ein halbes Jahr her, seit ich angefangen habe, maschinelles Lernen zu studieren, und ich habe es geschafft, mit PyTorch einen Datensatz zu erstellen, also werde ich ihn als Erinnerung veröffentlichen. Als ich GAN studierte, lernte ich, indem ich den Code von GitHub ablegte. Da ich jedoch nur MNIST und CIFAR las, wollte ich ihn mit meinem eigenen Datensatz ausführen, also erstellte ich meinen eigenen Datensatz. (Ich weiß es nicht, weil das Posten von Artikeln für einige Zeit auch ein Artikel ist ...)
Vererbung des PyTorch-Datensatzes Übergeben des Objekts dieser Dataset-Vererbungsklasse an DataLoader beim Übergeben an das Trainingsmodell
\ _ \ _ Getitem \ _ \ _ und \ _ \ _ len \ _ \ _ Methoden \ _ \ _ Getitem \ _ \ _ ist eine Methode, die Daten und Beschriftungen in Tapple zurückgibt \ _ \ _ Len \ _ \ _ bedeutet so wie es ist, eine Methode, die die Anzahl der Daten zurückgibt
Die Grundkonfiguration ist also so.
class MyDataset(torch.utils.data.Dataset):
def __init__(self, imageSize, dir_path, transform=None):
pass
def __len__(self):
pass
def __getitem__(self, idx):
pass
Zusätzlich zum Pfad zu den Daten habe ich die Eingabegröße des Bildes und die Transformation für die Vorverarbeitung als Argumente an die Klasse übergeben.
Der Konstruktor, der beim Erstellen einer Klasse automatisch aufgerufen wird, führt die folgende Verarbeitung durch.
def __init__(self, imageSize, dir_path, transform=None):
self.transform = transforms.Compose([
transforms.Resize(imageSize), #Bildgröße ändern
transforms.ToTensor(), #Tensorisierung
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), #Standardisierung
])
#Geben Sie hier die Eingabedaten und die Beschriftung ein
self.image_paths = [str(p) for p in Path(dir_path).glob("**/*.png ")]
self.data_num = len(self.image_paths) #Hier ist__len__Wird der Rückgabewert von sein
self.classes = ['carpet', 'ceramic', 'cloth', 'dirt', 'drywall', 'glass', 'grass', 'gravel', 'leaf', 'metal']
self.class_to_idx = {'carpet':0, 'ceramic':1, 'cloth':2, 'dirt':3, 'drywall':4, 'glass':5, 'grass':6,'gravel':7, 'leaf':8, 'metal':9}
Ich hatte mehrfach klassifizierte Materialdaten, also habe ich sie verwendet.
Da \ _ \ _ getitem \ _ \ _ eine Methode zum Lesen von Daten und deren korrekter Antwortbezeichnung während des Trainings ist, werden wir sie unter Verwendung der vom Konstruktor gelesenen Informationen implementieren.
def __getitem__(self, idx):
p = self.image_paths[idx]
image = Image.open(p)
if self.transform:
out_data = self.transform(image)
out_label = p.split("\\")
out_label = self.class_to_idx[out_label[3]]
return out_data, out_label
Ich denke, es ist in Ordnung, die Bilddaten mit dem Konstruktor zu lesen, aber ich war besorgt über den Speicher, wenn es viele Daten gab, also habe ich beschlossen, sie jedes Mal zu lesen. Ich benutze auch eine etwas nervige Methode, um ein Wörterbuch für Klassenbeschriftungen zu erstellen.
Wenn Sie es tatsächlich im Code lesen, können Sie es zum Lernen verwenden, indem Sie es wie folgt verwenden. (DataLoader-Argument-Shuffle randomisiert, wie auf Daten verwiesen wird)
data_set = MyDataset(32, dir_path=root_data)
dataloader = torch.utils.data.DataLoader(data_set, batch_size=100, shuffle=True)
import torch.utils.data
import torchvision.transforms as transforms
from pathlib import Path
from PIL import Image
class MyDataset(torch.utils.data.Dataset):
def __init__(self, imageSize, dir_path, transform=None):
self.transform = transforms.Compose([
transforms.Resize(imageSize),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
self.image_paths = [str(p) for p in Path(dir_path).glob("**/*.png ")]
self.data_num = len(self.image_paths)
self.classes = ['carpet', 'ceramic', 'cloth', 'dirt', 'drywall', 'glass', 'grass', 'gravel', 'leaf', 'metal']
self.class_to_idx = {'carpet':0, 'ceramic':1, 'cloth':2, 'dirt':3, 'drywall':4, 'glass':5, 'grass':6,'gravel':7, 'leaf':8, 'metal':9}
def __len__(self):
return self.data_num
def __getitem__(self, idx):
p = self.image_paths[idx]
image = Image.open(p)
if self.transform:
out_data = self.transform(image)
out_label = p.split("\\")
out_label = self.class_to_idx[out_label[3]]
return out_data, out_label
if __name__ == "__main__":
root_data = 'Pfad zu Daten'
data_set = MyDataset(32, dir_path=root_data)
dataloader = torch.utils.data.DataLoader(data_set, batch_size=100, shuffle=True)
Ich habe es implementiert, als ich mir die folgende Seite angesehen habe. Vielen Dank. Erläuterung von Transformationen, Datasets, Dataloader von pyTorch und Erstellung und Verwendung von selbst erstellten Datasets PyTorch: Dataset und DataLoader (Bildverarbeitungsaufgabe)
Recommended Posts