Pytorch: Как получить доступ к тензору (значениям) по тензору (ключам) в словаре python - PullRequest
0 голосов
/ 26 марта 2020

У меня есть словарь с тензорными ключами и тензорными значениями. Я хочу получить доступ к значениям по клавишам.

from torch import tensor
x = {tensor(0): [tensor(1)], tensor(1): [tensor(0)]}
for i in x.keys():
  print(i, x[i]) 

Возвращает:

tensor(0) [tensor(1)]
tensor(1) [tensor(0)]

Но когда я пытаюсь получить доступ к значениям без циклического перебора ключей,

try:
    print(x[tensor(0)])

except:
    print(Exception)
    print(x[0])

Исключение выдает:

 KeyError                                   Traceback (most recent call last)
 <ipython-input-34-746d28dcd450> in <module>()
  6 try:
  ----> 7   print(x[tensor(0)])
  8 

  KeyError: tensor(0)

  During handling of the above exception, another exception occurred:

  KeyError                                  Traceback (most recent call last)
  <ipython-input-34-746d28dcd450> in <module>()
  9 except:
  10   print(Exception)
  ---> 11   print(x[0])
  12 continue

  KeyError: 0

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

В PyTorch хэши тензоров являются функцией их id, а не фактического значения. Поскольку словари Python используют хеши для поиска, поиск завершается неудачно. См. это обсуждение на Github .

In [4]: hash(tensor(0)) == hash(tensor(0))                                      
Out[4]: False

In [5]: hash(tensor(0))                                                         
Out[5]: 4364730928

In [6]: hash(tensor(0))                                                         
Out[6]: 4362187312

In [7]: hash(tensor(0))                                                         
Out[7]: 4364733808

. Чтобы достичь желаемого, вы можете либо использовать простые Python целые числа в качестве ключей, либо использовать объект Embedding в качестве x.

1 голос
/ 26 марта 2020

Здесь есть как минимум три проблемы.

  1. Если x - это словарь tensor ключей, то, конечно, x[0] не будет работать. 0 не является ключом к этому. Следовательно, внутреннее KeyError, которое произошло во время другого исключения.
  2. На самом деле не относится к вашим ошибкам, но print(Exception) почти наверняка не то, что вы хотите. Он печатает объект класса (если это правильный термин) класса Exception. Скорее всего, вы имели в виду
    except Exception as e:
      print(e)
    
    или, точнее, except KeyError (в противном случае он просто перехватит все виды исключений).
  3. Реальная вещь: вы не хотите использовать tensor как ключ в первую очередь. Это изменчивый тип, сравниваемый по ссылке, а не по значению. Каждый вызов tensor(something) создаст новый объект, хэширующий значение, отличное от tensor(something), которое вы указали в качестве ключа.

    Вместо этого используйте действительные целые числа.

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