Fundamentos de PyTorch. Tensores

Esta entrada es parte del curso de Deep learning con PyTorch.

Uno de los conceptos más frecuentes en machine learning es el de tensor. Un tensor es la generalización del concepto de vector utilizando el rango para definir el número de indices del tensor. Por ejemplo, un vector es un tensor de rango 1, una matriz es un tensor de rango 2 y un tensor de rango tres sería una matriz con un eje extra. La clase torch.tensor de PyTorch pemite trabajar cómodamente con tensores tanto en la CPU como en la GPU. Existen diferentes formas de crear un tensor. In [2]:

import torch
import numpy as np

#A partir de una lista de Python
list = ([1,2],[3,4],[5,6])
tensor1=torch.tensor(list)
print(tensor1)

#A partir de los datos directamente
tensor2=torch.tensor([[[1, 2, 3],[4, 5, 6]],[[1, 2, 3],[4, 5, 6]]])
print(tensor2)

#A partir de un array numpy
tensor3=torch.tensor(np.array([1,2,3,4]))
print(tensor3)

#Usando una operación de creación de tensores
tensor4=torch.rand(2,3)
print(tensor4)
tensor([[1, 2],
        [3, 4],
        [5, 6]])
tensor([[[1, 2, 3],
         [4, 5, 6]],

        [[1, 2, 3],
         [4, 5, 6]]])
tensor([1, 2, 3, 4])
tensor([[0.6060, 0.8052, 0.1538],
        [0.8096, 0.6612, 0.4279]])

In [22]:

#A través del método size se obtiene el tamaño del tensor, su rango y las dimensiones

#Un tensor de rango 2 (3,2) para tensor1
print(tensor1.size())

#Un tensor de rango 3 con las dimensiones (2,2,3) para tensor2
print(tensor2.size())
torch.Size([3, 2])
torch.Size([2, 2, 3])

In [36]:

#A los componentes de los tensores se puede acceder como usualmente en Python
print(tensor1[0])
print(tensor1[0,1])

#Con view se cambia las dimensiones y el rango del tensor
tensor5=torch.rand(2,4)
print(tensor5.size())

tensor6=tensor5.view(8)
print(tensor6.size())
tensor([1, 2])
tensor(2)
torch.Size([2, 4])
torch.Size([8])

In [49]:

#Un tensor se puede crear con requires_grad=True para que torch.autograd registre las operaciones y realice la diferenciación automática

x = torch.tensor([2],dtype=torch.float,requires_grad=True)
y = x.pow(3)
y.backward()
x.grad

Out[49]:

tensor([12.])

In [3]:

#PyTorch permite trabajar con CUDA para realizar las operaciones en la GPU
torch.cuda.is_available()
torch.cuda.current_device()
print(torch.cuda.get_device_name(0))
Tesla T4

In [11]:

#Comparación del tiempo en realizar una multiplicaión de matrices en la CPU y en la GPU
%%time
for i in range(500):
  x = torch.randn(1000,1000)
  y = torch.randn(1000,1000)
  z = torch.matmul(x,y)
CPU times: user 14.6 s, sys: 57.1 ms, total: 14.6 s
Wall time: 14.7 s

In [10]:

#Se realiza la multiplicación en la GPU
%%time
cuda0 = torch.device('cuda:0')
for i in range(500):
  x = torch.randn(1000,1000,device = cuda0)
  y = torch.randn(1000,1000,device =cuda0)
  z = torch.matmul(x,y)
CPU times: user 101 ms, sys: 101 ms, total: 202 ms
Wall time: 208 ms

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Orgullosamente ofrecido por WordPress | Tema: Baskerville 2 por Anders Noren.

Subir ↑

A %d blogueros les gusta esto: