pytorch: как применить функцию ко всем ячейкам 4-d тензора

#python #numpy #tensorflow #matrix #pytorch

#python #numpy #tensorflow #матрица #pytorch

Вопрос:

Я пытаюсь применить функцию к 4-мерному тензору (я думаю об этом как о 2-мерной матрице с 2-мерной матрицей в каждой ячейке) со следующими размерами: [N x N x N x N] . Функция apply возвращает тензор [1 x N], поэтому после функции apply я ожидаю тензор следующих размеров: [N x N x 1 x N] .

Пример: давайте определим тензор [4 x 4 x 4 x 4]:

 tensor_4d = torch.tensor([[[[1., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[1., 0., 0., 0.],
  [1., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[1., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[1., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]]],
[[[0., 0., 0., 0.],
  [0., 1., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 1., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 1., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 1., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.]]],
[[[0., 0., 1., 0.],
  [0., 0., 0., 0.],
  [0., 0., 1., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 0., 1., 0.],
  [0., 0., 1., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 1., 0.],
  [0., 0., 0., 0.]],
 [[0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 1., 0.],
  [0., 0., 0., 0.]]],
[[[0., 0., 1., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 1.],
  [0., 0., 0., 1.]],
 [[0., 0., 0., 0.],
  [0., 0., 1., 0.],
  [0., 0., 0., 1.],
  [0., 0., 0., 1.]],
 [[0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 1.],
  [0., 0., 0., 1.]],
 [[0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 0.],
  [0., 0., 0., 1.]]]], dtype=torch.float64)
 

давайте посмотрим на tensor_4d в [3][0]:

 tensor_4d[3][0]
tensor([[0., 0., 1., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 1.],
        [0., 0., 0., 1.]], dtype=torch.float64)
 

это моя функция apply :

 def apply_function(tensor_2d):
    eigenvalues, eigenvectors = torch.eig(input=tensor_2d, eigenvectors=True)
    return eigenvector[:, 2]
 

и это результат применения функции:

 apply_function(tensor_4d[3][0])
tensor([-1.0000e 00,  0.0000e 00, 4.0083e-292,  0.0000e 00],
       dtype=torch.float64)
 

таким образом, apply_function работает для каждой ячейки.
Далее я пытаюсь использовать apply_function со всей матрицей и ожидаю, что каждая ячейка будет содержать результат активации ‘apply_function’ для этой ячейки. но при использовании функции apply я получаю следующую ошибку:

 apply_function(tensor_4d)

Traceback (most recent call last):
  File "C:Program FilesJetBrainsPyCharm Community Edition 2019.2.3helperspydev_pydevd_bundlepydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
  File "C:/Users/LiavB/PycharmProjects/RBC/Components/RBC_torch.py", line 41, in apply_function
    eigenvalues, eigenvectors = torch.eig(input=tensor_2d, eigenvectors=True)
RuntimeError: invalid argument 1: A should be 2 dimensional at ..atensrcTH/generic/THTensorLapack.cpp:206
 

Ответ №1:

Давайте попробуем:

 new_shape=(-1,) tensor_4d.shape[2:]

out = (torch.stack([apply_function(t) for t in tensor_4d.view(new_shape)], axis=-1)
      .reshape(new_shape)
)