Pytorch tensor naar numpy array

Ik heb een pytorchTensor van de grootte torch.Size([4, 3, 966, 1296])

Ik wil het converteren naar een numpyarray met de volgende code:

imgs = imgs.numpy()[:, ::-1, :, :]

Kan iemand uitleggen wat deze code doet?


Antwoord 1, autoriteit 100%

Er zijn 4 dimensies van de tensor die je wilt converteren.

[:, ::-1, :, :] 

:betekent dat de eerste dimensie gekopieerd en geconverteerd moet worden, hetzelfde geldt voor de derde en vierde dimensie.

::-1betekent dat het voor de tweede assen de assen omkeert


Antwoord 2, autoriteit 96%

Ik geloof dat je ook .detach()moet gebruiken. Ik moest mijn Tensor converteren naar een numpy-array op Colab die CUDA en GPU gebruikt. Ik deed het als volgt:

# this is just my embedding matrix which is a Torch tensor object
embedding = learn.model.u_weight
embedding_list = list(range(0, 64382))
input = torch.cuda.LongTensor(embedding_list)
tensor_array = embedding(input)
# the output of the line below is a numpy array
tensor_array.cpu().detach().numpy()

Antwoord 3, autoriteit 62%

Dit werkte voor mij:

np_arr = torch_tensor.cpu().detach().numpy()

Antwoord 4, autoriteit 38%

Terwijl andere antwoorden perfectde vraag uitlegden, zal ik enkele voorbeelden uit de praktijk toevoegen die tensoren omzetten in numpy-array:

Voorbeeld: Gedeelde opslag

PyTorch-tensor die zich op CPU bevindt, deelt dezelfde opslag als numpy array na

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

Uitgang:

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

Voorbeeld: Elimineer effect van gedeelde opslag, kopieer numpy array eerst

Om het effect van gedeelde opslag te voorkomen, moeten we copy()de numpy array nanaar een nieuwe numpy array nac. NUMPY copy()METHODE CREËERT DE NIEUWE APPARELDE OPSLAG.

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)

Uitgang:

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

Nu, alleen de nacNUMY-array wordt gewijzigd met de lijn nac[0][0]=10, naEN ablijft net zo.

Voorbeeld: CPU-tensor met 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)

Uitgang:

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

Hier bellen we:

na = a.numpy() 

Dit zou veroorzaken: RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead., omdat tensoren die require_grad=Trueworden geregistreerd door PyTorch AD. Merk op dat tensor.detach()de nieuwe manier is voor tensor.data.

Dit verklaart waarom we ze eerst moeten detach()voordat we ze converteren met numpy().

Voorbeeld: CUDA tensor met 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)

Uitvoer:

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

Voorbeeld: CUDA tensor met 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)

Uitvoer:

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

Zonder detach()methode de fout RuntimeError: Can't call numpy()on Tensor that requires grad. Use tensor.detach().numpy() instead.wordt ingesteld.

Zonder .to('cpu')methode TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.wordt ingesteld.

Je zou cpu()kunnen gebruiken maar in plaats van to('cpu')maar ik geef de voorkeur aan de nieuwere to('cpu').


Antwoord 5, autoriteit 25%

Je kunt deze syntaxis gebruiken als er cijfers aan je variabelen zijn gekoppeld.

y=torch.Tensor.cpu(x).detach().numpy()[:,:,:,-1]


Antwoord 6

Uw vraag is erg slecht geformuleerd. Je code doet (een soort van) al wat je wilt. Waar ben je precies in de war over? x.numpy()beantwoord de oorspronkelijke titel van je vraag:

Pytorch tensor naar numpy array

u moet uw vraag verbeteren, te beginnen met uw titel.

Hoe dan ook, voor het geval dit nuttig is voor anderen. Mogelijk moet u detach bellen om uw code te laten werken. bijv.

RuntimeError: Can't call numpy() on Variable that requires grad.

Dus bel .detach(). Voorbeeldcode:

# creating data and running through a nn and saving it
import torch
import torch.nn as nn
from pathlib import Path
from collections import OrderedDict
import numpy as np
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
num_samples = 3
Din, Dout = 1, 1
lb, ub = -1, 1
x = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples, Din))
f = nn.Sequential(OrderedDict([
    ('f1', nn.Linear(Din,Dout)),
    ('out', nn.SELU())
]))
y = f(x)
# save data
y.numpy()
x_np, y_np = x.detach().cpu().numpy(), y.detach().cpu().numpy()
np.savez(path / 'db', x=x_np, y=y_np)
print(x_np)

cpu gaat na loskoppelen. Zie: https://discuss.pytorch.org/t/should-it-really-be-necessary-to-do-var-detach-cpu-numpy/35489/5


Ook zal ik geen opmerkingen maken over het gelik, aangezien dat off-topic is en dat zou niet de focus van uw vraag moeten zijn. Zie dit:

Plaknotatie begrijpen

Other episodes