[PYTHON] PyTorchs Buch war schwer zu verstehen, deshalb habe ich es ergänzt

Warum hast du diesen Artikel geschrieben?

Ich habe dieses Buch gekauft, weil ich etwas über PyTorch lernen wollte.

Nachdem ich einige davon verglichen hatte, wählte ich die für Anfänger, aber ... Ich weiß es nicht! !! !! Es wurde . _ ** Ich habe die Ausgabe nicht geschrieben, daher weiß ich nicht, was ausgegeben wird und welche Art von Standpunkt ich überprüfen soll! !! ** _

Also habe ich eine ** Ergänzung ** zusammengestellt, die besagt, dass dies wahrscheinlich das ist, was ich versuche zu sagen. Die Ausführungsumgebung ist Google Colaboratory.

Installieren Sie PyTorch als vorläufige Vorbereitung.

IN


import torch

PyTorch verwendet eine GPU. Lassen Sie uns überprüfen, ob die GPU verfügbar ist.

IN


#Überprüfen Sie, ob eine GPU verfügbar ist
print(torch.cuda.is_available())

OUT


True

Was ist Tensor?

Nach dem Buch ist Tensor

Korrekt.

Kurz gesagt, es ist PyTorchs "mehrdimensionales Array". In dem Buch gab es Erklärungen und Beispielcode für Mess- und Datentypen, aber ich habe es nur definiert ** Ich habe den Inhalt überhaupt nicht bestätigt **. Also, ** ich werde die Daten überprüfen **.

IN


#Erstellen Sie durch Übergeben einer verschachtelten Liste
t = torch.tensor([[1, 2], [3, 4.]])
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t

OUT


dtype: torch.float32
device: cpu
tensor([[1., 2.],
        [3., 4.]])

dtype ist der Datentyp und device gibt an, ob sich der Tensor auf der CPU oder der GPU befindet. Lassen Sie uns einen Tensor auf der GPU erstellen.

IN


t = torch.tensor([[1, 2], [2, 4.]], device="cuda:0")
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t

OUT


dtype: torch.float32
device: cuda:0
tensor([[1., 2.],
        [2., 4.]], device='cuda:0')

Es scheint, dass Sie mit torch.cuda.FloatTensor auch einen Tensor auf der GPU erstellen können.

IN


t = torch.cuda.FloatTensor([[1, 2], [2, 4.]])
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t
dtype: torch.float32
device: cuda:0
tensor([[1., 2.],
        [2., 4.]], device='cuda:0')

Cuda ist übrigens laut Wikipedia

CUDA (Compute Unified Device Architecture) ist eine universelle Parallel-Computing-Plattform (Parallel-Computing-Architektur) und ein Programmiermodell für GPUs, die von NVIDIA entwickelt und bereitgestellt werden.

Korrekt.

Jetzt ändern wir den Datentyp.

IN


#Geben Sie den 64-Bit-Datentyp an
t = torch.tensor([[1, 2], [2, 4.]], dtype=torch.float64)
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t

OUT


dtype: torch.float64
device: cpu
tensor([[1., 2.],
        [2., 4.]], dtype=torch.float64)

Eine 64-Bit-Ganzzahl mit Vorzeichen kann auch mit "torch.LongTensor" definiert werden.

IN


t = torch.LongTensor([[1, 2], [2, 4.]])
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t

OUT


dtype: torch.int64
device: cpu
tensor([[1, 2],
        [2, 4]])

Die Datentypen sind in diesem Dokument zusammengefasst. https://pytorch.org/docs/stable/tensors.html

Versuchen Sie, den auf der CPU erstellten Tensor auf die GPU zu übertragen.

IN


t = torch.zeros(100, 10).to("cuda:0")
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t[:2] #Scheiben sind auch in Tensor erhältlich

OUT


dtype: torch.float32
device: cuda:0
tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], device='cuda:0')

Wenn Sie die Form von Tensor überprüfen möchten, verwenden Sie die Größenfunktion anstelle der Formfunktion. Dies unterscheidet sich von NumPy.

IN


#Form wird durch Größe erhalten
# t.shape() #Kompilierungsfehler
t.size()

OUT


torch.Size([100, 10])

Verwenden Sie die Numpy-Funktion, um Tensor in Numpys Ndarray zu konvertieren.

IN


t = torch.tensor([[1, 2], [3, 4.]])
x = t.numpy()
print("type: {}".format(type(x)))
x

