gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:03:53 25 4
gpt4 key购买 nike

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

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(或某个小数字),并重新计算列表和相关性得分。如果新的相关值高于前一个相关值,我将保存这 2 个矩阵并调整不同的值,直到获得能提供最高相关分数的 2 个矩阵。

PyTorch 能够自动执行此操作吗?我知道 PyTorch 可以根据方程进行调整,但我想要调整矩阵值的方式不是针对方程,而是针对我计算的相关值。非常感谢任何有关这方面的指导!

最佳答案

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_()

学习率基本上就是你执行的步长的大小,学习率太高会导致损失爆炸,学习率太小会导致收敛缓慢,我建议你尝试一下。

编辑:回答对 loss.backward 的评论:对于任何可微函数 f,f 是多个张量 t1, ..., tn 的函数,其中 requires_grad=True 因此,您可以计算每个张量的损失梯度。当您执行loss.backward时,它会计算这些梯度并将其存储在t1.grad,...,tn.grad中。然后使用梯度下降更新t1, ..., tn 以降低 f 的值。此更新不需要计算图,因此这就是您使用与 torch.no_grad() 的原因。在循环结束时,您将梯度归零,因为 .backward 不会覆盖梯度,而是向其中添加新梯度。更多信息请参见:https://discuss.pytorch.org/t/why-do-we-need-to-set-the-gradients-manually-to-zero-in-pytorch/4903

关于python - 使用 PyTorch 根据我从张量计算的数字来调整张量矩阵值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com