初步学习pytorch的网络搭建

本文介绍了如何在PyTorch中使用`nn.Module`类搭建神经网络,包括定义网络结构(如Conv2d层),初始化权重,以及通过MSELoss计算损失并利用SGD优化器进行参数更新的过程。
摘要由CSDN通过智能技术生成

学习十分钟掌握Pytorch搭建神经网络的流程
要继承 nn.Module(import torch.nn as nn)
包含init和forward
init:定义卷积层 super继承
第一层 输入通道1 输出通道6 卷积核为5*5
输入x经过conv再经过激活函数F.relu()(import torch.nn.functional as F)再池化
注意:前后通道数的一致性

Class Net (nn.Module):
     def __init__(self):
        super().__init__()
        self.conv1=nn.Conv2d(1,6,5)
        self.conv2=nn.Conv2d(6,16,5)
 
     def forward(self, x):
        x=F.max_pool2d(F.relu(self.conv1(x)),2)
        x=F.max_pool2d(F.relu(self.conv2(x)),2)
        return x

定义Net实例
再传数据tensor类型

net=Net()
output=net(input)

神经网络只能决定每一层卷积层的权重。所以神经网络只能不停修改权重,比如y=wx+b,x是你给的,它只能改变w,b让最后的输出y尽可能接近你希望的y值,这样损失loss就越来越小。

通过下述方式实现对W的更新:
【1】 先算loss对于输入x的偏导,(当然网络好几层,这个x指的是每一层的输入,而不是最开始的输入input)
【2】 对【1】的结果再乘以一个步长(这样就相当于是得到一个对参数W的修改量)
【3】 用W减掉这个修改量,完成一次对参数W的修改。

1 损失函数

compute_loss=nn.MSELoss()
loss=compute_loss(target,output)
# 反向 得到对参数W一步的更新量
loss.backward()

2、3就是通过优化器来实现。让优化器来自动实现对网络权重W的更新。
所以在Net定义完以后,需要写一个优化器的定义(选SGD方式为例):
在每次迭代之前,先把optimizer里存的梯度清零一下(因为W已经更新过的“更新量”下一次就不需要用了)

from torch import optim
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)
optimizer.zero_grad()

在loss.backward()反向传播以后,更新参数:

optimizer.step()

1.先定义网络:写网络Net的Class,声明网络的实例net=Net(),
2.定义优化器
optimizer=optim.xxx(net.parameters(),lr=xxx),
3.再定义损失函数(自己写class或者直接用官方的,compute_loss=nn.MSELoss()或者其他。
4.在定义完之后,开始一次一次的循环:
①先清空优化器里的梯度信息,optimizer.zero_grad();
②再将input传入,output=net(input) ,正向传播
③算损失,loss=compute_loss(target,output) ##这里target就是参考标准值GT,需要自己准备,和之前传入的input一一对应
④误差反向传播,loss.backward()
⑤更新参数,optimizer.step()

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值