如何将numpy数据预先加载到像io.BytesIO这样的缓冲区中以使其可以搜索?

问题描述 投票:0回答:2

以下函数基本上返回numpy.ndarray

def getimage(id):
     img = self.coco.loadImgs(id)
     I = io.imread(img['coco_url'])
     return I #returns 'numpy.ndarray'     

从main调用getimage函数:

x = load.getimage(id).
x = torch.load(x)

抛出错误:

'numpy.ndarray' object has no attribute 'seek'. You can only torch.load from a file that is seekable. Please pre-load the data into a buffer like io.BytesIO and try to load from it instead.
python numpy pytorch torch bytesio
2个回答
0
投票

正如docs所说,torch.load

从文件加载用torch.save()保存的对象。

要将numpy.ndarray转换为torch.Tensor,您需要使用torch.from_numpy,清楚地记录为

从numpy.ndarray创建一个Tensor。


0
投票

使用torch.as_tensor而不是torch.load,您将不必创建缓冲区。

this questionthis answer

如果你想让pytorch张量成为你的numpy数组的副本,请使用torch.tensor(arr)。如果你想让torch.Tensor共享相同的内存缓冲区,那么使用torch.as_tensor(arr)。如果可以,PyTorch将重用缓冲区。

如果你真的想从你的numpy数组中创建一个缓冲区,请使用io中的BytesIO类并使用arr.tobytes()之类的stream = io.BytesIO(arr.tobytes())进行初始化。但YMMV;我刚试过torch.load和一个流对象,火炬抱怨:

import io

import numpy as np

a = np.array([3, 4, 5])
stream = io.BytesIO(a.tobytes())  # implements seek()
torch.load(stream)

---------------------------------------------------------------------------
UnpicklingError                           Traceback (most recent call last)
...
UnpicklingError: invalid load key, '\x03'.

如果你想让它工作,你可能必须调整numpy正在生成的字节流。祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.