Dieses Mal habe ich die Methode zur Eingabe von Sequenzdaten in PyTorch zusammengefasst. Ich bin sicher, dass es viele Aspekte gibt, die nicht erreicht werden können, aber ich würde mich über Ihre technische Anleitung freuen. In diesem Artikel erfahren Sie, wie Sie ein Dataset in PyTorch in einen Teil von bewegten Bildern fester Länge laden. Insbesondere wird davon ausgegangen, dass Datensätze wie UCSD DATASET behandelt werden, die nicht als bewegte Bilder, sondern als Seriennummernbilder für jeden Ordner gespeichert werden.
DATASET/ ├ train/ │ └ img_0001.png ← 1. Videobild │ └ img_0002.png ← 2. Frame des Videos │ └ img_0003.png : │ : └ test/
Ich wollte PyTorch verwenden, um LSTM ohne Lehrer zu trainieren und verschiedene Dinge zu tun, aber da es (in meiner Forschung) kein Video-Lademodul gab, entschied ich mich widerwillig, es selbst zu machen.
** Angenommen, der Ablauf besteht darin, zuerst den Datensatz im Bildformat zu lesen, daraus ein Bewegtbild (Teilzeitreihen) mit einer festen Länge zu erstellen, es für die Stapelgröße zu verfestigen und LSTM es lernen zu lassen. Ich werde. ** ** **
In PyTorch werden Dataset- und DataLoader-Klassen zum Lesen des Trainingsdatensatzes vorbereitet, und die Daten, die zum Zeitpunkt der Objektdeklaration in dem angegebenen Verzeichnis vorhanden sind, werden für jede Epoche, also zum Zeitpunkt des Trainings, für die Stapelgröße vorbereitet Sehr angenehm. Wenn Sie auf [hier] verweisen (https://qiita.com/takurooo/items/e4c91c5d78059f92e76d), gibt es die folgenden drei Zeichen, die sich auf das Lesen beziehen.
transforms
--Modul für die Datenvorverarbeitung
Dataset
DataLoader
Im Allgemeinen werden Transformationen verwendet, um die Vorverarbeitung von Datensätzen festzulegen (Standardisierung, Größenkonvertierung usw.), dann wird Dataset verwendet, um die Etikettenzuordnung und Vorverarbeitung anzuwenden, und schließlich wird Data Loader verwendet, um die Stapelgröße festzulegen. Ich denke, dass es ein Fluss sein wird, es als einen Klumpen von zurückzugeben. Dies ist jedoch nur dann der Fall, wenn die Eingabe des Datensatzes i.i.d. ist, und es ist ein Problem, wenn Sie ** Sequenzdaten eingeben möchten. ** ** ** Ich möchte ein Modul, das Sequenzdaten verarbeiten kann, insbesondere Bewegtbilddaten, also habe ich darüber nachgedacht.
Da die Basis die Dataset-Klasse ist, erben wir sie zunächst und deklarieren eine Unterklasse (Seq_Dataset: SD) mit Ds als übergeordnete Klasse (Superklasse). Nur die Methode, die Sie ändern möchten, wird erneut auf der SD beschrieben. (Undefinierte Methoden werden automatisch überschrieben.) Wenn Sie die Dataset-Klasse erweitern und erweitern, schreiben Sie grundsätzlich Änderungen an "len" und "getitem". Beschreiben Sie insbesondere in "getitem" die Verarbeitung (Bewegtbildkonvertierung) für das gelesene Dataset-Objekt (diesmal Bilddaten).
Der diesmal angenommene Durchfluss ist ** Vorverarbeitungseinstellung mit Transformation → Lesen und Verarbeiten von Bilddaten mit Bildordner (Datensatz) → Schließlich erstellt Seq_Dataset ein Bewegtbild mit fester Länge (Teilzeitreihen) und gibt dessen Stapelgröße zurück ** ..
Unten ist die SD-Klasse aufgeführt, die diesmal Ds erweitert. Ich werde jede Funktion kurz erklären.
dataset.py
import torch
from torch.utils.data import Dataset
class Seq_Dataset(Dataset):
def __init__(self, datasets ,time_steps):
self.dataset = datasets
self.time_steps = time_steps
channels = self.dataset[0][0].size(0)
img_size = self.dataset[0][0].size(1)
video = torch.Tensor()
self.video = video.new_zeros((time_steps,channels,img_size,img_size))
def __len__(self):
return len(self.dataset)-self.time_steps
def __getitem__(self, index):
for i in range(self.time_steps):
self.video[i] = self.dataset[index+i][0]
img_label =self.dataset[index]
return self.video,img_label
In __init__
definieren wir einfach die notwendigen Variablen. Dieses Mal habe ich eine feste Länge, dh time_steprs, als Argument genommen. Außerdem ist die als Video bezeichnete Variable ein Tensor, der eine Teilzeitreihe fester Länge speichert und mit 0 initialisiert wird. Es wird in Form der Speicherung der Bilddaten in den Datensätzen sein, die ich hier geschrieben habe.
In __len__
wird nur die Gesamtzahl der Daten zurückgegeben. Dieses Mal werden die gelesenen Bilddaten schließlich als Bewegtbild fester Länge zurückgegeben, sodass die Gesamtzahl len (Dataset) -time_steps beträgt.
In __getitem__
wird eine Teilzeitreihe für time_steps generiert und dem Video zugewiesen und zurückgegeben. Hier können Sie auch Ebenenoperationen für Bilder beschreiben. Da es diesmal einen Hintergrund für unbeaufsichtigtes Lernen gibt, ist es empörend, dass der Wert des Bildes so ersetzt wird, wie er ist, ohne etwas für die Beschriftung anzugeben. In Bezug auf die Methode zur Angabe des Etiketts denke ich, dass es viele Referenzbeispiele gibt, wenn Sie sich auf andere beziehen. (Entschuldigung für diese Anwendung)
Beim eigentlichen Training denke ich, dass es in der Form sein wird, das data_loader-Objekt zu verwenden und es mit for zu drehen, um das Modell zu trainieren. Das Verfahren zum Abrufen von data_loader lautet wie folgt: Definieren Sie jede Variable und folgen Sie dem Ablauf von Image Folder → Seq_Dataset → Data Loader.
main.py
data_dir = "./data/train/"
time_steps = 10
num_workers = 4
dataset = datasets.ImageFolder(data_dir, transform=transform)
data_ = dataset.Seq_Dataset(dataset, time_steps)
data_loader = DataLoader(data_, batch_size=opt.batch_size, shuffle=True, num_workers=num_workers)
Die Form des Teilzeitreihentensors, der schließlich ausgegeben wird, hat [Stapelgröße, Zeitüberschreitungen, Kanäle, Bildgröße, Bildgröße]. In Zukunft möchte ich die LSTM-Implementierung in PyTorch mit diesem selbst erstellten Modul veröffentlichen. Danke, dass du bis zum Ende zugesehen hast.
Recommended Posts