CIARF10经典构建(Pytorch)

Posted 'or 1 or 不正经の泡泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CIARF10经典构建(Pytorch)相关的知识,希望对你有一定的参考价值。

文章目录

本博文优先在掘金社区发布!

前言

前面我们大概知道了神经网络,这个概念,前面也介绍了CNN神经网络,我们说这个卷积神经网络我们应该分为两部分去解释,一个是卷积还有一个是神经网络。卷积是一种特殊的数据处理方式,然后我们处理完数据之后把结果带入到网络当中,之后我们得到输出,那么网络其实也是一种对数据的处理方式,一种比较抽象的数据处理方式,一种我们人类很难直观的获取我们获取的实际的表达式的方式,例如你去拟合数据,你基本上很难去获取到你拟合之后的函数,如果你的神经网络结构很复杂的话,因为我们可以有N个线性层,非线性层,N个隐藏节点。

卷积

现在我们来到第一部分,就是卷积,我们有一个卷积核,来负责对数据的处理,这个卷积核实际上也是需要被优化的参数,我们可以把这些卷积操作全部看成需要被优化的参数。先来说说这边有的API。

Conv2d卷积函数

这个就是我们的卷积核。

其中这里有几个参数要注意。
先打开我们官网看看。

下面这几个是参数

这几个参数很重要,在我们构建CNN神经网络的时候。
我们来重点介绍几个参数

padding

这个参数,我们前面说过,卷积之后我们的图像会变小,所以有时候,我们可以填充一下原图像,让它变大,这样输出卷积之后的图片尺寸就不会发送一定的改变,也就是说我们的padding可以对原图像进行填充,padding_mode是指,你要填充什么,例如填充0

计算输出的大小

官方提供了一个公式用于计算输出的图像大小。

我们可以计算一下。下面构建网络的时候,我会举个例子。

MaxPool2d 池化

这个

就是这个玩意

Flatten 打平

其实就是把我们的数据进行摊平。

网络搭建

我们现在直接上代码

import torchvision
from torch import nn
import torch
from torch.utils.data import DataLoader
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential, CrossEntropyLoss
from torchvision import transforms

trans = transforms.Compose([transforms.ToTensor()])
dataset = torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=trans,download=True)

dataloader = DataLoader(dataset,batch_size=64)
class MyModule(nn.Module):

    def __init__(self):
        super().__init__()

        self.model = Sequential(
            Conv2d(3, 32, kernel_size=(5, 5), padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, (5, 5), padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, (5, 5), padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)

        )


    def forward(self,x):
        x = self.model(x)

        return x


if __name__ == '__main__':
    mymodule = MyModule()
    loss = torch.nn.CrossEntropyLoss()
    optim = torch.optim.SGD(mymodule.parameters(),lr=0.01)

    for data in dataloader:
        imgs,targets = data
        outputs = mymodule(imgs)
        result_loss = loss(outputs,targets)
        optim.zero_grad()
        result_loss.backward()
        optim.step()

这个就是我们要搭建的CIFAR10模型代码。
由于数据太大,所以我这边也是先拿了训练集。

网络模型

这个就是它的一个网络模型,我们只需要按照这个图片进行构建就好了。

计算卷积核大小

现在我们注意一下就是

所以我们就要使用前面的公式计算一下参数

输入 (32 + 2padding - 1(5-1)-1)/1) +1= 32-4 + 2padding

所以 padding = 2 其他的参数我们直接按照默认的数值来算,你不按照也可以只要你能够保证你的输出。

所以我们最终得到模型张这样。

class MyModule(nn.Module):

    def __init__(self):
        super().__init__()

        self.model = Sequential(
            Conv2d(3, 32, kernel_size=(5, 5), padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, (5, 5), padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, (5, 5), padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)

        )


    def forward(self,x):
        x = self.model(x)

        return x

以上是关于CIARF10经典构建(Pytorch)的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 之 基于经典网络架构训练图像分类模型

从源代码构建Pytorch

RNN经典案例使用RNN模型构建人名分类器(RNN实战-姓名分类)

RNN经典案例使用RNN模型构建人名分类器(RNN实战-姓名分类)

如何使用 pytorch 构建多维自动编码器

用PyTorch构建基于卷积神经网络的手写数字识别模型