スポンサーリンク

【PyTorch】Tensorとndarrayの変換方法について【Numpy】

Numpy

PyTorchのTensor配列と、Numpyのndarray配列の変換方法についてまとめました。
とりあえず直ぐに使いたい方向けのコードは以下

# Numpy > Tensor
a = torch.from_numpy(a).clone()

# Tensor > Numpy
a = a.cpu().detach().numpy().copy()

ndarrayからtensorへの変換

ndarrayからtensorへの変換には、torch.from_numpyを用いる。引数にndarray配列を与えれば、tensor配列を得ることができる。この方法は、ndarray配列とtensor配列でメモリが共有されるため、一方の値を変えると一方の値も変わる。

a = numpy.array([1, 2, 3])

t = torch.from_numpy(a)
print(t)
# tensor([1, 2, 3])

t[0] = -1
print(t)
# tensor([-1,  2,  3])
print(a)
# [-1  2  3]

メモリを共有させない方法(ndarray > tesnor)

ndarray配列とtensor配列のメモリを共有させない場合は、cloneメソッドを使う。

a = numpy.array([1, 2, 3])

t = torch.from_numpy(a).clone()
print(t)
# tensor([1, 2, 3])

t[0] = -1
print(t)
# tensor([-1,  2,  3])
print(a)
# [1 2 3]

tensorからndarrayへの変換

tensorからndarrayへの変換には、numpyメソッドを使う。こちらもメモリが共有される。

t = torch.tensor([1, 2, 3])

a = t.numpy()
print(a)
# [1 2 3]

a[0] = -1
print(a)
# [-1  2  3]
print(t)
# tensor([-1,  2,  3])

メモリを共有させない方法(tensor > ndarray)

tensor配列とndarray配列のメモリを共有させない場合は、copyメソッドを使う。

t = torch.tensor([1, 2, 3])

a = t.numpy().copy()
print(a)
# [1 2 3]

a[0] = -1
print(a)
# [-1  2  3]
print(t)
# tensor([-1,  2,  3])

tensor配列がGPUに置かれている場合

tensor配列がGPUに置かれている場合、ndarrayはGPUを使えないため、エラーが発生する。このため、tensor配列をcpuに移動する必要がある。cpuに移動するにはcpuメソッドを使う。

TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

t = torch.tensor([1, 2, 3]).to('cuda')
print(t)
# tensor([1, 2, 3], device='cuda:0')

a = t.cpu().numpy().copy()
print(a)
# [1 2 3]

tensor配列が勾配計算ONになっている場合(requires_grad=True)

tensor配列がrequires_grad=Trueになっている場合、ndarrayは勾配計算機能を使えないため、エラーが発生する。そのため、detachメソッドを使って勾配計算グラフから切り離す必要がある。

RuntimeError: Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

t = torch.tensor([0.1, 2, 3], requires_grad=True).to('cuda')
print(t)
# tensor([0.1000, 2.0000, 3.0000], device='cuda:0', grad_fn=<ToCopyBackward0>)

a = t.cpu().detach().numpy().copy()
print(a)
# [0.1 2.  3. ]

関連記事、参考記事

コメント