无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量
Posted
技术标签:
【中文标题】无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量【英文标题】:Cannot convert list to array: ValueError: only one element tensors can be converted to Python scalars 【发布时间】:2019-02-04 01:09:48 【问题描述】:我目前正在使用 PyTorch 框架并试图理解外国代码。我遇到了索引问题,想打印列表的形状。 这样做的唯一方法(据谷歌告诉我)是将列表转换为 numpy 数组,然后使用 numpy.ndarray.shape() 获取形状。
但尝试将我的列表转换为数组时,我得到了ValueError: only one element tensors can be converted to Python scalars
。
我的列表是一个转换后的 PyTorch 张量 (list(pytorchTensor)
),看起来有点像这样:
[张量([[-0.2781, -0.2567, -0.2353, ..., -0.9640, -0.9855, -1.0069], [-0.2781, -0.2567, -0.2353, ..., -1.0069, -1.0283, -1.0927], [-0.2567, -0.2567, -0.2138, ..., -1.0712, -1.1141, -1.1784], ..., [-0.6640, -0.6425, -0.6211, ..., -1.0712, -1.1141, -1.0927], [-0.6640, -0.6425, -0.5997, ..., -0.9426, -0.9640, -0.9640], [-0.6640, -0.6425, -0.5997, ..., -0.9640, -0.9426, -0.9426]]), 张量([[-0.0769, -0.0980, -0.076 9, ..., -0.9388, -0.9598, -0.9808], [-0.0559, -0.0769, -0.0980, ..., -0.9598, -1.0018, -1.0228], [-0.0559, -0.0769, -0.0769, ..., -1.0228, -1.0439, -1.0859], ..., [-0.4973, -0.4973, -0.4973, ..., -1.0018, -1.0439, -1.0228], [-0.4973, -0.4973, -0.4973, ..., -0.8757, -0.9177, -0.9177], [-0.4973, -0.4973, -0.4973, ..., -0.9177, -0.8967, -0.8967]]), 张量([[-0.1313, -0.1313, -0.110 0, ..., -0.8115, -0.8328, -0.8753], [-0.1313, -0.1525, -0.1313, ..., -0.8541, -0.8966, -0.9391], [-0.1100, -0.1313, -0.1100, ..., -0.9391, -0.9816, -1.0666], ..., [-0.4502, -0.4714, -0.4502, ..., -0.8966, -0.8966, -0.8966], [-0.4502, -0.4714, -0.4502, ..., -0.8115, -0.8115, -0.7903], [-0.4502, -0.4714, -0.4502, ..., -0.8115, -0.7690, -0.7690]])]
有没有办法在不将其转换为 numpy 数组的情况下获取该列表的形状?
【问题讨论】:
不确定你是否有同样的问题,但我试图将一个嵌套的火炬张量列表转换为一个更大的张量,通过为最终张量提供更多索引/维度来尊重嵌套。我发现逐渐增加火炬张量列表,然后增加到torch.stack
它有帮助。我写了一个非递归示例,但我认为扩展它应该很容易。希望对您有所帮助:***.com/questions/54307225/…
@CharlieParker 我试图做同样的事情。它应该工作。但它没有!
【参考方案1】:
一个真实的例子,需要处理torch no grad issue:
with torch.no_grad():
probs = [t.numpy() for t in my_tensors]
或
probs = [t.detach().numpy() for t in my_tensors]
【讨论】:
【参考方案2】:将pytorch张量转换为numpy数组的最简单方法是:
nparray = tensor.numpy()
另外,对于尺寸和形状:
tensor_size = tensor.size()
tensor_shape = tensor.shape()
tensor_size
>>> (1080)
tensor_shape
>>> (32, 3, 128, 128)
【讨论】:
【参考方案3】:您似乎有一个张量列表。对于每个张量,您可以看到它的 size()
(无需转换为 list/numpy)。如果您坚持,您可以使用 numpy()
将张量转换为 numpy 数组:
返回张量形状列表:
>> [t.size() for t in my_list_of_tensors]
返回一个 numpy 数组列表:
>> [t.numpy() for t in my_list_of_tensors]
在性能方面,最好避免将张量转换为 numpy 数组,因为它可能会导致设备/主机内存同步。如果只需要检查张量的shape
,请使用size()
函数。
【讨论】:
以上是关于无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型列表)
Tensorflow - ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)
ValueError:无法使用 dtype='numeric' 将字节/字符串数组转换为十进制数
自己的数据集:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)
尝试连接 keras 模型:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)
无法将列表转换为数据框。不断收到错误“ValueError: Must pass 2-d input.shape=(1, 4, 5)”