pytorch - 如何在 pytorch 中处理运行时错误时矢量化矩阵求逆
问题描述
我需要在 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.
对于这种情况,我有一种备用技术。但是,我无法弄清楚哪些矩阵会引发错误。目前,我已将代码替换为非矢量化版本,但它已成为瓶颈。
有没有办法在不放弃矢量化的情况下处理这个问题?
解决方案
我能想到的最好方法是首先计算每个矩阵的行列式,然后计算具有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.
. 这允许您保持反演矢量化。
推荐阅读
- pdf - 如何检测或隐藏对 .pdf 文档的修改?
- r - 如何将文本文件中的数据转换为数据框?
- sql - Amazon S3 Select From 不工作
- jquery - jquery ui对话框中的基础日期选择器在Internet Explorer中不起作用
- vue.js - Vue-CLI v3 自以为是的项目结构
- postgresql - 有没有办法使用 order by 将相似的字段排序在一起?
- reactjs - React Flow:无法解析模块 react-native
- angular5 - windowClass 属性或 NgbModalOptions 实际上有什么作用吗?
- html - 搜索导致重绘和性能不佳的滚动原因
- excel - 当在一行中找到 x 时,显示列名