Как векторизовать инверсию матрицы при обработке ошибки времени выполнения в pytorch - PullRequest
0 голосов
/ 04 мая 2020

Мне нужно инвертировать некоторые матрицы в pytorch. Однако некоторые матрицы не являются обратимыми, что приводит к ошибке времени выполнения кода:

matrices = torch.randn([5,3,3])
matrices[[2,3]] = torch.zeros([3,3])
inverses = torch.inverse(matrices)

RuntimeError: inverse_cpu: For batch 2: U(1,1) is zero, singular U.

У меня есть запасной метод для таких ситуаций. Однако я не могу понять, какая из матриц выдает ошибку. В настоящее время я заменил код на не векторизованную версию, но это стало узким местом.

Есть ли способ справиться с этим, не отказываясь от векторизации?

1 Ответ

0 голосов
/ 04 мая 2020

Лучший способ, который я могу придумать, - это сначала вычислить определитель каждой матрицы, а затем вычислить обратные значения для тех, которые имеют abs(det)>0.

matrices = torch.randn([5,3,3])
matrices[[2,3]] = torch.zeros([3,3])
determinants = torch.det(matrices)
inverses = torch.inverse(matrices[determinants.abs()>0.])

. Вам придется обработать удаление особые матрицы, но это не должно быть слишком сложно, так как у вас есть значения индекса этих матриц от determinants.abs()==0.. Это позволяет сохранить векторизацию инверсии.

...