我正在尝试创建一些自定义参数进行优化,并遇到了这个有用的链接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)
有两个问题:
在Mask类的前向功能中,为什么我需要做self.weight.mul(1),为什么不使用x?
x = model(indata)显然会在5x5矩阵数据和权重之间进行每个元素的乘法,但是如果我们在Mask的前向函数中不使用x的话,这怎么办?
< / li>答案 0 :(得分:0)
您是对的,Mask.forward
完全丢弃了x
。但是,计算损失时,模型的输出“看到” indata
。
您实际要教的模型是拥有mask.weight == indata
。