OUT


type: <class 'numpy.ndarray'> 
array([[1., 2.],
       [3., 4.]], dtype=float32)

Der Tensor auf der GPU muss in die CPU konvertiert werden.

IN


t = torch.cuda.FloatTensor([[1, 2], [3, 4.]])
x = t.to("cpu").numpy()
print("type: {}".format(type(x)))
x

OUT


type: <class 'numpy.ndarray'>
array([[1., 2.],
       [3., 4.]], dtype=float32)

Tensorumwandlung

Versuchen wir einen verwirrenden Weg, um Tensor zu konvertieren.

Die Umformung in Numpy wird von der Ansichtsfunktion ausgeführt.

IN


# 2 *2 bis 4*Wechseln Sie zu 1
#Die Ansicht ähnelt der Umformung von Ndarray
x1 = torch.tensor([[1, 2], [3, 4.]])
x1.view(4, 1)

OUT


tensor([[1.],
        [2.],
        [3.],
        [4.]])

Es gibt verschiedene Möglichkeiten, eine Translokation zu schreiben.

IN


x2 = torch.tensor([[10, 20, 30], [40, 50, 60.]])
x2.T

OUT


tensor([[10., 40.],
        [20., 50.],
        [30., 60.]])

IN


x2.t()

OUT


tensor([[10., 40.],
        [20., 50.],
        [30., 60.]])

Transponieren kann auch transponiert werden, aber zusätzlich zur Transposition kann auch das Bilddatenformat von HWC (vertikal, horizontal, Farbe) nach CHW (Farbe, horizontal, vertikal) sortiert werden.

IN


hwc_img_data = torch.rand(1, 5, 4, 3)
hwc_img_data

OUT


tensor([[[[0.9248, 0.7545, 0.5603],
          [0.5339, 0.6627, 0.7652],
          [0.7082, 0.5146, 0.9273],
          [0.8437, 0.7064, 0.1053]],

         [[0.2080, 0.8018, 0.6833],
          [0.5892, 0.9264, 0.9315],
          [0.0872, 0.1898, 0.5745],
          [0.2192, 0.1187, 0.7537]],

         [[0.9680, 0.9239, 0.8698],
          [0.2339, 0.9918, 0.3446],
          [0.6669, 0.4148, 0.2037],
          [0.1055, 0.0353, 0.3679]],

         [[0.7079, 0.4069, 0.1181],
          [0.1983, 0.0452, 0.5788],
          [0.6378, 0.7050, 0.1148],           
          [0.3960, 0.1924, 0.2714]],

         [[0.3127, 0.1320, 0.7232],
          [0.3484, 0.7617, 0.4725],
          [0.4863, 0.9178, 0.3092],
          [0.6279, 0.4259, 0.3828]]]])

Ich habe irgendwie verstanden, dass ich von 1 * 5 * 4 * 3 zu 1 * 4 * 5 * 3 wechseln würde (5 und 4 würden vertauscht).

IN


# 1 * 5 * 4 *3 zu 1* 4 * 5 *Wechseln Sie zu 3
hwc_img_data.transpose(1, 2)

OUT


tensor([[[[0.9248, 0.7545, 0.5603],
          [0.2080, 0.8018, 0.6833],
          [0.9680, 0.9239, 0.8698],
          [0.7079, 0.4069, 0.1181],
          [0.3127, 0.1320, 0.7232]],

         [[0.5339, 0.6627, 0.7652],
          [0.5892, 0.9264, 0.9315],
          [0.2339, 0.9918, 0.3446],
          [0.1983, 0.0452, 0.5788],
          [0.3484, 0.7617, 0.4725]],

         [[0.7082, 0.5146, 0.9273],
          [0.0872, 0.1898, 0.5745],
          [0.6669, 0.4148, 0.2037],
          [0.6378, 0.7050, 0.1148],
          [0.4863, 0.9178, 0.3092]],

         [[0.8437, 0.7064, 0.1053],
          [0.2192, 0.1187, 0.7537],
          [0.1055, 0.0353, 0.3679],
          [0.3960, 0.1924, 0.2714],
          [0.6279, 0.4259, 0.3828]]]])

IN


#1 mehr* 4 * 5 *3 zu 1* 3 * 4 *Wechseln Sie zu 5
#Jetzt können Sie von hwc nach cwh konvertieren
hwc_img_data.transpose(1, 2).transpose(1, 3)

