Как предварительно загрузить пустые данные в буфер типа io.BytesIO, чтобы сделать его доступным для поиска? - PullRequest
0 голосов
/ 06 января 2019

Следующая функция в основном возвращает numpy.ndarray

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

Функция getimage , вызываемая из main:

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.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Используйте torch.as_tensor вместо torch.load, и вам не нужно будет создавать буфер.

См. этот вопрос и этот ответ .

Если вы хотите, чтобы тензор pytorch был копией вашего массива, используйте torch.tensor(arr). Если вы хотите, чтобы torch.Tensor разделял тот же буфер памяти, используйте torch.as_tensor(arr). Затем PyTorch будет повторно использовать буфер, если сможет.

Если вы действительно хотите создать буфер из массива numpy, используйте класс BytesIO из io и инициализируйте его с 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. Удачи.

0 голосов
/ 06 января 2019

Как говорят документы , torch.load

Загружает объект, сохраненный с помощью torch.save () из файла .

Для преобразования numpy.ndarray в torch.Tensor вы хотите использовать torch.from_numpy, четко задокументированный как

Создает Тензор из numpy.ndarray.

...