[PYTHON] Lesen von Zeitreihendaten in PyTorch

Überblick

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. ** ** **

1. Lesen eines Datensatzes in PyTorch

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.

--Modul für die Datenvorverarbeitung

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.

2. Vererbung / Erweiterung der Datensatzklasse

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)

3. Beispiel für die Verwendung von Seq_Dataset

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

Lesen von Zeitreihendaten in PyTorch
Umgang mit Zeitreihendaten (Implementierung)
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
Aufblasen von Daten (Datenerweiterung) mit PyTorch
So rufen Sie PyTorch in Julia an
So vergleichen Sie Zeitreihendaten-Derivative DTW, DTW-
Lesen von CSV-Dateien mit Pandas
Wie man Problemdaten mit Paiza liest
Bücher über Datenwissenschaft, die 2020 gelesen werden sollen
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Wie man PyPI liest
Verwendung der Python-Bildbibliothek in der Python3-Serie
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
Wie man JSON liest
So erstellen Sie Daten für CNN (Chainer)
So lesen Sie Dateien in verschiedenen Verzeichnissen
So wenden Sie mit matplotlib Marker nur auf bestimmte Daten an
So messen Sie die Verarbeitungszeit mit Python oder Java
Lesen von CSVs, die in Python nur Ganzzahlen enthalten
[Python] Zeichnen Sie Zeitreihendaten
Wie man in Python entwickelt
Umgang mit Datenrahmen
[Go language] So erhalten Sie Terminaleingaben in Echtzeit
[Einführung in matplotlib] Lesen Sie die Endzeit aus den COVID-19-Daten ♬
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
So erhalten Sie einen Überblick über Ihre Daten in Pandas
Data Science-Begleiter in Python, wie man Elemente in Pandas spezifiziert
Ich habe 10 Bücher gelesen, die sich auf Zeitreihendaten beziehen, daher werde ich eine Rezension schreiben.
[Frage] So erhalten Sie die Daten von Textbereichsdaten in Echtzeit mithilfe der Python-Webframework-Flasche
[Python] Wie man MP3-Daten fFT
[Python] Wie man PCA mit Python macht
Umgang mit Sitzungen in SQLAlchemy
Lesen Sie die Protokollpufferdaten mit Python3
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
Lesen des SNLI-Datensatzes
So konvertieren Sie 0,5 in 1056964608 auf einmal
Versuchen Sie, Daten in MongoDB abzulegen
Wie man CSS in Django reflektiert
Wie man Prozesse in großen Mengen abbricht
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Über Zeitreihendaten und Übertraining
Verwendung von PubChem mit Python
Beispiel für das Aggregieren einer großen Menge von Zeitreihendaten mit Python in einer kleinen Speicherumgebung mit einer angemessenen Geschwindigkeit
Differenzierung von Zeitreihendaten (diskret)
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
So führen Sie TensorFlow 1.0-Code in 2.0 aus
Umgang mit Japanisch mit Python
So melden Sie sich bei Docker + NGINX an
Sammeln von Daten zum maschinellen Lernen
So schreiben Sie offline in Echtzeit Lösen von E04-Problemen mit Python
[Django] Lesen von Variablen / Konstanten, die in einer externen Datei definiert sind