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
不会覆盖渐变,而是将新渐变添加到渐变中。更多信息请点击此处:非常感谢您!你不知道这对我有多大帮助!不客气:)如果答案对你有帮助,别忘了投赞成票。