Task6.PyTorch理解更多神经网络优化方法

1.了解不同优化器

2.书写优化器代码
3.Momentum
4.二维优化,随机梯度下降法进行优化实现
5.Ada自适应梯度调节法
6.RMSProp
7.Adam
8.PyTorch种优化器选择

梯度下降法:

1.标准梯度下降法:GD
每个样本都下降一次,参考当前位置的最陡方向迈进容易得到局部最优,且训练速度慢

2.批量下降法:BGD
不再是一次输入样本调整一次,而是一批量数据后进行调整,模型参数的调整更新与全部输入样本的代价函数的和有关,即下山前掌握附近地势,选择最优方向。

3.随机梯度下降法SGD
在一批数据里随机选取一个样本。如盲人下山,并与用走一次计算一次梯度,总能到山底。但引入的噪声可能使得权值更新放下错误。,没法单独克服局部最优解。

动量优化法
标准动量优化momentum
当前权值的改变会受到上一次权值改变得影响。类似小球下滚得时候带上惯性,加快滚动速度。

NAG牛顿加速梯度

NAG牛顿加速梯度 施加当前速度后 ,往标准动量中添加一个校正因子。momentun小球盲目跟从梯度,但nag小球指走到坡底时速度慢下来,知道下一位置大致在哪,来更新当前位置参数。

Ada自适应梯度调节法: Adagrad:该算法的特点是自动调整学习率,适用于稀疏数据。梯度下降法在每一步对每一个参数使用相同的学习率,这种一刀切的做法不能有效的利用每一个数据集自身的特点。 Adadelta(Adagrad的改进算法):Adagrad的一个问题在于随着训练的进行,学习率快速单调衰减。Adadelta则使用梯度平方的移动平均来取代全部历史平方和。

RMSProp:RMSprop也是一种学习率调整的算法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。

Adam:如果把Adadelta里面梯度的平方和看成是梯度的二阶矩,那么梯度本身的求和就是一阶矩。Adam算法在Adadelta的二次矩基础之上又引入了一阶矩。而一阶矩,其实就类似于动量法里面的动量。

 1 import torch
 2 import torch.utils.data as Data
 3 import torch.nn.functional as F
 4 import matplotlib.pyplot as plt
 5
 6 LR = 0.01
 7 BATCH_SIZE = 32
 8 EPOCH = 12
 9
10 x = torch.unsqueeze(torch.linspace(-1,1,1000),dim=1)
11 y = x.pow(2) + 0.1*torch.normal(torch.zeros(*x.size()))
12
13 plt.scatter(x.numpy(),y.numpy())
14 plt.show()
15
16 torch_dataset = Data.TensorDataset(x,y)
17 loader = Data.DataLoader(dataset=torch_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=2)
18
19 torch_dataset = Data.TensorDataset(x,y)
20 loader = Data.DataLoader(
21     dataset=torch_dataset,
22     batch_size=BATCH_SIZE,
23     shuffle=True,
24     num_workers=2,
25 )
26
27 class Net(torch.nn.Module):
28     def __init__(self):
29         super(Net,self).__init__()
30
31         self.hidden = torch.nn.Linear(1,20)
32         self.predict = torch.nn.Linear(20,1)
33
34     def forward(self,x):
35         x = F.relu(self.hidden(x))
36         x = self.predict(x)
37         return x
38
39 net_SGD         = Net()
40 net_Momentum    = Net()
41 net_RMSprop     = Net()
42 net_Adam        = Net()
43 nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam]
44
45 # different optimizers
46 opt_SGD         = torch.optim.SGD(net_SGD.parameters(), lr=LR)
47 opt_Momentum    = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
48 opt_RMSprop     = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
49 opt_Adam        = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
50 optimizers = [opt_SGD, opt_Momentum, opt_RMSprop, opt_Adam]
51
52 loss_func = torch.nn.MSELoss()
53 losses_his = [[], [], [], []]   # record loss
54
55 # training
56 for epoch in range(EPOCH):
57     print(‘Epoch: ‘, epoch)
58     for step, (b_x, b_y) in enumerate(loader):          # for each training step
59         for net, opt, l_his in zip(nets, optimizers, losses_his):
60             output = net(b_x)              # get output for every net
61             loss = loss_func(output, b_y)  # compute loss for every net
62             opt.zero_grad()                # clear gradients for next train
63             loss.backward()                # backpropagation, compute gradients
64             opt.step()                     # apply gradients
65             l_his.append(loss.data.numpy())     # loss recoder
66
67 labels = [‘SGD‘, ‘Momentum‘, ‘RMSprop‘, ‘Adam‘]
68 for i, l_his in enumerate(losses_his):
69     plt.plot(l_his, label=labels[i])
70 plt.legend(loc=‘best‘)
71 plt.xlabel(‘Steps‘)
72 plt.ylabel(‘Loss‘)
73 plt.ylim((0, 0.2))
74 plt.show()

