加速神经网络训练 优化器 optimizer

神经网路越复杂,数据量越大,训练网络所需要的时间就越多。有时候为了解决复杂的问题,复杂的网络跟庞大的数据是不可缺少的。所以寻找了一些方法,加速神经网络的训练。

1.SGD(Stochastic Gradient Descent)随机梯度下降法

这种方法是将数据分成一小批一小批的进行训练。但是速度比较慢。

更新参数的方式 w+=-lr * dx   lr是学习率,dx 是校正值

2.Momentum

更新参数的方式 m=b1*m-lr*dx    w+=m

3.AdaGrad

更新参数的方法 v+=dx^2   w+= -lr *dx/根号V   采用改变学习率的方式

4.RMSProp

这种方法是将 Momentum与AdaGrad部分相结合

v=b1*v=(1-b1)*dx^2

w+=-lr*dx/根号V

5.Adam

这种方法是将momentum与AdaGrad 相结合

m=b1*m+(1-b1)*dx

v=b2*v+(1-b2)*dx^2

w+=-lr*m/根号v

 

小demo:

import torch
import matplotlib.pyplot as plt
from torch.autograd import Variable
import  torch.nn.functional as F
import torch.utils.data as Data
import os
os.environ["CUDA_VISIBLE_DEVICES"]='2'
#hyper parameters 设置一些超参数
LR=0.1
BATCH_SIZE=32
EPOCH=12

x=torch.unsqueeze(torch.linspace(-1,1,1000),dim=1)
y=x.pow(2)+0.1*torch.randn(x.size())
# plt.scatter(x.numpy(),y.numpy())
# plt.show()

torch_dataset=Data.TensorDataset(x,y)
loader=Data.DataLoader(
    dataset=torch_dataset,
    batch_size=BATCH_SIZE,
    shuffle=True,
    num_workers=2,

)

class Net(torch.nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.hidden=torch.nn.Linear(1,20)
        self.predict=torch.nn.Linear(20,1)

    def forward(self, x):
        x=F.relu(self.hidden(x))
        x=self.predict(x)
        return x
SGD_net=Net()
Mtm_net=Net()
Rmp_net=Net()
Adm_net=Net()
nets=[SGD_net,Mtm_net,Rmp_net,Adm_net]

SGD_opt=torch.optim.SGD(SGD_net.parameters(),lr=LR)
Mtm_opt=torch.optim.SGD(Mtm_net.parameters(),lr=LR,momentum=0.8)
Rmp_opt=torch.optim.RMSprop(Rmp_net.parameters(),lr=LR,alpha=0.9)
Adm_opt=torch.optim.Adam(Adm_net.parameters(),lr=LR,betas=(0.9,.99))
optimizers=[SGD_opt,Mtm_opt,Rmp_opt,Adm_opt]
loss_func=torch.nn.MSELoss()
losses_his=[[],[],[],[]]

for epoch in range(EPOCH):
    # print  epoch
    for step,(b_x,b_y) in enumerate(loader):
        b_x=Variable(b_x)
        b_y=Variable(b_y)
        for net,optimizer,l_his in zip(nets,optimizers,losses_his):
            output=net(b_x)
            loss=loss_func(output,b_y)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            l_his.append(loss.data.numpy())
labels=['SGD','Momentum','RMSProp','Adam']

for i,l_his in enumerate(losses_his):
    plt.plot(l_his,label=labels[i])
plt.legend('best')

plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim(0,0.2)
plt.show()

加油,当你看到我的博客的时候,相信你一定在努力成为最好的自己的路上!

加油,别放弃,坚持,每天一点点,相信一年后的你一定会感谢现在的你!

如果你真的迷茫了,我愿当你的倾听者,但是你千万不能放弃,因为改变命运的机会真的不多呀!

QQ小号:1817780086   

你可能感兴趣的:(神经网络——小白)