LeNet

Concept and Principle

  • 最早是用于手写数字识别,识别信件上的邮政编码
  • 网络结构
    $cover
  • 提出了一个数据集:MNIST
    • 5w个训练数据
    • 1w个测试数据
    • 图像大小 28x28
    • 10类
  • 总结
    • LeNet是早期成功的神经网络
    • 先使用卷积层学习图片空间信息
    • 然后使用全连接层转换到类别空间

Implementation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from torch import optim
import torch
from torch import nn
import d2l

# 定义Reshape层
class Reshape(nn.Module):

def forward(self,x):
return x.view(-1,1,28,28)

net=nn.Sequential(
Reshape(),
nn.Conv2d(1,6,kernel_size=5,padding=2),
nn.AvgPool2d(2),nn.Sigmoid(),
nn.Conv2d(6,16,5),
nn.AvgPool2d(2,2),nn.Sigmoid(),nn.Flatten(),
nn.Linear(16*5*5,120),nn.Sigmoid(),
nn.Linear(120,84),nn.Sigmoid(),
nn.Linear(84,10)
)

x=torch.rand((1,28,28),dtype=torch.float32)

# 观察每一层输出的tensor尺寸
for layer in net:
x=layer(x)
print(layer.__class__.__name__,':\t',x.size())

# 在Fashion-MINST上的表现
train_iter,test_iter=d2l.load_data_fashion_mnist(256)
loss_f=nn.CrossEntropyLoss()
opt=optim.Adam(net.parameters())

# d2l.train(
# 25,loss_f,opt,net,train_iter,
# param_name="LeNet",device=torch.device("cuda:0")
# )
d2l.evaluate(net,test_iter,loss_f,".\params\LeNet_25")