大多数的代码都来自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()意义相关推荐

  1. Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解

    引言 一般训练神经网络,总是逃不开optimizer.zero_grad之后是loss(后面有的时候还会写forward,看你网络怎么写了)之后是是net.backward之后是optimizer.s ...

  2. 损失函数与优化器理解+【PyTorch】在反向传播前为什么要手动将梯度清零?optimizer.zero_grad()

    目录 回答一: 回答二: 回答三: 传统的训练函数,一个batch是这么训练的: 使用梯度累加是这么写的: 回答一: 一句话,用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而 ...

  3. pytorch之model.zero_grad() 与 optimizer.zero_grad()

    转自 https://cloud.tencent.com/developer/article/1710864 1. 引言 在PyTorch中,对模型参数的梯度置0时通常使用两种方式:model.zer ...

  4. python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法

    废话不多说,直接上代码吧~ model.zero_grad() optimizer.zero_grad() 首先,这两种方式都是把模型中参数的梯度设为0 当optimizer = optim.Opti ...

  5. 理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理

    在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward()和optimizer.step()三个函数,如下所示: ...

  6. optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用

    optimizer.zero_grad,loss.backward,optimizer.step 用法介绍 optimizer.zero_grad(): loss.backward(): optimi ...

  7. 梯度值与参数更新optimizer.zero_grad(),loss.backward、和optimizer.step()、lr_scheduler.step原理解析

    在用pytorch训练模型时,通常会在遍历epochs的过程中依次用到optimizer.zero_grad(),loss.backward.和optimizer.step().lr_schedule ...

  8. pytorch优化器: optim.SGD optimizer.zero_grad()

        在神经网络优化器中,主要为了优化我们的神经网络,使神经网络在我们的训练过程中快起来,节省时间.在pytorch中提供了 torch.optim方法优化我们的神经网络,torch.optim 是 ...

  9. optimizer.zero_grad()和loss.backward()

    1.optimizer.zero_grad()和loss.backward()先后问题 刚开始学习深度学习,就是不明白,为什么第一次运行的时候就要optimizer.zero_grad()(梯度清零) ...

最新文章

  1. keras中conv2d,conv2dTranspose的Padding详细介绍
  2. 使用locate 的正则查询 查找所有main.c
  3. Leangoo_多团队,大规模敏捷开发实现过程
  4. Sublime text别再弹出(wei zhu ce)以及(geng xin)提示了?
  5. 一个教务系统多少钱_销售管理系统报价多少钱
  6. [导入]ASP.NET MVC框架开发系列课程(3):URL导向.zip(16.66 MB)
  7. poj 1164 The Castle
  8. 嵌入式-C语言面试题【转】
  9. unity3d-小案例之角色简单漫游
  10. Java8新特性教程 - 终极指南
  11. 大V怒怼银行服务太差,一怒取走500万现金!上海银行回应了
  12. 连接Mysql弹出2005_正确安装数据库SQL2005和安装出现的问题的解决方法
  13. 3DShader之法线贴图(normal mapping)
  14. 初识python: 生成器并行(做包子,吃包子)
  15. oracle 自治事务异常不回滚,ORA-06519: 检测到活动的自治事务处理,已经回退
  16. 学生选课管理系统(Java)
  17. java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
  18. 国家计算机考试报名照片编辑器,电脑的证件照制作软件推荐
  19. react js清除浏览器缓存
  20. 用diskpart恢复U盘

热门文章

  1. 说话人识别相关基础知识整理(持续更新)
  2. java自动识别图片验证码插件_JMeter开发插件——图片验证码识别
  3. 平面设计和网页设计是一个工种吗
  4. matplotlib之pyplot模块——饼图(pie():圆环图(donut)、二层圆环图、三层圆环图(旭日图))
  5. 关于LDO并联在输入输出端二极管
  6. S905/S905M安装LAKKA教程
  7. 数据之美:可视化会给你意想不到的答案!
  8. 经典美剧《越狱》口语精华及经典台词
  9. PC微信逆向--调用sqlite3_exec执行SQL
  10. 宏#define边缘效应(边际效应)