Python 使用torch.optim时torch.mm显示错误的函数

Python 使用torch.optim时torch.mm显示错误的函数,python,pytorch,tensor,gradient-descent,minimization,Python,Pytorch,Tensor,Gradient Descent,Minimization,我是PyTorch的新手。如果这个问题很幼稚,请原谅我。我试图使用PyTorch的optim最小化一个函数。该函数包括矩阵乘法。详情如下 首先我有一个张量: Xv.requires_grad_() XT.requires_grad_() 我的目标职能: def errorFun(x): ax = x[0] ay = x[1] x0 = x[2] y0 = x[3] A = torch.tensor([[ax, 0., x0], [0., ay, y0]

我是PyTorch的新手。如果这个问题很幼稚,请原谅我。我试图使用PyTorch的optim最小化一个函数。该函数包括矩阵乘法。详情如下

首先我有一个张量:

Xv.requires_grad_()
XT.requires_grad_()
我的目标职能:

def errorFun(x):
    ax = x[0]
    ay = x[1]
    x0 = x[2]
    y0 = x[3]

    A = torch.tensor([[ax, 0., x0], [0., ay, y0], [0., 0., 1.]], dtype=torch.float64)
    B = torch.tensor([[b11, b12, b13], [b21, b22, b23], [b31, b32, b33]], dtype=torch.float64)
    H = torch.mm(A, B)
    Ps = torch.mm(H, X)
    px = Ps[0,:]
    py = Ps[1,:]
    PX = torch.stack([px, py], dim=0)
    PX.requires_grad_()
    return mseloss(PX, XT)
我是在说:

for ii in range(n_optim_steps):
    optimizer.zero_grad()
    loss = errorFun(params)

    #print('Step # {}, loss: {}'.format(ii, loss.item()))
    loss.backward()
    # Access gradient if necessary
    grad = params.grad.data
    optimizer.step()
但我得到了这个错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-54-84b874448a25> in <module>()
     77     loss.backward()
     78     # Access gradient if necessary
---> 79     grad = params.grad.data
     80     optimizer.step()
     81 

AttributeError: 'NoneType' object has no attribute 'data'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
77.损失向后()
78#如有必要,通道坡度
--->79梯度=参数梯度数据
80优化器。步骤()
81
AttributeError:“非类型”对象没有属性“数据”

提前谢谢。

我不确定我是否理解您的任务。但是,您似乎没有按照设计的方式使用Pytork

你必须拥有5件东西:

  • 培训数据
  • 你感兴趣的任务
  • 参数化模型(如神经网络)
  • 要最小化的成本函数
  • 优化器 考虑一个简单的例子:

  • 数据:包含随机数的向量
  • 任务:求向量的和
  • 模型:线性回归(即:1层神经网络)
  • 成本函数:均方误差
  • 优化器:随机梯度下降
  • 实施:

    导入火炬
    导入torch.nn作为nn
    来自torch.optim进口新加坡元
    输入大小=5
    模型=nn.线性(输入尺寸,1)
    opt=SGD(model.parameters(),lr=0.01)
    损失函数=nn.MSELoss()
    对于uu范围(100):
    数据=torch.rand(批次大小、输入大小)
    目标=data.sum(dim=1)
    选项0_梯度()
    pred=模型(数据)
    损失=损失函数(预测,目标)
    loss.backward()
    选择步骤()
    
    comment'grad=params.grad.data'并查看它是否有效。您共享的代码不清楚它应该如何工作。你能分享一个最小的可复制的例子吗?谢谢@VictorZuanazzi的回答。我试着对这行代码进行注释,代码可以运行,但参数在优化后保持不变。下面的注释中给出了可复制的代码。我不确定您是否在使用Pytork,因为它应该被使用。我建议您先看一下这些教程: