CIFAR10模型
是torchvision
中官方给出的一个数据集,可以通过
dataset = torchvision.datasets.CIFAR10('./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
来下载到指定文件夹
搭建CIFAR10模型
首先我们先去搜一下CIFAR10 model structure
可以看到,模型的训练步骤为
- 输入为
3通道 32*32像素
,通过5*5
的卷积核进行卷积操作,得到32通道32*32像素
- 进行
2*2
卷积核的最大池化操作变为32通道16*16像素
- 进行
5*5
卷积核的卷积操作变为32通道16*16像素
- 进行
2*2
卷积核的最大池化操作变为32通道8*8像素
- 进行
5*5
卷积核的卷积操作变为64通道8*8像素
- 进行
2*2
卷积核的最大池化操作变为64通道4*4像素
- 进行
Flatten
全链接操作展开为1024长度
- 通过线性激活变为
64长度
- 通过线性激活变为
10长度
然后我们就可以进行搭建了
首层卷积层
输入为3通道 32*32像素
,通过5*5
的卷积核进行卷积操作,得到32通道32*32像素
因为输入输出都是32*32像素
,所以我们就需要根据官方给出的公式来计算一下padding
为多少
其中padding
为未知变量,dilation
为默认值1,stride
为默认值1,kernel_size
为5
根据输入输出都为32可以求出,padding
为2
所以我们的首层卷积为输入3通道,输出32通道,卷积核为5,padding为2
self.conv1 = nn.Conv2d(3, 32, kernel_size=5, padding=2)
其它层的推导同理,这里就不过多赘述
最终结果
import torch
import torchvision
from torch import nn
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10('./dataset', train=False, download=True,
transform=torchvision.transforms.ToTensor())
dataLoader = torch.utils.data.DataLoader(dataset, batch_size=64)
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=5, padding=2)
self.pool1 = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(32, 32, kernel_size=5, padding=2)
self.pool2 = nn.MaxPool2d(2)
self.conv3 = nn.Conv2d(32, 64, kernel_size=5, padding=2)
self.pool3 = nn.MaxPool2d(2)
self.flatten = nn.Flatten()
self.fc1 = nn.Linear(1024, 64)
self.fc2 = nn.Linear(64, 10)
def forward(self, x):
x = self.conv1(x)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool2(x)
x = self.conv3(x)
x = self.pool3(x)
x = self.flatten(x)
x = self.fc1(x)
x = self.fc2(x)
return x
net = Net()
# print(net)
input_test = torch.ones((64, 3, 32, 32)) # torch.ones用于模拟数据,用于检验定义的每层操作是否有错误
output_test = net(input_test)
# print(output.shape)
writer = SummaryWriter('./logs')
writer.add_graph(net, input_test) # 给定网络的类和输入的 input
这里新使用了torch.ones
和writer.add_graph
,根据注释再自己查看一下
add_graph
生成的图像