CIARF10经典构建(Pytorch)

1,825 阅读3分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

前言

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

卷积

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

Conv2d卷积函数

这个就是我们的卷积核。

image.png

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

image.png

下面这几个是参数

image.png

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

padding

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

image.png

计算输出的大小

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

image.png

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

MaxPool2d 池化

这个

image.png

就是这个玩意

Flatten 打平

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

image.png

网络搭建

我们现在直接上代码

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模型代码。 由于数据太大,所以我这边也是先拿了训练集。

网络模型

image.png

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

计算卷积核大小

现在我们注意一下就是

image.png

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

image.png

输入 (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