[PYTHON] Le livre de PyTorch était difficile à comprendre, alors je l'ai complété

Pourquoi avez-vous écrit cet article?

J'ai acheté ce livre parce que je voulais en savoir plus sur PyTorch.

Après avoir comparé certains d'entre eux, j'ai choisi celui pour les débutants, mais ... `Je ne sais pas! !! !! C'est devenu ". _ ** Je n'ai pas écrit la sortie, donc je ne sais pas quelle est la sortie et quel type de point de vue je devrais vérifier! !! ** _

Donc, j'ai mis en place un ** supplément ** qui dit que c'est probablement ce que j'essaie de dire. L'environnement d'exécution est Google Colaboratory.

Comme préparation préliminaire, installez PyTorch.

IN


import torch

PyTorch utilise le GPU. Vérifions si le GPU est disponible.

IN


#Vérifiez si le GPU est disponible
print(torch.cuda.is_available())

OUT


True

Qu'est-ce que Tensor?

Selon le livre, Tensor est

--Une structure de données pour la gestion de tableaux multidimensionnels --A presque la même API que le ndarray de Numpy

C'est vrai.

En bref, c'est le «tableau multidimensionnel» de PyTorch. Dans le livre, il y avait des explications et des exemples de code de désordre et de types de données, mais je viens de le définir ** Je n'ai pas du tout confirmé le contenu **. Donc, ** je vais vérifier les données **.

IN


#Créer en passant une liste imbriquée
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» est le type de données, et «device» indique si le Tensor est sur le CPU ou le GPU. Créons un Tensor sur le GPU.

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')

Il semble que vous puissiez également créer un Tensor sur le GPU avec torch.cuda.FloatTensor.

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')

À propos, cuda est selon Wikipedia

CUDA (Compute Unified Device Architecture) est une plate-forme de calcul parallèle polyvalente (architecture de calcul parallèle) et un modèle de programmation pour les GPU développés et fournis par NVIDIA.

C'est vrai.

Modifions maintenant le type de données.

IN


#Spécifiez le type de données 64 bits
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)

Un entier signé 64 bits peut également être défini avec torch.LongTensor.

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]])

Les types de données sont résumés dans ce document. https://pytorch.org/docs/stable/tensors.html

Essayez de transférer le Tensor créé sur le CPU vers le GPU.

IN


t = torch.zeros(100, 10).to("cuda:0")
print("dtype: {}\ndevice: {}".format(t.dtype, t.device))
t[:2] #Les tranches sont également disponibles dans Tensor

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')

Si vous voulez vérifier la forme de Tensor, utilisez la fonction de taille au lieu de la fonction de forme. Ceci est différent de NumPy.

IN


#la forme est obtenue par la taille
# t.shape() #Erreur de compilation
t.size()

OUT


torch.Size([100, 10])

Utilisez la fonction numpy pour convertir Tensor en ndarray de Numpy.

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)

Tensor sur GPU doit être converti en CPU.

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)

Conversion de tenseur

Essayons une manière déroutante de convertir Tensor.

Le remodelage dans Numpy est exécuté par la fonction de vue.

IN


# 2 *2 à 4*Changer en 1
#la vue est similaire au remodelage de ndarray
x1 = torch.tensor([[1, 2], [3, 4.]])
x1.view(4, 1)

OUT


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

Il existe plusieurs manières d'écrire une translocation.

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.]])

La transposition peut également être transposée, mais en plus de la transposition, elle peut également être utilisée pour trier le format des données d'image de HWC (vertical, horizontal, couleur) à CHW (couleur, horizontal, vertical).

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]]]])

J'ai en quelque sorte compris que je changerais de 1 * 5 * 4 * 3 à 1 * 4 * 5 * 3 (5 et 4 seraient interchangés).

IN


# 1 * 5 * 4 *3 à 1* 4 * 5 *Changer en 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 de plus* 4 * 5 *3 à 1* 3 * 4 *Changer en 5
#Maintenant, vous pouvez convertir de hwc en cwh
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]]]])

Tenseur et différenciation automatique

La différenciation automatique est effectuée lorsque l'attribut requires_grad est défini sur True. Le livre ne décrit pas en détail où et ce qui apparaîtra, je vais donc l'ajouter.

IN


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

y = torch.mv(x, a)
print(y.grad_fn) #Assurez-vous que le graphique de calcul pour le calcul du gradient est stocké

o = y.sum()

#Obtenez un dégradé
#Les variables qui fonctionnent à l'envers doivent être scalaires
o.backward()

#Une différenciation automatique est effectuée, un.Le gradient est acquis en grad
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

Le livre de PyTorch était difficile à comprendre, alors je l'ai complété
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'ai pu me moquer d'AWS-Batch avec python, moto, donc je vais le laisser
Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
Notez que j'étais accro à la configuration de TensowFlow
Python: peut être répété en lambda
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Il était difficile de comprendre les astuces du noyau dans les machines vectorielles de support (Partie 2: Régression du noyau, régression de crête, etc.)
[Acquisition de la qualification] J'ai réussi le niveau LinuC 1, donc j'écrirai sur la façon d'étudier et comment c'était.
Je l'ai écrit en langage Go pour comprendre le principe SOLID
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 1)
Je ne pouvais pas comprendre facilement Fence Repair of Arimoto, donc je vais le suivre en détail.
J'étais accro au multitraitement + psycopg2
Je n'ai pas compris le comportement d'argsort de numpy, donc je vais le résumer
J'ai installé PySide2, mais pyside2-uic ne fonctionnait pas, alors j'ai réussi à le faire.
Utilisez Python de Java avec Jython. J'étais aussi accro.
(Débutant) Je ne suis pas sûr de SSH et de la commande Linux ssh-keygen, alors je l'ai résumé.
J'étais accro à essayer Cython avec PyCharm, alors prenez note
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
J'ai automatisé l'estampillage de Job Can avec du sélénium et l'ai déployé sur Google Cloud Functions, mais c'était assez difficile
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
Livre Wrangle x Python Je l'ai essayé [2]
J'étais accro à pip installer mysqlclient
Traversée d'arbre binaire incompréhensible
J'étais accro à Flask sur dotCloud
J'ai fait des recherches sur Docker, donc je vais le résumer
Livre Wrangle x Python Je l'ai essayé [1]
Ce que j'étais accro à Python autorun
J'ai essayé de publier mon propre module pour pouvoir l'installer
J'ai vérifié si l'API COTOHA pouvait comprendre Mansai, et c'était raisonnable.
D'une manière ou d'une autre, le code que j'ai écrit a fonctionné et j'ai été impressionné, alors je vais le poster
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache