【问题标题】:ValueError: only one element tensors can be converted to Python scalars while converting list to numpy arrayValueError:在将列表转换为numpy数组时,只能将一个元素张量转换为Python标量
【发布时间】:2021-01-31 13:47:12
【问题描述】:

我有一个图像数据集,我正在使用 PIL 和 Torch 张量在循环中将它们转换为张量并将它们存储在一个列表中。

def preprocess(string):
    return torch.FloatTensor(np.ascontiguousarray(np.array((PIL.Image.open(string)).convert('RGB'))[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) * (1.0 / 255.0)))

import os
folder_name = 'folder name and path'
train1 = []
for item in folder_name:
    x = preprocess(item)
    train1.append(x)

现在在训练之前,我想使用以下方法将列表转换为 np.array:

train1 = np.array(train1)

这显示了错误:

ValueError: only one element tensors can be converted to Python scalars

我还打印了列表 train1 的组成部分的形状和类型,发现它们是预期的张量。

谁能帮帮我?

【问题讨论】:

    标签: python numpy pytorch tensor


    【解决方案1】:

    从 FloatTensors 转换为 numpy 数组的方式应该是:

    train1.append(x.numpy())
    

    【讨论】:

    • 我不会像这样丢失张量吗?
    • 将张量转换为 numpy 数组不是您的重点吗?也许我误解了这个问题。
    • 是的。所以我现在只是改变了这样的代码: def preprocess(string): return (np.ascontiguousarray(np.array((PIL.Image.open(string)).convert('RGB'))[:, :, : :-1].transpose(2, 0, 1).astype(np.float32) * (1.0 / 255.0)))
    【解决方案2】:

    我认为错误可能是由于np.arraylist 作为参数处理的方式。引擎盖下的某些东西与 pytorch 张量不兼容。

    您可以改为先堆叠张量并在其上调用.numpy() 方法。

    train1 = torch.stack(train1, dim=0).numpy()
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2019-02-04
      • 2020-11-08
      • 2021-03-04
      • 2022-01-19
      • 2021-10-17
      • 2018-11-28
      • 2021-03-16
      • 2021-02-02
      相关资源
      最近更新 更多