我使用pytorch创建我的模型,模型的最后需要计算半正定矩阵的行列式(半正定矩阵的所有主子式都为非负),因为pytorch并不提供行列式计算函数(又不能将需要求导的tensor转成numpy),因此我写了一个行列式的计算函数:
def det(m):
if len(m) <= 0:
return None
elif len(m) == 1:
return m[0][0]
else:
s = 0
for i in range(len(m)):
n = [[row[a] for a in range(len(m)) if a != i] for row in m[1:]]
x += m[0][i] * det(n) * (-1) ** (i % 2)
return s
此函数单独执行的时候没有问题,但是我在训练到大约第3,4epoch的时候,他会将一个半正定矩阵的行列式输出为负,如果单独将这个半正定矩阵从错误信息里拿出来单独使用这个函数运行就不会出现负值:
我试验过很多次,当前计算行列式的函数单独运行的时候不会出现错误