Я новичок в pytorch и пытаюсь учиться, играя с простыми кодами.У меня есть список нулевой длины, заполненный словарем, где значения в этом словаре являются тензорами.Вот как выглядит этот список:
A = [{'boxes': tensor([[ 142.1232, 142.9373, 1106.0452, 971.3792],
[ 259.1277, 618.4834, 1100.1293, 1028.8989],
[ 232.1346, 692.5888, 763.3408, 1028.6766],
[ 206.8070, 312.2080, 1137.1434, 1013.4373],
[ 495.9471, 675.7287, 978.5932, 1012.7568]], grad_fn=<StackBackward>), 'labels': tensor([16, 1, 1, 1, 1]), 'scores': tensor([0.9988, 0.9489, 0.5228, 0.3500, 0.0639], grad_fn=<IndexBackward>), 'masks': tensor([[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]]], grad_fn=<UnsqueezeBackward0>)}]
Этот список является выводом Mask-RCNN, и я хочу удалить определенный элемент из всех тензоров во вложенном словаре.В этом случае я хочу только сохранить информацию, связанную с меткой класса «1».Информация, относящаяся к каждому классу («блоки», «метки», «оценки» и «маски»), находится в одном и том же месте (ах) (индексе) в каждом из тензоров.Итак, я нахожу индекс всех «1» в тензоре с ключевыми «метками»:
idxOfClass = [i for i, x in enumerate(list(pred[0]['labels'])) if x == 1]
, что дает мне: [1, 2, 3, 4] ,Затем я хочу сохранить все значения, расположенные по индексам в idxOfClass во всех тензорах во вложенном словаре.Если я сделаю что-то вроде этого:
Anew = [{pred[0]['boxes'][idxOfClass],pred[0]['labels'][idxOfClass],pred[0]['masks'][idxOfClass],pred[0]['scores'][idxOfClass]}]
Я получу:
[{tensor([[ 259.1277, 618.4834, 1100.1293, 1028.8989],
[ 232.1346, 692.5888, 763.3408, 1028.6766],
[ 206.8070, 312.2080, 1137.1434, 1013.4373],
[ 495.9471, 675.7287, 978.5932, 1012.7568]], grad_fn=
<IndexBackward>), tensor([0.9489, 0.5228, 0.3500, 0.0639],
grad_fn=
<IndexBackward>), tensor([[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]],
[[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]]], grad_fn=<IndexBackward>),
tensor([1, 1, 1, 1])}]
Но это не список словарей с тензорами в качестве значений словаря.Это список тензоров, без структуры ключ-значение вложенного словаря.Мой вопрос таков: «Есть ли способ сохранить исходную структуру списка, когда я удаляю определенные элементы всех тензоров, используя индексы конкретных элементов?».