Pytorch 学习笔记05 神经网络搭建小实战及Sequential的使用,Loss函数、反向传播、优化函数的使用,现有网络模型的使用及修改,保存及读取

Pytorch 学习笔记05

nn.sequential的使用

使用sequential,可以让搭建网络的代码更简洁,使用起来更方便。

神经网络搭建实战

利用CIFAR10数据集的模型进行搭建。
在这里插入图片描述
代码:

import torchvision
from torch import nn
from torch.utils.data import DataLoader



class Mynn(nn.Module):
    def __init__(self):
        super(Mynn, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=5, padding= 2), # stride使用默认值1,padding是根据官方文档里的公式计算得出
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, kernel_size=5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, kernel_size=5, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),  # 1024 为 64 * 4 *4 得出
            nn.Linear(64, 10)
        )
    def forward(self,x):
        return self.model(x)

卷积层中的padding是根据图中公式得出的。stride、dilation使用默认值。
在这里插入图片描述

Loss函数、反向传播、优化函数的使用

Loss函数用于计算训练结果与目标之间差距,Loss越小越好。
反向传播用来计算梯度,并通过optimization algorithms更新神经网络中的参数,进行优化。

代码:

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader



class Mynn(nn.Module):
    def __init__(self):
        super(Mynn, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=5, padding= 2), # stride使用默认值1,padding是根据官方文档里的公式计算得出
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, kernel_size=5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, kernel_size=5, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),  # 1024 为 64 * 4 *4 得出
            nn.Linear(64, 10)
        )
    def forward(self,x):
        return self.model(x)

dataset = torchvision.datasets.CIFAR10("./dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset,batch_size=1, drop_last=True)

mynn = Mynn()
# 定义loss函数
loss = nn.CrossEntropyLoss()
# 定义梯度优化函数
optim = torch.optim.SGD(mynn.parameters(), lr = 0.01)

for epoch in range(20): # 训练整个数据集20次
    epoch_loss = 0.0 # 每次训练的总loss
    for imgs, tars in dataloader:
        outputs = mynn(imgs)
        result_loss = loss(outputs,tars)
        optim.zero_grad() # 每一批开始前,将梯度设为0,因为上一批的梯度对这一批没用
        result_loss.backward() # 计算梯度
        optim.step()  # 优化
        epoch_loss += result_loss # 计算总loss
    print(f"第{epoch}轮训练的总loss为{epoch_loss}")

现有网络模型的使用及修改,保存及读取

以VGG16为例

使用及修改

主要参数

 Args:
        pretrained (bool): If True, returns a model pre-trained on ImageNet  # 如果为True,则返回在数据集ImageNet上训练后的模型;反之仅返回一个初始化的模型
        progress (bool): If True, displays a progress bar of the download to stderr # 如果为 True,则显示下载到 stderr 的进度条

代码:

import  torchvision

# 直接通过torchvision.models调用
from torch import nn

vgg16_False = torchvision.models.vgg16(pretrained=False)
vgg16_True = torchvision.models.vgg16(pretrained=True)

dataset = torchvision.datasets.CIFAR10("./dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(), download=True)
print(vgg16_True)
"""
查看该模型的层数,发现最后一层为Linear(in_features=4096, out_features=1000, bias=True)
out_features为1000,表示分类结果有1000个,
而CIFAR10模型的分类结果只有10个,所以要一层LInear,使得out_features=10
以两种方式来修改模型
"""
# 1.在模型后添加一层linear
vgg16_True.add_module("add_linear", nn.Linear(in_features=1000, out_features=10))
print(vgg16_True)
"""
这种方式是直接将该层加载VGG模型下,也可以加在 (classifier): 下面
"""
vgg16_True.classifier.add_module("add_linear", nn.Linear(in_features=1000, out_features=10))
print(vgg16_True)

# 2 直接修改(classifier):下的 (6): Linear(in_features=4096, out_features=1000, bias=True)
vgg16_False.classifier[6] =  nn.Linear(in_features=4096, out_features=10, bias=True)
print(vgg16_False)
保存及读取
import torch
import  torchvision

# 直接通过torchvision.models调用
from torch import nn

# 声明一个模型
vgg16_True = torchvision.models.vgg16(pretrained=True)

#  保存及读取

# 保存方式1, 既保存模型结构,也保存模型中的参数
torch.save(vgg16_True,"./vgg16_method1.pth") # 参数1:模型, 参数2:保存路径
# 保存方式1的加载模型
model1 = torch.load("./vgg16_method1.pth") # 模型的保存路径


# 保存方式2,以字典形式保存网络模型的参数,没有保存结构,(官方推荐)
torch.save(vgg16_True.state_dict(), "./vgg16_method2") # 参数1:模型里的参数,以字典形式保存; 参数2: 保存路径
# 保存方式2 加载模型
method2_model = torchvision.models.vgg16(pretrained=True) #创建一个新模型
method2_model_state = torch.load("./vgg16_method2") # 加载模型的参数
method2_model.load_state_dict(method2_model_state) # 将参数导入模型中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值