优化Pytorch中的自定义参数

时间:2019-09-05 15:38:41

标签: pytorch

我正在尝试创建一些自定义参数进行优化,并遇到了这个有用的链接here。但是,对于为什么此代码有效,我有点困惑。

下面是对原始帖子进行一些修改的代码,以清楚地看到优化的行为。

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

class Mask(nn.Module):
    def __init__(self):
        super(Mask, self).__init__()
        self.weight = torch.nn.Parameter(data=torch.Tensor(5, 5), requires_grad=True)

        self.weight.data.uniform_(-1, 1)

    def forward(self, x):
        masked_wt = self.weight.mul(1)
        return masked_wt


class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.mask = Mask()

    def forward(self,x):
        x = self.mask(x)
        return x

model = Model()
indata = torch.ones(5,5)
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)

while True:
    x = model(indata)
    optimizer.zero_grad()
    loss = F.l1_loss(indata,x)
    loss.backward()
    optimizer.step()

    print(model.mask.weight)

有两个问题:

  1. 在Mask类的前向功能中,为什么我需要做self.weight.mul(1),为什么不使用x?

  2. x = model(indata)显然会在5x5矩阵数据和权重之间进行每个元素的乘法,但是如果我们在Mask的前向函数中不使用x的话,这怎么办?

    < / li>

1 个答案:

答案 0 :(得分:0)

您是对的,Mask.forward完全丢弃了x。但是,计算损失时,模型的输出“看到” indata
您实际要教的模型是拥有mask.weight == indata