我是PyTorch的新手。我正在编写一个简单的线性回归程序,我想使用不同的方法(SGD,动量,ADAM等)比较结果。我的问题是,我希望每次循环结束时都将模型参数重新初始化为与先前模型开始时相同的值,以便进行比较。
这是我到目前为止所拥有的,这是我的训练数据:
x1=np.arange(0,10,1).reshape(10,1)
y1=2*x1+1+np.random.normal(0,1,(10,1))
x=torch.from_numpy(x1)
y=torch.from_numpy(y1)
我在这里训练数据
from torch.utils.data import TensorDataset,DataLoader
train=TensorDataset(xdata,ydata)
size_batch=10
dl=DataLoader(train,size_batch,shuffle=True)
定义模型并选择
model=nn.Linear(1,1)
opt=torch.optim.SGD(model.parameters(), lr=1e-4)
import torch.nn.functional as F
loss1=F.mse_loss
loss=loss1(model(x),y)
功能
def fitmodel(nepochs, model, loss1, opt):
for epoch in range(nepochs):
for xm,ym in dl:
predict = model(xm)
loss = loss1(predict, ym)
loss.backward()
opt.step()
opt.zero_grad()
调用函数
fitmodel(1000,model,loss1,opt)
现在,我想重新运行以上内容,但要使用不同的优化算法。如果我只是重新运行fitmodel,它将使用它已经计算出的一些参数。我想从与上次运行相同的“初始条件”开始。任何人有任何想法怎么做?
修改 在运行fitmodel之前,我先复制初始偏差和权重
w1=model.weight
b1=model.bias
fitmodel(1000,model,loss1,opt)
model.weight=w1
model.bias=b1
loss=[]
但是我得到这个错误: TypeError:无法将“列表”分配为参数“偏差”(torch.nn.Parameter或无预期值)
答案 0 :(得分:4)
线性层的参数存储在model.weight
和model.bias
中。您需要在训练之前复制这些内容,然后再进行还原。这比您在代码中所做的要复杂得多。下面的例子
# clone and detach so that we have an actual backup copy,
# not merely a reference to the parameters
w1=model.weight.clone().detach()
b1=model.bias.clone().detach()
for i in range(3): # as many experiments as you wish to run
# since we have detached, w1 and b1 are no longer nn.Parameter -
# we have to rewrap them. We keep copying so that the tensors used
# in the computation are separate from the backup copies
model.weight=nn.Parameter(w1.clone())
model.bias=nn.Parameter(b1.clone())
# we reinitialize the optimizer because it looks at model.parameters()
# if not for this line, it would try to optimize the values from
# the previous experiment!
opt=torch.optim.SGD(model.parameters(), lr=1e-4)
fitmodel(1000,model,loss1,opt)