从哪里开始创建使用PyTorch在Tensor中保存所需更改的方法?

时间:2019-08-15 22:30:24

标签: python machine-learning neural-network pytorch autograd

我有两个张量用于计算Spearmans等级相关性,并且我希望PyTorch能够自动调整这些张量中的值,从而尽可能提高我的Spearmans等级相关性数。

我已经研究过autograd,但没有发现足够简单的解释。

张量初始化: a=Var(torch.randn(20,1),requires_grad=True) psfm_s=Var(torch.randn(12,20),requires_grad=True)

我如何让这两个张量中的值不断调整循环,以使我在使用PyTorch时从这2个张量制成的2个列表中获得最高的Spearmans等级相关性?我只需要去哪里的指南。谢谢!

1 个答案:

答案 0 :(得分:0)

我对Spearman的排名相关性并不熟悉,但是如果我理解您的问题,您正在询问如何使用PyTorch解决深度网络以外的问题?

如果是这种情况,那么我将提供一个简单的最小二乘示例,我认为这对您的工作很有帮助。

请考虑一组200个10维矢量测量值,分别是 x y 。假设我们要找到从 x y 的线性变换。

最小二乘方法指示我们可以通过找到将|( y -( M 和向量 b 来完成此操作> M x + b ))²|

以下示例代码生成一些示例数据,然后使用pytorch进行此最小化。我相信这些评论足以帮助您了解此处发生的情况。

import torch
from torch.nn.parameter import Parameter
from torch import optim

# define some fake data
M_true = torch.randn(10, 10)
b_true = torch.randn(10, 1)

x = torch.randn(200, 10, 1)
noise = torch.matmul(M_true, 0.05 * torch.randn(200, 10, 1))
y = torch.matmul(M_true, x) + b_true + noise

# begin optimization

# define the parameters we want to optimize (using random starting values in this case)
M = Parameter(torch.randn(10, 10))
b = Parameter(torch.randn(10, 1))

# define the optimizer and provide the parameters we want to optimize
optimizer = optim.SGD((M, b), lr=0.1)

for i in range(500):
    # compute loss that we want to minimize
    y_hat = torch.matmul(M, x) + b
    loss = torch.mean((y - y_hat)**2)

    # zero the gradients of the parameters referenced by the optimizer (M and b)
    optimizer.zero_grad()

    # compute new gradients
    loss.backward()

    # update parameters M and b
    optimizer.step()

    if (i + 1) % 100 == 0:
        # scale learning rate by factor of 0.9 every 100 steps
        optimizer.param_groups[0]['lr'] *= 0.9

        print('step', i + 1, 'mse:', loss.item())

# final parameter values (data contains a torch.tensor)
print('Resulting parameters:')
print(M.data)
print(b.data)

print('Compare to the "real" values')
print(M_true)
print(b_true)

当然,这个问题有一个简单的封闭式解决方案,但是这种数值方法只是演示如何使用PyTorch的autograd解决不一定与神经网络有关的问题。我还选择在此处显式定义矩阵M和向量b,而不是使用等效的nn.Linear层,因为我认为这只会使事情变得混乱。

在您的情况下,您想最大化某些内容,因此请确保在回调之前取消目标函数的作用。