Невозможно преобразовать список в массив: ValueError: только тензоры одного элемента могут быть преобразованы в скаляры Python - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время я работаю с платформой PyTorch и пытаюсь понять иностранный код. У меня проблема с индексами, и я хотел напечатать форму списка.
Единственный способ сделать это (насколько мне подсказывает Google) - преобразовать список в массив 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]])]

Есть ли способ получить форму этого списка, не преобразовывая его в пустой массив?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Самый простой способ преобразовать тензор Pytorch в массив numpy:

nparray = tensor.numpy()

Также для размера и формы:

tensor_size = tensor.size()
tensor_shape = tensor.shape()
tensor_size
>>> (1080)
tensor_shape
>>> (32, 3, 128, 128)
0 голосов
/ 29 августа 2018

Кажется, у вас есть список тензоров. Для каждого тензора вы можете увидеть его size() (не нужно конвертировать в list / numpy). Если вы настаиваете, вы можете преобразовать тензор в массив numpy, используя numpy():

Возвращает список тензорных фигур:

>> [t.size() for t in my_list_of_tensors]

Возвращает список пустых массивов:

>> [t.numpy() for t in my_list_of_tensors]

С точки зрения производительности, всегда лучше избегать преобразования тензоров в пустые массивы, поскольку это может привести к синхронизации памяти устройства / хоста. Если вам нужно только проверить shape тензора, используйте функцию size().

...