Sequential的使用
torch.nn.Sequential(arg: OrderedDict[str, Module])
官网示例:
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
像是能够组合实现全过程网络。和transform中compose有相似作用!
为能够说明使用Sequential效果,搭建一个最开始的对CIFAR10的简单分类过程!
首个复杂模型-类分类网络
创建的网络是根据对CIFAR10的分类网络为基底进行初步创建,并利用手动数据进行验证网络是否正确!
针对分类问题设计的网络模型为:
网络结构有:卷积层5*5-池化2*2-卷积-池化-卷积-池化-flatten展开-线性变换。注意模型中是少了一部分的线性层得到64。
import torch.nn
from torch import nn
from torch.utils.tensorboard import SummaryWriter
""""
真实利用所学的各种网络层进行手动实现。
并在过程中演示Sequential的使用体验。
使用tensorboard进行一个网络视图的绘制!
注:
在建成自己的网络模型或download其他程序,请手动创建一个数据进行验证网络的正确性。
"""
class MyModule(nn.Module):
def __init__(self):
super().__init__()
# padding值和stride值需要计算。一般dilation默认为1不适用空洞卷积 原尺寸卷积padding设置为kernel_size/2
# 计算公式请看卷积章节的shape计算公式
self.conv1 = nn.Conv2d(3, 32, 5, padding=2, )
self.maxpool1 = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(32, 32, 5, padding=2)
self.maxpool2 = nn.MaxPool2d(2)
self.conv3 = nn.Conv2d(32, 64, 5, padding=2)
self.maxpool3 = nn.MaxPool2d(2)
# 引入flatten层 进行展平
self.flatten = nn.Flatten()
self.linear1 = nn.Linear(1024, 64)
self.linear2 = nn.Linear(64, 10)
# 解释Sequential的使用
# self.module1 = nn.Sequential(
# nn.Conv2d(3, 32, 5, 1, 2),
# nn.MaxPool2d(2),
# nn.Conv2d(32, 32, 5, 1, 2),
# nn.MaxPool2d(2),
# nn.Conv2d(32, 64, 5, 1, 2),
# nn.MaxPool2d(2),
# nn.Flatten(),
# nn.Linear(1024,64),
# nn.Linear(64,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)
# x = self.module1(x)
return x
mymodule = MyModule()
print(mymodule)
# 自己创建过一个模型后需要去利用一个实际能够计算的值去验证其搭建的正确性!全为1的数据
input = torch.ones(64, 3, 32, 32)
output = mymodule(input)
print(output.shape)
writer = SummaryWriter("Sequential")
# 计算图?
writer.add_graph(mymodule,input)
writer.close()
这是没有使用Sequential的结果与绘图结果:
使用Sequential的结果与绘图结果:
结果表明,实验结果是都能达到要求,且绘图工具对每一层之间的数据格式传输能够表达一致清楚,且针对各层设置的参数情况也能显示出来,Sequential能简化代码更有结构化思想。