Saltar al contenido

¿Cómo obtengo el valor de un tensor en PyTorch?

Queremos brindarte la mejor solución que hemos encontrado en línea. Esperamos que te sirva de ayuda y si puedes comentarnos algo que nos pueda ayudar a crecer hazlo libremente.

Solución:

Puedes usar x.item() para obtener un número de Python de un tensor que tiene un elemento

Convertir tensor a numpy:

x.numpy()[0]

Para obtener un valor del tensor de un solo elemento x.item() funciona siempre:

Ejemplo : Tensor de un solo elemento en la CPU

x = torch.tensor([3])
x.item()

Producción:

3

Ejemplo : Tensor de elemento único en CPU con AD

x = torch.tensor([3.], requires_grad=True)
x.item()

Producción:

3.0

NOTA: Necesitábamos usar aritmética de punto flotante para AD

Ejemplo : Tensor de un solo elemento en CUDA

x = torch.tensor([3], device='cuda')
x.item()

Producción:

3

Ejemplo : Tensor de un solo elemento en CUDA con AD

x = torch.tensor([3.], device='cuda', requires_grad=True)
x.item()

Producción:

3.0

Ejemplo : Tensor de un solo elemento en CUDA con AD nuevamente

x = torch.ones((1,1), device='cuda', requires_grad=True)
x.item()

Producción:

1.0

Para obtener un valor de un tensor de un solo elemento, debemos tener cuidado:

El siguiente ejemplo mostrará que el tensor PyTorch que reside en la CPU comparte el mismo almacenamiento que numpy array na

Ejemplo: Almacenamiento compartido

import torch
a = torch.ones((1,2))
print(a)
na = a.numpy()
na[0][0]=10
print(na)
print(a)

Producción:

tensor([[1., 1.]])
[[10.  1.]]
tensor([[10.,  1.]])

Ejemplo: Eliminar el efecto del almacenamiento compartido, copiar numpy array primero

Para evitar el efecto del almacenamiento compartido necesitamos copy() el adormecido array na a un nuevo numpy array nac. entumecido copy() El método crea el nuevo almacenamiento separado.

import torch
a = torch.ones((1,2))
print(a)
na = a.numpy()
nac = na.copy()
nac[0][0]=10
​print(nac)
print(na)
print(a)

Producción:

tensor([[1., 1.]])
[[10.  1.]]
[[1. 1.]]
tensor([[1., 1.]])

Ahora, solo el nac entumecido array será alterado con la línea nac[0][0]=10, na y a permanecerá como está.

Ejemplo: tensor de CPU requires_grad=True

import torch
a = torch.ones((1,2), requires_grad=True)
print(a)
na = a.detach().numpy()
na[0][0]=10
print(na)
print(a)

Producción:

tensor([[1., 1.]], requires_grad=True)
[[10.  1.]]
tensor([[10.,  1.]], requires_grad=True)

Aquí llamamos:

na = a.numpy() 

Esto causaría: RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.porque los tensores que require_grad=True son registrados por PyTorch AD.

Esta es la razón por la que necesitamos detach() primero antes de convertirlos usando numpy().

Ejemplo: tensor CUDA requires_grad=False

a = torch.ones((1,2), device='cuda')
print(a)
na = a.to('cpu').numpy()
na[0][0]=10
print(na)
print(a)

Producción:

tensor([[1., 1.]], device='cuda:0')
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0')

Aquí simplemente no convertimos el tensor CUDA a CPU. No hay ningún efecto del almacenamiento compartido aquí.

Ejemplo: tensor CUDA requires_grad=True

a = torch.ones((1,2), device='cuda', requires_grad=True)
print(a)
na = a.detach().to('cpu').numpy()
na[0][0]=10
​print(na)
print(a)

Producción:

tensor([[1., 1.]], device='cuda:0', requires_grad=True)
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0', requires_grad=True)

Sin detach() metodo el error RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead. se establecerá.

Sin .to('cpu') método TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first. se establecerá.

valoraciones y reseñas

Eres capaz de añadir valor a nuestro contenido cooperando tu veteranía en las aclaraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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