目标模型:
含详细注释的代码如下:
import torch
from torch import nn
# 定义一个网络模型
class MyLeNet(nn.Module):
# 初始化网络
def __init__(self):
super(MyLeNet,self).__init__()
# 卷积层:输入灰度图——输入通道大小是1; 设定输出通道大小是6;约定卷积核大小是5*5;
# N = (W - F + 2P) / S + 1
# 其中N: 输出大小(目标:28) w: 输入大小(28) F: 卷积核大小(5) P: 填充值的大小(这里设为0) s: 步长大小(设为1)
# [(28-5+4) / 1] + 1 = 28
self.c1 = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5,padding=2)
# 定义激活函数
self.Sigmoid = nn.Sigmoid()
# 使用平均池化定义一个池化层——不改变通道大小,但是改变特征图片的窗口大小
# 池化后是14*14 [(28-2+0) / 2] + 1 = 14
self.s2 = nn.AvgPool2d(kernel_size=2,stride=2)
self.c3 = nn.Conv2d(in_channels=6,out_channels=16,kernel_size=5)
self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)
self.c5 = nn.Conv2d(in_channels=16,out_channels=120,kernel_size=5)
# 展开
self.flatten = nn.Flatten()
# 线性连接层
self.f6 = nn.Linear(120,84)
self.output = nn.Linear(84,10)
# 传播这个网络。我们继承了nn.Module这个类,这里是在重写forward函数实现
def forward(self,x):
# 用Sigmoid激活一下c1
x = self.Sigmoid(self.c1(x))
# 通过池化层
x = self.s2(x)
# 后面重复这些动作
x = self.Sigmoid(self.c3(x))
x = self.s4(x)
x = self.Sigmoid(self.c5(x))
x = self.flatten(x)
x = self.f6(x)
x = self.output(x)
return x
if __name__ == "__main__":
x = torch.rand([1,1,28,28])
model = MyLeNet()
y = model(x)