Rückgabetypen in Pytorch ermitteln. Konkret: PyTorch DataLoader

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RuFT
User
Beiträge: 2
Registriert: Freitag 12. April 2019, 18:36

Hallo zusammen,

ich komme eigentlich von Java und von dort bin ich eine erstklassige Dokumentation gewohnt, sodass eigentlich nie Fragen zu Rückgabetypen aufgekommen sind. Nun ist das für mich in Python manchmal noch etwas schwierig. Ich habe folgendes Problem: Ich implementiere mithilfe von Pytorch eine Anwendung. Die Daten für ein künstliches neuronales Netz sollen über die Klasse DataLoader geladen werden. Wie komme ich jetzt an die Daten bzw. wo ist das dokumentiert oder welche Möglichkeiten habe ich, herauszufinden, wie ich da rankomme? Aus den Tutroials ist mir noch nicht genau ersichtlich, wie das passiert (Die Ermittlung des Rückgabetyps allgemein). Es gibt zwar funktionierende Beispiele, aber es muss doch andere Wege geben, als über Tutorials an den Typ der Rückgabe zu kommen. Es gibt schließlich nicht für jede Klasse ein Tutorial.

Was habe ich bisher versucht:
Zunächst habe ich den Code der Klasse DataLoader angesehen. Die Objekte dieser Klasse implementieren die __iter()__ Methode und geben darin ein Objekt vom Typ _DataLoaderIter() zurück, also kann ich über das Teil schonmal iterieren. Hervorragend. Dieses Objekt implementiert die __next()__ Methode und gibt in jedem Iterationsschritt ein Objekt "batch" zurück (wie sieht das aus? Wie viele Dimensionen hat das? Welcher Datentyp ist das). Dieses wird widerum in der Methode self.collate_fn() erzeugt und später nochmal modifiziert. Diese self.collate_fn() Methode ist widerum ene Referenz auf die collate_fn() Methode des Loaders (DataLoader()), der _DataLoaderIter() übergeben wird. Diese Methode wird wiederum bei der Instanziierung von DataLoader als parameter mitgegeben, bzw. dort standardmäßig als default_collate definiert. Dieser ist widerum definiert als _utils.collate.default_collate. Also in einem anderen Package. Jetz mal im ernst... wie viele Klassen und Packages muss ich durchwülen, bis ich auf meine Information stoße. Das kann doch nicht the way to go sein.

Ich freue mich auf eure Antworten :)
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also Quelltext lesen ist bestenfalls Plan C und sollte nicht notwendig sein.
Wie komme ich jetzt an die Daten bzw. wo ist das dokumentiert oder welche Möglichkeiten habe ich, herauszufinden, wie ich da rankomme?
RTFM - ist bei Python nicht anders als in andere Sprachen :-) Wenn das Modul eine API-Doku, steht das hoffentlich da drin

Python kennt auch den Build-in Befehl `type(OBJEKT)`, wenn dem du dir den Typ von `OBJEKT` anzeigen lassen kannst.

Ausserdem kannst du dir in der interaktiven Kommandozeile von Python mit

Code: Alles auswählen

>>> foo = MeineKlasse()
>>> dir(foo)
die Methoden und Attribute von `foo` anzeigen lassen. Mit `help(foo)` bekommst du dir Doc-Strings von `foo` angezeigt.

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Die erstklassige Dokumentation liegt nicht an der Programmiersprache, sondern an dem, der sie verfasst.
Wenn Sie korrekt im Quellcode hinterlegt ist, kannst du sie mit help(target) im Interpreter direkt abrufen.

Code: Alles auswählen

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RuFT: Das Problem ist, dass es keine konkreten Rückgabetypen geben muss. Die Objekte müssen keinen speziellen Typ haben, es reicht wenn die sich entsprechend verhalten. Was ist denn das Problem dabei einfach bei einem Beispiel zu schauen? Die Dokumentation von `DataLoader` beschreibt das das Ergebnis iterierbar ist und über das `Dataset` iteriert wird. Über diese einzelnen Elemente steht nicht mehr da an der Stelle. Also muss man halt in Beispielen schauen, oder selbst einen `Dataloader` erstellen und `next()` aufrufen, und schauen was man da bekommt. Ich würde jetzt aufgrund der Dokumentation ganz stark vermuten das gleiche als wenn man `next(iter(dataset))`` oder ``dataset[0]`` auf einem `Dataset`-Objekt aufruft.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
RuFT
User
Beiträge: 2
Registriert: Freitag 12. April 2019, 18:36

Ich habe nochmal etwas rumprobiert und du hast in der Tat recht. Der Dataloader lädt einfach nur das Dataset, wie der Name schon sagt. Das Probem ist viel mehr, dass ich nicht weiß, wie ich das dataset verarbeiten soll, aber das ist ein neues Paar Schuhe und ist hier fehl am Platz. Also im Endeffekt ist das Problem gelöst. Viele Dank für eure hilfreichen Hinweise :)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Schau dir doch mal dieses Beispiel hier an.
https://github.com/pytorch/examples/blo ... st/main.py
Da kannst du Schritt für Schritt die Vorgehensweise durch arbeiten.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten