# Sequential:使代码更简洁,更容易管理
写一个对CIFAR10这个数据集进行分类的简单的网络模型
(1)CIFAR10 模型结构
第一个卷积层:Hin=32、dilation[0](0号元素)默认为1(没有使用空洞卷积)、Hout=32、kernel_size=5
第二层卷积:Hin=16、dilation[0]默认为1、Hout=16、kernel_size=5
第三层卷积:Hin=8、dilation[0]默认为1、Hout=8、kernel_size=5
根据以下卷积公式可知:
- (32+2*padding[0]-1*(5-1)-1)/stride[0]+1=32,即:27+2*padding[0]=31*stride[0]。如果stride[0]=2的话,那么padding[0]也要设置的很大,并不合理。因此,stride[0]=1,padding[0]=4。
- 同理,第二层第三层卷积也可算出:stride[0]=1,padding[0]=4。
(2)代码搭建
根据模型结构搭建网络
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
class Swagkg(nn.Module):
def __init__(self):
super(Swagkg, self).__init__()
# 搭建卷积层
# stride和dilation都默认为1,不用写
self.conv1 = Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)
# 搭建池化层
self.maxpool1 = MaxPool2d(kernel_size=2)
# 再经过一次卷积操作
self.conv2 = Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2)
self.maxpool2 = MaxPool2d(kernel_size=2)
self.conv3 = Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2)
self.maxpool3 = MaxPool2d(kernel_size=2)
# 展平搭建
self.flatten =Flatten()
# 搭建线性层1和线性层2
self.linear1 = Linear(in_features=1024, out_features=64)
self.linear2 = Linear(in_features=64, out_features=10)
def forward(self, x):
x = self.conv1(x)
x = self.maxpool1(x)
x = self.conv2(x)
x = self.maxpool2(x)
x = self.conv3(x)
x = self.maxpool3(x)
x = self.flatten(x)
x = self.linear1(x)
x = self.linear2(x)
return x
# 搭建网络
swagkg = Swagkg()
print(swagkg)
查看所搭建的网络结构:
检查网络的正确性,添加以下测试代码:
若将输入改成10240,就会报错:
(3)Sequential作用:将代码简洁
代码修改如下:
效果一样,且前面会指定一个序列:
(4)tensorboard可视化
添加代码:
运行结果:
成功啦!!!有被惊艳到!!
网址:http://localhost:6006/#graphs&run=.