Los tensores

Los tensores matrices multidimensionales que contienen elementos de un único tipo. Esto es importante para machine learning ya que usamos todos los cálculos en una red neuronal tendrán que hacerse con estas unidades. Básicamente podemos usar ocho tipo de tensores en CPUs o GPUs. Estos son según la documentación de PyTorch los siguientes:

Cómo construirlos

Para poder usarlos primero se deben de construir. Para ello se pueden crear partiendo de una lista de python o de un tipo de datos de NumPy. Es bastante sencillo, y se utiliza la funcion torch.tensor(). Para averiguar el tipo de un tensor, usamos el método tensor.type(). Para hacer esto más claro, veamos el siguente ejemplo:

import torch

lista = torch.tensor([[1,1],[1,1]])
print(lista)
print(lista.type())

lista = torch.tensor([[1.,1.],[1.,1.]])
print(lista)
print(lista.type())

lista = torch.tensor([[1.,1.],[1,1]])
print(lista)
print(lista.type())

Con la sigueinte salida:

tensor([[1, 1],
[1, 1]])
torch.LongTensor
tensor([[1., 1.],
[1., 1.]])
torch.FloatTensor
tensor([[1., 1.],
[1., 1.]])

32-bit floating point torch.float32 or torch.float torch.FloatTensor torch.cuda.FloatTensor
64-bit floating point torch.float64 or torch.double torch.DoubleTensor torch.cuda.DoubleTensor
16-bit floating point torch.float16 or torch.half torch.HalfTensor torch.cuda.HalfTensor
8-bit integer (unsigned) torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8-bit integer (signed) torch.int8 torch.CharTensor torch.cuda.CharTensor
16-bit integer (signed) torch.int16 or torch.short torch.ShortTensor torch.cuda.ShortTensor
32-bit integer (signed) torch.int32 or torch.int torch.IntTensor torch.cuda.IntTensor
64-bit integer (signed) torch.int64 or torch.long torch.LongTensor torch.cuda.LongTensor

 

Cómo podemos observar, el tipo de dato que va a contener el tensor se asigna de manera automática. En el caso de que no todos los datos sean del mismo tipo, se intentará hacer una conversión automática. Esto está bien en muchos de los casos, pero hay ocaciones en que queremos especificar manualmente qué tipo de datos queremos manejar. Para ello podemos agregar un argumento llamado dtype. Veamos el ejemplo:

import torch

A = [[1,.2],[-.2,-45.1]]

T = torch.tensor(A, dtype=torch.double)
print(T)
print(T.type())

Ahora vemos que la presición y el número de bits que se utilizan para cada variable la especificamos nosotros.

tensor([[  1.0000,   0.2000],
[ -0.2000, -45.1000]], dtype=torch.float64)
torch.DoubleTensor

Otra forma de construir tensores en llendandolos con datos como son ceros o unos. En este caso hay dos funciones básicas que se pueden usar.

import torch

T = torch.zeros([2,3], dtype=torch.float32)

print(T)
print(T.type)

T2 = torch.ones([2,3,4], dtype=torch.int32)
print(T2)
print(T2.type)

Ahora bien...

tensor([[0., 0., 0.],
[0., 0., 0.]])
torch.FloatTensor
tensor([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],

[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=torch.int32)
torch.IntTensor

Cabe aclarar que no para todos los tipos de tensores están implementadas funciones de creación automática. En el caso de los tensores de menos 16 bits esto no funciona.

 

 

 

 

 

Share This