Как исправить эту ошибку: списочные индексы должны быть целыми или кусочками, а не кортежем - PullRequest
4 голосов
/ 30 октября 2019

Предположим, у меня есть список тензоров, называемый outputs

>> outputs[2][0][0,:,:]
Out[20]: 
tensor([[ 14.0448,  -5.1494,  -0.1780,  ...,  10.1937,  -8.9158,  -5.3964],
        [ 32.0382,  -0.5201,  29.9942,  ..., -18.8268, -23.1068,  23.9745],
        [-24.5911,  14.7233,  -6.3053,  ...,  -5.8131,  -3.3088,   0.5685],
        [  0.8842, -14.8318,   6.7204,  ...,  17.7127,   7.3332,   3.7249],
        [  2.0654, -16.5236,  38.3582,  ..., -23.1663,  -5.1202,  13.6506]],
       grad_fn=<SliceBackward>)


>> outputs[2][1][0,:,:]
Out[24]: 
tensor([[-0.1260,  0.0463, -0.3362,  ...,  0.1089, -0.2454,  0.0140],
        [ 0.5050, -0.0750, -0.1639,  ..., -0.0020, -0.0521, -0.3224],
        [-0.5311,  0.4526,  0.0079,  ..., -0.0654, -0.1255, -0.0012],
        [ 0.0728, -0.1219,  0.0905,  ...,  0.1354,  0.2730, -0.1186],
        [-0.0680, -0.5570,  0.0295,  ..., -0.2411, -0.1690,  0.0331]],
       grad_fn=<SliceBackward>)

Когда я пытаюсь сделать:

>> outputs[2][0:1][0,:,:]

python генерирует ошибку, и сообщение об ошибке равно

TypeError: list indices must be integers or slices, not tuple

Как я могу исправить эту ошибку?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Как вы просили примеры кода, вот они:

import torch

# using small shape to make it printable
outputs_2 = [torch.rand((3,2,1)) for _ in range(2)]

print(outputs_2[0][0,:,:])
# tensor([[0.3294],
#         [0.0031]])

print(outputs_2[1][0,:,:])
# tensor([[0.1910],
#         [0.1547]])

# this is the source of your problem
type(outputs_2[0:1])
# <class 'list'>

Я не знаю, что вы ожидаете в результате. Вот что я думаю (для ясности я собираюсь использовать пример [0:2]):

torch.stack(outputs_2[0:2])[:, 0, :, :]
# tensor([[[0.3294],
#          [0.0031]],
# 
#         [[0.1910],
#          [0.1547]]])

torch.stack(outputs_2[0:2]).shape
# torch.Size([2, 3, 2, 1])
2 голосов
/ 30 октября 2019

outputs[2][0] и outputs[2][1] оба возвращают объект (я полагаю, тензор). outputs[2][0:1] возвращает список этих объектов. Я думаю, что вы ищете что-то вроде outputs[2][0:1][:,0,:,:] или [a[0,:,:] for a in outputs[2][0:1]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...