PyTorch zusammenhängende()
Ich war durch dieses Beispiel einer LSTM-Sprache-Modell auf github (link).
Was es tut, im Allgemeinen ist ziemlich klar für mich. Aber ich bin immer noch kämpfen, um zu verstehen, was Berufung contiguous()
tut, kommt mehrmals im code.
Beispielsweise in Zeile 74/75 der code-Eingabe-und-Ziel-Sequenzen des LSTM erstellt werden.
Daten (abgelegt in ids
) ist 2-dimensional, wo die erste dimension ist die batch-Größe.
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
So, wie ein einfaches Beispiel, bei der Verwendung von batch-Größe 1 und seq_length
10 inputs
und targets
sieht wie folgt aus:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
So im Allgemeinen meine Frage ist, was hat contiguous()
und warum brauche ich es?
Weiteren verstehe ich nicht, warum die Methode aufgerufen wird, für das die target-Sequenz, nicht aber die Eingabe-Sequenz als beide Variablen sind aus den gleichen Daten.
Wie könnte targets
werden uncontiguous und inputs
noch zusammenhängend sein?
EDIT:
Ich habe versucht, zu verlassen, ruft contiguous()
, führt jedoch zu einer Fehlermeldung bei der Berechnung der Verluste.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
So offensichtlich Aufruf contiguous()
in diesem Beispiel ist notwendig.
(Für die Aufbewahrung dieser lesbar ich vermieden Buchung den vollständigen code hier, es kann gefunden werden, indem über die GitHub-link oben.)
Vielen Dank im Voraus!
InformationsquelleAutor blue-phoenox | 2018-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Vorgänge, die auf Tensor in PyTorch, die nicht wirklich ändern, den Inhalt des tensor, sondern nur wie zu konvertieren, werden die Indizes von tensor-byte-Lage. Diese Operationen umfassen:
Zum Beispiel:, wenn Sie anrufen
transpose()
, PyTorch nicht erzeugen neue tensor mit neuen layout, es ist nur verändert die meta-Informationen in Tensor-Objekt, so dass offset und stride sind für die neue Form. Die transponierte tensor und original-tensor sind in der Tat die Freigabe des Speichers!Dies ist, wo das Konzept der zusammenhängenden kommt. Oben
x
ist zusammenhängend, abery
ist nicht, weil seine Speicher-layout ist anders als einen tensor der gleichen Form von Grund auf neu gemacht. Beachten Sie, dass das Wort "zusammenhängende" ist etwas irreführend, denn es nicht, dass der Inhalt der tensor ist, verteilt um getrennte Blöcke von Speicher. Hier sind die bytes noch Mittel in einen block von Speicher, aber die Reihenfolge der Elemente ist anders!Beim Aufruf
contiguous()
es eigentlich eine Kopie der tensor also die Reihenfolge der Elemente wäre dasselbe, als wenn tensor der gleichen Form neu erstellt.Normalerweise brauchen Sie nicht zu kümmern. Wenn PyTorch erwartet zusammenhängenden tensor, aber wenn nicht, dann erhalten Sie
RuntimeError: input is not contiguous
und dann fügen Sie einfach einen Anruf zucontiguous()
.Ich kann nicht definitiv beantworten diese aber meine Vermutung ist, dass einige der PyTorch code verwendet high-performance-vektorisierte Implementierung der Operationen in C++ implementiert und der code kann keine beliebige Position/Schritte angegeben, die im Tensor der meta-Informationen. Dies ist nur eine Vermutung aber.
Warum nicht auch der angerufene rufen Sie einfach
contiguous()
von selbst?InformationsquelleAutor Shital Shah
Aus der pytorch Dokumentation:
Wo
contiguous
hier heißt zusammenhängend im Speicher. Also diecontiguous
Funktion hat keinen Einfluss auf Ihre Ziel-tensor bei, es macht einfach sicher, dass es gespeichert ist, in einem zusammenhängenden Speicherblock.Es ist einfach für die Leistung. Ich weiß nicht, warum die codes, macht es für die Ziele, aber nicht für die Eingänge.
mh.. es muss auch eine Grund zu nennen die Methode - ich habe versucht ohne und bekam eine Fehlermeldung. Ich bearbeitet die Frage oben.
Also anscheinend pytorch erfordert die Ziele in den Verlust zu continguous im Speicher, aber die Eingänge von neuralnet nicht brauchen, um diese Anforderung erfüllen.
Super danke dir! Ich denke, das macht Sinn für mich, ich habe bemerkt, dass zusammenhängende() wird auch angewendet, um die output-Daten (das war natürlich früher der Eingang) in der forward-Funktion, so dass beide Ausgänge und Ziele zusammenhängend sind, bei der Berechnung der Verluste. Vielen Dank!
InformationsquelleAutor patapouf_ai
Als in der vorherigen Antwort contigous() reserviert contigous-Speicher-chunks, es wird hilfreich sein, wenn wir vorbei tensor c oder c++ backend-code wo Tensoren sind übergeben als Pointer
InformationsquelleAutor p. vignesh