参考:https://blog.csdn.net/qingxuanmingye/article/details/90514018

原文地址:https://www.cnblogs.com/NPC-assange/p/11373495.html

时间: 2024-11-12 22:41:56

Task6.PyTorch理解更多神经网络优化方法的相关文章

【零基础】神经网络优化之Adam

一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以这里我们先由动量梯度下降引申出RMSprop,最后再介绍Adam.不过,由于RMSprop.Adam什么的,真的太难理解了,我就只说实现不说原理了. 二.RMSprop 先回顾一下动量梯度下降中的“指数加权平均”公式: vDW1 = beta*vDW0 + (1-beta)*dw1 vDb1 = b

理解toString()和hashCode()方法的重写

一般toString()方法会应用在自己bean类中.根据需要 在重写的toString 方法中 组织自己想要显示的当前对象的信息. 比如按一定规则格式返回 所以属性的名称及值. 当你要读取关于对象的一些有用细节时,可以在对象上调用toString(). 如,当把一个对象引用传递给System.out.println();时,该对象的toString()方法被调用. Java中所有的类都继承自Object父类,所以,我们在类中只要重写一下toString()方法就可以显示出我们想要的信息了. 看

理解jquery的.on()方法

jquery在的.on()方法用来给元素绑定事件处理函数的,我经常用在两个地方: 给未来的元素绑定事件:我总是这样用:$(document).on('click','#div1',function(){}); 给拥有同一个父元素的多个子元素绑定事件. 可以查看以前写的博客:jQuery中对未来的元素绑定事件 先来看一个实例: 在页面A的一个div里动态加载页面B,页面B里的一个div绑定了一个单击事件. 页面A如下: <body> <input type="button&quo

轻松理解 Spark 的 aggregate 方法

2019-04-20 关键字: Spark 的 agrregate 作用.Scala 的 aggregate 是什么 Spark 编程中的 aggregate 方法还是比较常用的.本篇文章站在初学者的角度以大白话的形式来讲解一下 aggregate 方法. aggregate 方法是一个聚合函数,接受多个输入,并按照一定的规则运算以后输出一个结果值. aggregate 在哪 aggregate 方法是 Spark 编程模型 RDD 类( org.apache.spark.RDD ) 中定义的一

Java反射理解(五)-- 方法反射的基本操作

Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) 举例 具体操作请看下面举例: import java.lang.reflect.Method; class A{ public void print(){ System.out.println("helloworld"); } public void print(int a,int b){

pytorch 的 sum 和 softmax 方法 dim 参数的使用

在阅读使用 pytorch 实现的代码时,笔者会遇到需要对某一维数据进行求和( sum )或 softmax 的操作.在 pytorch 中,上述两个方法均带有一个指定维度的 dim 参数,这里记录下 dim 参数的用法. torch.sum 在 pytorch 中,提供 torch.sum 的两种形式,一种直接将待求和数据作为参数,则返回参数数据所有维度所有元素的和,另外一种除接收待求和数据作为参数外,还可加入 dim 参数,指定对待求和数据的某一维进行求和. out = torch.sum(

深入理解静态方法和实例化方法的区别

这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用实例化方法需要new了以后才可以使用....我们真的理解了吗? 从实际项目开发说起,这里有开发项目的三种方式: 开发项目中把BLL和DAL分开,在BLL调用DAL的代码. 一.在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式

深入理解Java虚拟机笔记---方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作.在Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法的调用过程变得相对复杂,需要在类加载期间甚至到运行期间才能确定目标方法的直接引用.

Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向

很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性.查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷新和上拉加载更多.这个组件有个mode的属性,可以设置为both,即上下同时都可拉动.但是只设置这个属性的话,上拉与下拉产生的效果是完全一致的.所以要使用这个开源项目做到下拉刷新并同时可上拉加载更多,就需要在代码中进行一些处理. ==========================pulltoref