source

피토치 텐서와 눔피 배열

factcode 2023. 10. 11. 21:02
반응형

피토치 텐서와 눔피 배열

피토치가 있습니다.Tensor모양이 좋은[4, 3, 966, 1296]. 로 변환하고 싶습니다.numpy다음 코드를 사용하여 배열합니다.

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

그 코드는 어떻게 작동합니까?

당신도 사용해야 한다고 생각합니다..detach(). 나는 내 텐서를 CUDA와 GPU를 사용하는 Colab의 numpy 배열로 변환해야 했습니다. 나는 다음과 같이 했습니다.

# 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()

효과가 있었습니다.

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

다른 답변들은 완벽하게 질문을 설명했지만 텐서를 눔피 어레이로 변환하는 실제 사례를 추가하겠습니다.

예:공유 스토리지

CPU에 상주하는 PyTorch 텐서가 numpy 어레이와 동일한 스토리지 공유na

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

출력:

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

예: 공유 스토리지의 효과 제거, numpy 어레이 먼저 복사

공유 스토리지의 영향을 피하기 위해서는 다음과 같은 작업이 필요합니다.copy()누피 배열na새 누피 배열로nac. 눔피copy()method는 새 별도의 저장소를 만듭니다.

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)

출력:

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

이제, 그냥.nacnumpy 배열이 라인과 함께 변경됩니다.nac[0][0]=10,na그리고.a그대로 남아있을 겁니다

예: CPU 텐서와

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

출력:

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

여기서 우리는 다음을 부릅니다.

na = a.numpy() 

이로 인해 다음이 발생합니다.RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead., 왜냐하면 텐서들은require_grad=TruePyTorch AD에 의해 기록됩니다.참고:tensor.detach()를 위한 새로운 방법입니다.tensor.data.

이것이 우리가 왜 우리가detach()를 사용하여 변환하기 전에 그들이 먼저.numpy().

예: CUDA 텐서 사용

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

출력:

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

예: CUDA 텐서 사용

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)

출력:

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

없이.detach()오류를 메소드로 처리합니다.RuntimeError: Can't call 울렁울적인 on Tensor that requires grad. Use tensor.detach().numpy() instead.설정됩니다.

없이..to('cpu')방법TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.설정됩니다.

당신은 사용할 수 있습니다.cpu()대신에to('cpu')하지만 나는 새로운 것이 더 좋습니다.to('cpu').

변환하려는 텐서의 차원은 4개가 있습니다.

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

:첫 번째 차원을 그대로 복사하여 변환해야 하며, 세 번째 및 네 번째 차원도 마찬가지입니다.

::-1두 번째 축에 대해서는 축을 반대로 함을 의미합니다.

일부 눈금에 변수가 첨부된 경우 이 구문을 사용할 수 있습니다.

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

당신의 질문은 말이 아주 서툴러요.당신의 코드는 이미 당신이 원하는 것을 합니다.정확히 무엇에 대해 혼란스러워 하고 있습니까?x.numpy()질문의 원래 제목에 답합니다.

피토치 텐서와 눔피 배열

제목부터 질문을 개선할 필요가 있습니다.

어쨌든 이것이 다른 사람들에게 도움이 될 경우를 대비해서요.코드가 작동하려면 분리를 호출해야 할 수도 있습니다.

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

그래서 콜.detach(). 샘플 코드:

# 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는 detach 후에 갑니다.참조: https://discuss.pytorch.org/t/should-it-really-be-necessary-to-do-var-detach-cpu-numpy/35489/5


또한 그것은 주제에서 벗어난 것이고 그것이 당신의 질문의 초점이 되어서는 안 되기 때문에 저는 슬라이싱에 대해 어떠한 언급도 하지 않을 것입니다.보기:

슬라이스 표기법 이해

언급URL : https://stackoverflow.com/questions/49768306/pytorch-tensor-to-numpy-array

반응형