Pytorch Pytork';s Autograd不支持复杂的矩阵求逆,有人有解决方法吗?

Pytorch Pytork';s Autograd不支持复杂的矩阵求逆,有人有解决方法吗?,pytorch,complex-numbers,matrix-inverse,autograd,Pytorch,Complex Numbers,Matrix Inverse,Autograd,在损失函数的某个地方,我反转了一个大小为64*64的复杂矩阵。尽管torch.tensor支持复矩阵求逆,但由于我得到以下错误,无法在训练循环中计算梯度: RuntimeError:inverse不支持对复杂类型的输出进行自动微分 有人有解决这个问题的方法吗?一个自定义函数而不是torch.inverse可能?您可以使用复矩阵的实值分量自己进行反演 首先是一些线性代数: 复数矩阵C可以写成两个实矩阵a和B(j是-1的sqrt): 求C的逆基本上就是求两个实值矩阵x和y,这样 (A + jB)(x

在损失函数的某个地方,我反转了一个大小为64*64的复杂矩阵。尽管torch.tensor支持复矩阵求逆,但由于我得到以下错误,无法在训练循环中计算梯度:

RuntimeError:inverse不支持对复杂类型的输出进行自动微分


有人有解决这个问题的方法吗?一个自定义函数而不是torch.inverse可能?

您可以使用复矩阵的实值分量自己进行反演

首先是一些线性代数:

复数矩阵
C
可以写成两个实矩阵
a
B
j
是-1的sqrt):

C
的逆基本上就是求两个实值矩阵
x
y
,这样

(A + jB)(x + jy) = I + j0
这归结为求解实值方程组:

既然我们知道了如何将复矩阵求逆简化为实值矩阵求逆,那么我们可以使用pytorch的方法来进行求逆

def复数_逆(C):
A=火炬。真实(C)
B=火炬。图像(C)
#构造方程组的左侧
#旁注:在pytorch 1.7.1中,您可以使用vstack和hstack代替cat
lhs=torch.cat([torch.cat([A,-B],尺寸=1),torch.cat([B,A],尺寸=1)],尺寸=0)
#构造方程组的rhs
rhs=火炬猫([火炬眼(A.形状[0])至(A),火炬零点(A)],尺寸=0)
#解方程组
原始,_u=火炬解算(右、左)
#将解决方案写成单个复杂矩阵
iC=raw[:C.shape[0],:]+1j*raw[C.shape[0]:,:]
返回iC
您可以使用numpy验证解决方案:

C是一个复杂的火炬张量 iC=复逆(C) 使用手电筒。无梯度() 打印(np.isclose(iC.cpu().numpy()@C.cpu().numpy(),np.eye(C.shape[0])).all())
请注意,通过使用块矩阵求逆技巧,您可以减少
求解
操作的计算成本。

谢谢,它似乎起到了作用。
(A + jB)(x + jy) = I + j0