我有一个火炬张量
List<ChildClass>
如何在numpy中获取它?
类似
IEnumerable<Baseclass>
输出应该和我做的一样
Baseclass
答案 0 :(得分:3)
您可以尝试以下方式
1. torch.Tensor().numpy()
2. torch.Tensor().cpu().data.numpy()
3. torch.Tensor().cpu().detach().numpy()
答案 1 :(得分:2)
从http://www.richardvanbergen.com/复制:
a = torch.ones(5)
print(a)
张量([1.,1.,1.,1.,1。])
b = a.numpy()
print(b)
[1。 1. 1. 1. 1。]
答案 2 :(得分:2)
您可能会发现以下两个功能很有用。
答案 3 :(得分:1)
这是fastai core中的函数:
def to_np(x):
"Convert a tensor to a numpy array."
return apply(lambda o: o.data.cpu().numpy(), x)
可能使用预期的PyTorch库中的函数是一个不错的选择。
如果您在PyTorch Transformers内查看,您会发现以下code:
preds = logits.detach().cpu().numpy()
所以您可能会问为什么需要detach()
方法?当我们想将张量与AD计算图分开时需要。
仍然请注意,CPU张量和numpy数组已连接。它们共享相同的存储空间:
import torch
tensor = torch.zeros(2)
numpy_array = tensor.numpy()
print('Before edit:')
print(tensor)
print(numpy_array)
tensor[0] = 10
print()
print('After edit:')
print('Tensor:', tensor)
print('Numpy array:', numpy_array)
输出:
Before edit:
tensor([0., 0.])
[0. 0.]
After edit:
Tensor: tensor([10., 0.])
Numpy array: [10. 0.]
第一个元素的值由张量和numpy数组共享。将其张量更改为10时,也会在numpy数组中更改它。
这就是为什么我们需要小心,因为更改numpy数组也要更改CPU张量。
答案 4 :(得分:0)
另一种有用的方法:
a = torch(0.1, device: cuda)
a.cpu().data.numpy()
Answer: array(0.1, dtype=float32)
答案 5 :(得分:0)
有时,如果存在“已应用”的渐变,则必须首先将.detach()
函数放在.numpy()
函数之前。
loss = loss_fn(preds, labels)
print(loss.detach().numpy())