Wie funktioniert view () für Tensor in Fackel?
Ich habe Verwirrung über die Methode view()
im folgenden code-snippet.
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2,2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
Meine Verwirrung ist in Bezug auf die folgende Zeile.
x = x.view(-1, 16*5*5)
Was bedeutet tensor.view()
Funktion? Ich habe gesehen, dessen Verwendung in vielen Orten, aber ich kann nicht verstehen, wie interpretiert er seine " Parameter.
Was passiert, wenn ich negative Werte als Parameter an die view()
Funktion? Zum Beispiel, was passiert, wenn ich Anrufe, habe ich tensor_variable.view(1, 1, -1)
?
Kann mir jemand erklären das Prinzip der view()
Funktion mit einigen Beispielen?
InformationsquelleAutor der Frage Wasi Ahmad | 2017-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den view-Funktion gemeint ist, die die Umgestaltung der tensor ist.
Sagen, Sie haben ein tensor
a
ist ein tensor, der hat 16 Elemente von 1 bis 16(im Lieferumfang enthalten). Wenn Sie umgestalten möchten diesen tensor zu machen, eine4 x 4
tensor, dann können SieNun
a
wird ein4 x 4
tensor.(Beachten Sie, dass nach der Umgestaltung der Gesamtzahl der Elemente müssen die gleichen bleiben. Die Neugestaltung der tensora
zu einem3 x 5
tensor wäre nicht angemessen)Was ist die Bedeutung des Parameters -1?
Wenn es irgendwelche situation, dass Sie nicht wissen, wie viele Zeilen, die Sie wollen, aber sind Sie sicher, dass sich die Anzahl der Spalten können Sie dann erwähnen Sie es als -1(verlängern Sie diese Tensoren mit mehr Dimensionen. Nur eine der Achse-Wert -1). Dies ist ein Weg, zu sagen, die Bibliothek; geben Sie mir ein tensor ist, hat diese viele Spalten und berechnen Sie die entsprechende Anzahl von Zeilen, die notwendig ist, um dieses geschehen zu lassen.
Dies kann gesehen werden, in der neuronale-Netzwerk-code, den Sie oben gegeben habe. Nach der Zeile
x = self.pool(F.relu(self.conv2(x)))
in der forward-Funktion, Sie haben eine 16-depth-feature-map. Sie haben Sie zu glätten diese, es der vollständig vernetzten Schicht. So dass Sie sagen pytorch Umgestaltung der tensor, die Sie erhalten haben, bestimmte Anzahl von Spalten und sagen, es zu entscheiden, die Anzahl der Zeilen von selbst.Zeichnung eine ähnlichkeit zwischen numpy und pytorch,
view
ist ähnlich wie numpy ist Umformen Funktion.InformationsquelleAutor der Antwort Kashyap
Wollen wir einige Beispiele, von einfacheren zu den komplizierteren.
Den
view
Methode gibt ein tensor mit den gleichen Daten wie dieself
tensor (was bedeutet, dass die zurückgegebenen tensor hat die gleiche Anzahl von Elementen), aber mit einer anderen Form. Zum Beispiel:Unter der Annahme, dass
-1
ist nicht einer der Parameter, wenn man Sie miteinander multipliziert, das Ergebnis muss gleich sein der Anzahl der Elemente in der tensor. Wenn Sie das tun:a.view(3, 3)
ist, wird es werfen eineRuntimeError
weil die Form (3 x 3) ist ungültig für die Eingabe mit 16 Elementen. In anderen Worten: 3 x 3 ist nicht gleich 16, aber 9.Können Sie
-1
als einer der Parameter, die man der Funktion übergibt, aber nur einmal. Alles, was geschieht ist, dass die Methode die Mathematik zu tun, für Sie zum ausfüllen dieser dimension. Zum Beispiela.view(2, -1, 4)
entsprichta.view(2, 2, 4)
. [16 /(2 x 4) = 2]Beachten Sie, dass die zurückgegebenen tensor Aktien die gleichen Daten. Wenn Sie eine änderung in der "Ansicht" ändern Sie die original-tensor-Daten:
Nun, bei einem komplexeren Anwendungsfall. Die Dokumentation sagt, dass jede neue Ansicht dimension muss entweder ein Unterraum von einer ursprünglichen dimension, oder nur span d, d + 1, ..., d + k erfüllen die folgenden Kontiguität-wie Bedingung, dass für alle i = 0, ..., k - 1, stride[i] = Schrittlänge[i + 1] x Größe[i + 1]. Ansonsten
contiguous()
muss aufgerufen werden, bevor der tensor betrachtet werden kann. Zum Beispiel:Beachten Sie, dass für
a_t
stride[0] != stride[1] x Größe[1] seit 24 != 2 x 3InformationsquelleAutor der Antwort Jadiel de Armas