pytorch,在培训期间改变学习率

pytorch,在培训期间改变学习率,pytorch,Pytorch,这是原始代码1。 为了在培训期间改变学习率,我尝试将“opt”的位置移动为 x=np.linspace(0,20,100) g=1+0.2*np.exp(-0.1*(x-7)**2) y=np.sin(g*x) plt.plot(x,y) plt.show() x=torch.from_numpy(x) y=torch.from_numpy(y) x=x.reshape((100,1)) y=y.reshape((100,1)) MM=nn.Sequential() MM.a

这是原始代码1。 为了在培训期间改变学习率,我尝试将“opt”的位置移动为


x=np.linspace(0,20,100)


g=1+0.2*np.exp(-0.1*(x-7)**2)
y=np.sin(g*x)

plt.plot(x,y)

plt.show()


x=torch.from_numpy(x)

y=torch.from_numpy(y)

x=x.reshape((100,1))
y=y.reshape((100,1))

MM=nn.Sequential()
MM.add_module('L1',nn.Linear(1,128))
MM.add_module('R1',nn.ReLU())
MM.add_module('L2',nn.Linear(128,128))
MM.add_module('R2',nn.ReLU())
MM.add_module('L3',nn.Linear(128,128))
MM.add_module('R3',nn.ReLU())
MM.add_module('L4',nn.Linear(128,128))
MM.add_module('R5',nn.ReLU())
MM.add_module('L5',nn.Linear(128,1))
MM.double()
L=nn.MSELoss()

lr=3e-05           ######
opt=torch.optim.Adam(MM.parameters(),lr)     #########
Epo=[]
COST=[]

for epoch in range(8000):

  opt.zero_grad()
  err=L(torch.sin(MM(x)),y)
  Epo.append(epoch)
  COST.append(err)
  err.backward()
  if epoch%100==0:
    print(err)
  opt.step()


Epo=np.array(Epo)/1000.
COST=np.array(COST)
pred=torch.sin(MM(x)).detach().numpy()
Trans=MM(x).detach().numpy()
x=x.reshape((100))
pred=pred.reshape((100))
Trans=Trans.reshape((100))

fig = plt.figure(figsize=(10,10))
#ax = fig.gca(projection='3d')
ax = fig.add_subplot(2,2,1)
surf = ax.plot(x,y,'r')
    
    #ax.plot_surface(x_dat,y_dat,z_pred)
    #ax.plot_wireframe(x_dat,y_dat,z_pred,linewidth=0.1)
fig.tight_layout()
    #plt.show()
ax = fig.add_subplot(2,2,2)
surf = ax.plot(x,pred,'g')
fig.tight_layout()

ax = fig.add_subplot(2,2,3)
surff=ax.plot(Epo,COST,'y+')
plt.ylim(0,1100)

ax = fig.add_subplot(2,2,4)
surf = ax.plot(x,Trans,'b')
fig.tight_layout()

plt.show()
这是代码2。 代码2也可以运行,但结果与代码1大不相同


在训练过程中改变学习率的区别是什么(比如lr=(1-epoch/10000*0.99),我该怎么办?

您不应该将优化器定义移动到训练循环中,因为优化器会保留许多与训练历史相关的其他信息,例如,在Adam的情况下,优化器的内部机制中会动态存储和更新梯度的运行平均值,。。。 因此,在每次迭代中实例化一个新的优化器会使您失去这个历史轨迹

为了动态更新学习速率,pytorch中提出了许多调度程序类(指数衰减、周期衰减、余弦退火等)。您可以从文档中查看完整的调度程序列表,或者根据需要实现自己的调度程序:

文档中的示例:要通过每10个历元乘以0.5来衰减学习率,可以使用
StepLR
调度程序,如下所示:

opt=torch.optm.Adam(MM.parameters(),lr)
调度器=torch.optim.lr\u调度器.StepLR(opt,step\u size=10,gamma=0.5)
在原始代码1中,您可以执行以下操作:

适用于范围(8000)内的历元:
选项0_梯度()
err=L(火炬sin(毫米(x)),y)
Epo.append(历元)
成本。追加(错误)
err.backward()
如果历元%100==0:
打印(错误)
选择步骤()
scheduler.step()
正如我所说,您有许多其他类型的lr调度器,因此您可以从文档中选择或实现自己的

Epo=[]
COST=[]

for epoch in range(8000):
  lr=3e-05           ######
  opt=torch.optim.Adam(MM.parameters(),lr)     #########
  opt.zero_grad()
  err=L(torch.sin(MM(x)),y)
  Epo.append(epoch)
  COST.append(err)
  err.backward()
  if epoch%100==0:
    print(err)
  opt.step()