optimizer.zero_grad()意义
大多数的代码都来自https://morvanzhou.github.io/tutorials/machine-learning/torch
只是自己入门pytorch随便记得东西,然后随手扔上来(markdown都不用了,懒懒懒
tensor:
import torch
data = [[1,2], [3,4]]
tensor = torch.FloatTensor(data)
各种操作和numpy.array类似
Variable:
from torch.autograd import Variable
变量,里面的主要元素就是tensor(type(Variable.data) == A_KIND_OF_TENSORS),但是一个variable是会记住自己是被哪些Variable计算出来的(variable = Variable(tensor, requires_grad=True)),所以当我们计算出最后一个Variable:loss时,就可以通过loss.backward(),来对梯度进行反向传播。
然后loss.grad就是其对应的梯度,loss计算图中的各个Variable中的grad成员也会自动变成其对应的参数,记得每次计算新的grad时,要把原来的梯度清0。(optimizer.zero_grad()可以自动完成这个操作,把所有Variable的grad成员数值变为0,然后optimizer.step()则在每个Variable的grad都被计算出来后,更新每个Variable的数值)
激励函数:
import torch.nn.functional as F
F里面存着各种激励函数,进去一个Variable,出来一个Variable,最常用的当然就是F.relu(A_VARIABLE)
optimizer:
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
qusetion:net.parameters()是哪里来的,作用是什么?
optimizer.zero_grad()可以把所有Variable的grad成员数值变为0
optimizer.step()则可以用所有Variable的grad成员和lr的数值自动更新Variable的数值。
给Variable打上粗体是因为之中Variable会被optimizer的相关函数更新,如果你把东西放在list或其它东西里,它们的梯度是不会被更新的!
loss function:
loss_func = torch.nn.MSELoss()
建立一个神经网络:
class Net(torch.nn.Module): # 继承 torch 的 Module
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() # 继承 __init__ 功能
# 定义每层用什么样的形式
self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隐藏层线性输出
self.predict = torch.nn.Linear(n_hidden, n_output) # 输出层线性输出
def forward(self, x): # 这同时也是 Module 中的 forward 功能
# 正向传播输入值, 神经网络分析出输出值
x = F.relu(self.hidden(x)) # 激励函数(隐藏层的线性值)
x = self.predict(x) # 输出值
return x
net = Net(n_feature=1, n_hidden=10, n_output=1)
print(net) # net 的结构"""
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
"""
训练一个网络:
# optimizer 是训练的工具optimizer = torch.optim.SGD(net.parameters(), lr=0.5) # 传入 net 的所有参数, 学习率loss_func = torch.nn.MSELoss() # 预测值和真实值的误差计算公式 (均方差)
for t in range(100):
prediction = net(x) # 喂给 net 训练数据 x, 输出预测值
loss = loss_func(prediction, y) # 计算两者的误差
optimizer.zero_grad() # 清空上一步的残余更新参数值
loss.backward() # 误差反向传播, 计算参数更新值
optimizer.step() # 将参数更新值施加到 net 的 parameters 上
快速搭建网络:
之前写的搭建方法适用于你可以对网络进行各种各样的自定义
接下来的方法,如果不需要什么复杂的过程的话,只需要按下面的过程来构建就好了。
net2 = torch.nn.Sequential(
torch.nn.Linear(1, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 1)
)
保存网络:
torch.save(net1, 'net.pkl') # 保存整个网络
torch.save(net1.state_dict(), 'net_params.pkl') # 只保存网络中的参数 (速度快, 占内存少)
提取网络:
提取整个神经网络, 网络大的时候可能会比较慢.
def restore_net():
# restore entire net1 to net2
net2 = torch.load('net.pkl')
prediction = net2(x)
只提取网络参数
def restore_params():
# 新建 net3
net3 = torch.nn.Sequential(
torch.nn.Linear(1, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 1)
)
# 将保存的参数复制到 net3
net3.load_state_dict(torch.load('net_params.pkl'))
prediction = net3(x)
批处理:
# 把 dataset 放入 DataLoaderloader = Data.DataLoader(
dataset=torch_dataset, # torch TensorDataset format
batch_size=BATCH_SIZE, # mini batch size
shuffle=True, # 要不要打乱数据 (打乱比较好)
num_workers=2, # 多线程来读数据)
for epoch in range(3): # 训练所有!整套!数据 3 次
for step, (batch_x, batch_y) in enumerate(loader): # 每一步 loader 释放一小批数据用来学习
# 假设这里就是你训练的地方...
# 打出来一些数据
print('Epoch: ', epoch, '| Step: ', step, '| batch x: ',
batch_x.numpy(), '| batch y: ', batch_y.numpy())
"""
Epoch: 0 | Step: 0 | batch x: [ 6. 7. 2. 3. 1.] | batch y: [ 5. 4. 9. 8. 10.]
Epoch: 0 | Step: 1 | batch x: [ 9. 10. 4. 8. 5.] | batch y: [ 2. 1. 7. 3. 6.]
Epoch: 1 | Step: 0 | batch x: [ 3. 4. 2. 9. 10.] | batch y: [ 8. 7. 9. 2. 1.]
Epoch: 1 | Step: 1 | batch x: [ 1. 7. 8. 5. 6.] | batch y: [ 10. 4. 3. 6. 5.]
Epoch: 2 | Step: 0 | batch x: [ 3. 9. 2. 6. 7.] | batch y: [ 8. 2. 9. 5. 4.]
Epoch: 2 | Step: 1 | batch x: [ 10. 4. 8. 1. 5.] | batch y: [ 1. 7. 3. 10. 6.]
"""
https://blog.csdn.net/dpppBR/article/details/78659338
optimizer.zero_grad()意义相关推荐
- Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解
引言 一般训练神经网络,总是逃不开optimizer.zero_grad之后是loss(后面有的时候还会写forward,看你网络怎么写了)之后是是net.backward之后是optimizer.s ...
- 损失函数与优化器理解+【PyTorch】在反向传播前为什么要手动将梯度清零?optimizer.zero_grad()
目录 回答一: 回答二: 回答三: 传统的训练函数,一个batch是这么训练的: 使用梯度累加是这么写的: 回答一: 一句话,用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而 ...
- pytorch之model.zero_grad() 与 optimizer.zero_grad()
转自 https://cloud.tencent.com/developer/article/1710864 1. 引言 在PyTorch中,对模型参数的梯度置0时通常使用两种方式:model.zer ...
- python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法
废话不多说,直接上代码吧~ model.zero_grad() optimizer.zero_grad() 首先,这两种方式都是把模型中参数的梯度设为0 当optimizer = optim.Opti ...
- 理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理
在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward()和optimizer.step()三个函数,如下所示: ...
- optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
optimizer.zero_grad,loss.backward,optimizer.step 用法介绍 optimizer.zero_grad(): loss.backward(): optimi ...
- 梯度值与参数更新optimizer.zero_grad(),loss.backward、和optimizer.step()、lr_scheduler.step原理解析
在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward.和optimizer.step().lr_schedule ...
- pytorch优化器: optim.SGD optimizer.zero_grad()
在神经网络优化器中,主要为了优化我们的神经网络,使神经网络在我们的训练过程中快起来,节省时间.在pytorch中提供了 torch.optim方法优化我们的神经网络,torch.optim 是 ...
- optimizer.zero_grad()和loss.backward()
1.optimizer.zero_grad()和loss.backward()先后问题 刚开始学习深度学习,就是不明白,为什么第一次运行的时候就要optimizer.zero_grad()(梯度清零) ...
最新文章
- keras中conv2d,conv2dTranspose的Padding详细介绍
- 使用locate 的正则查询 查找所有main.c
- Leangoo_多团队,大规模敏捷开发实现过程
- Sublime text别再弹出(wei zhu ce)以及(geng xin)提示了?
- 一个教务系统多少钱_销售管理系统报价多少钱
- [导入]ASP.NET MVC框架开发系列课程(3):URL导向.zip(16.66 MB)
- poj 1164 The Castle
- 嵌入式-C语言面试题【转】
- unity3d-小案例之角色简单漫游
- Java8新特性教程 - 终极指南
- 大V怒怼银行服务太差,一怒取走500万现金!上海银行回应了
- 连接Mysql弹出2005_正确安装数据库SQL2005和安装出现的问题的解决方法
- 3DShader之法线贴图(normal mapping)
- 初识python: 生成器并行(做包子,吃包子)
- oracle 自治事务异常不回滚,ORA-06519: 检测到活动的自治事务处理,已经回退
- 学生选课管理系统(Java)
- java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
- 国家计算机考试报名照片编辑器,电脑的证件照制作软件推荐
- react js清除浏览器缓存
- 用diskpart恢复U盘