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.