OUT


tensor([[[[0.9248, 0.5339, 0.7082, 0.8437],
          [0.2080, 0.5892, 0.0872, 0.2192],
          [0.9680, 0.2339, 0.6669, 0.1055],
          [0.7079, 0.1983, 0.6378, 0.3960],
          [0.3127, 0.3484, 0.4863, 0.6279]],

         [[0.7545, 0.6627, 0.5146, 0.7064],
          [0.8018, 0.9264, 0.1898, 0.1187],
          [0.9239, 0.9918, 0.4148, 0.0353],
          [0.4069, 0.0452, 0.7050, 0.1924],
          [0.1320, 0.7617, 0.9178, 0.4259]],

         [[0.5603, 0.7652, 0.9273, 0.1053],
          [0.6833, 0.9315, 0.5745, 0.7537],
          [0.8698, 0.3446, 0.2037, 0.3679],
          [0.1181, 0.5788, 0.1148, 0.2714],
          [0.7232, 0.4725, 0.3092, 0.3828]]]])

Tensor und automatische Differenzierung

Wenn das Attribut require_grad auf True gesetzt ist, wird eine automatische Differenzierung durchgeführt. Das Buch beschreibt nicht im Detail, wo und was erscheinen wird, also werde ich es hinzufügen.

IN


x = torch.randn(100, 3)
a = torch.tensor([1, 2, 3.], requires_grad=True)

y = torch.mv(x, a)
print(y.grad_fn) #Stellen Sie sicher, dass das Berechnungsdiagramm zur Berechnung des Gradienten gespeichert ist

o = y.sum()

#Holen Sie sich einen Farbverlauf
#Variablen, die rückwärts arbeiten, müssen skalar sein
o.backward()

#Eine automatische Differenzierung wird durchgeführt, a.Gradient wird in grad erfasst
print(a.grad)

a.grad != x.sum(0)

OUT


<MvBackward object at 0x7f9c7998e3c8>
tensor([ 2.5016,  6.3925, -6.3674])
tensor([False, False, False])

Recommended Posts

PyTorchs Buch war schwer zu verstehen, deshalb habe ich es ergänzt
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Ich konnte AWS-Batch mit Python, Moto verspotten, also werde ich es verlassen
Docker x Visualization hat nicht funktioniert und ich war süchtig danach, also habe ich es zusammengefasst!
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Python: Kann in Lambda wiederholt werden
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Es war schwierig, Kernel-Tricks in Support-Vektor-Maschinen zu verstehen (Teil 2: Kernel-Regression, Ridge-Regression usw.)
[Erwerb der Qualifikation] Ich habe LinuC Level 1 bestanden und werde darüber schreiben, wie man studiert und wie es war.
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 1)
Ich konnte die Zaunreparatur von Arimoto nicht leicht verstehen, daher werde ich sie im Detail verfolgen.
Ich war süchtig nach Multiprocessing + Psycopg2
Ich habe das Verhalten von Argsort of Numpy nicht verstanden, deshalb werde ich es zusammenfassen
Ich habe PySide2 installiert, aber pyside2-uic hat nicht funktioniert, also habe ich es geschafft.
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
(Anfänger) Ich bin mir über den SSH- und Linux-Befehl ssh-keygen nicht sicher, also habe ich es zusammengefasst.
Ich war süchtig danach, Cython mit PyCharm auszuprobieren, also machen Sie sich eine Notiz
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Ich habe das Stempeln von Job Can mit Selen automatisiert und in Google Cloud Functions bereitgestellt, aber es war ziemlich schwierig
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Wrangle x Python Buch Ich habe es versucht [2]
Ich war süchtig danach, mysqlclient zu installieren
Unverständliche binäre Baumdurchquerung
Ich war auf dotCloud süchtig nach Flask
Ich habe über Docker recherchiert und werde es zusammenfassen
Wrangle x Python Buch Ich habe es versucht [1]
Was ich süchtig nach Python Autorun war
Ich habe versucht, mein eigenes Modul zu veröffentlichen, damit ich es per Pip installieren kann
Als ich untersuchte, ob die COTOHA-API Mansai verstehen konnte, war dies vernünftig.
Irgendwie hat der Code, den ich geschrieben habe, funktioniert und ich war beeindruckt, also werde ich ihn veröffentlichen
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste