Python 使用PyTorch根据我从张量计算的数字调整张量矩阵值?

Python 使用PyTorch根据我从张量计算的数字调整张量矩阵值?,python,machine-learning,pytorch,tensor,autograd,Python,Machine Learning,Pytorch,Tensor,Autograd,我已经初始化了两个张量(矩阵): sm=Var(torch.randn(20,1),requires_grad=True) sm = torch.mm(sm,sm.t()) freq_m=Var(torch.randn(12,20),requires_grad=True) 我从这两个矩阵中的数据创建了两个列表,并使用spearmanr获得这两个列表之间的相关值。如何创建列表并不重要,但目标是调整矩阵中的值,以便计算出的相关性值尽可能接近1 如果我手动解决这个问题,我会每次将矩阵中的值调整0.

我已经初始化了两个张量(矩阵):

sm=Var(torch.randn(20,1),requires_grad=True)
sm = torch.mm(sm,sm.t()) 
freq_m=Var(torch.randn(12,20),requires_grad=True)
我从这两个矩阵中的数据创建了两个列表,并使用spearmanr获得这两个列表之间的相关值。如何创建列表并不重要,但目标是调整矩阵中的值,以便计算出的相关性值尽可能接近1

如果我手动解决这个问题,我会每次将矩阵中的值调整0.01(或一些小数字),然后重新计算列表和相关分数。如果新的相关性值高于前一个,我会保存这两个矩阵并调整不同的值,直到得到可能给我最高相关性分数的两个矩阵


PyTorch是否能够自动执行此操作?我知道Pytork可以根据一个方程进行调整,但我想调整矩阵值的方法不是针对一个方程,而是针对我计算的相关值。非常感谢您的指导

Pytorch有一个autograd包,这意味着如果你有变量,你通过可微函数传递它们,得到一个标量结果,你可以执行梯度下降来更新变量,以降低或增加标量结果

所以你需要做的是定义一个函数f,它在张量水平上工作,这样f(sm,freq_m)会给你想要的相关性

然后,您应该做如下操作:

lr = 1e-3
for i in range(100):
  # 100 updates
  loss = 1 - f(sm, freq_m)
  print(loss)
  loss.backward()
  with torch.no_grad():
    sm -= lr * sm.grad
    freq_m -= lr * freq_m.grad
    # Manually zero the gradients after updating weights
    sm.grad.zero_()
    freq_m.grad.zero_()
学习速度基本上是你所做的步骤的大小,学习速度太高会导致损失爆炸,学习速度太小会导致收敛缓慢,我建议你进行实验

编辑:回答关于损失的评论。向后:对于任何可微函数f,f是多个张量的函数
t1,…,tn
要求_grad=True
,因此,您可以计算损失相对于每个张量的梯度。当您执行
loss.backward
时,它会计算这些梯度并将其存储在t1.grad,…,tn.grad中。然后使用梯度下降法更新
t1,…,tn
,以降低f的值。此更新不需要计算图,所以这就是为什么您将
与torch.no_grad()
一起使用的原因。
在循环结束时,将渐变归零,因为
.backward
不会覆盖渐变,而是将新渐变添加到渐变中。更多信息请点击此处:

非常感谢您!你不知道这对我有多大帮助!不客气:)如果答案对你有帮助,别忘了投赞成票。