近期,公众号将推出卷积神经网络结构系列专题文章,将深入浅出的为大家介绍从1998年到2020年的卷积神经网络结构,深刻体会每种网络的前世今身和进化历程。本文作为开篇,我们一起来探索一下由CNN之父Yann LeCun在1998提出来的第一个神经网络结构——LeNet。
LeNet通过巧妙的设计,利用卷积、参数共享、下采样等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是近20年来大量神经网络架构的起源。
LeNet-5是1998年YannLeCun设计用于手写数字识别的模型,LeNet-5也是LeNet系列最新的卷积神经网络,网络结构如下图所示:
网络基本架构为:Input -> conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax。括号中的数字代表通道数,网络名称中有5表示它有5层conv/fc层。其中每一个卷积层中的卷积核大小均为5x5,stride=1,无填充,LeNet-5中使用的激活函数为tanh。LeNet-5之后被成功用于ATM以对支票中的手写数字进行识别。LeNet取名源自其作者姓LeCun。
网络架构具体介绍如下:
batch_size
。PyTorch代码实现如下
class LeNet5(nn.Module):
def __init__(self, num_classes, grayscale=False):
super(LeNet5, self).__init__()
self.grayscale = grayscale
self.num_classes = num_classes
if self.grayscale:
in_channels = 1
else:
in_channels = 3
self.features = nn.Sequential(
nn.Conv2d(in_channels, 6, kernel_size=5),
nn.Tanh(),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(6, 16, kernel_size=5),
nn.Tanh(),
nn.MaxPool2d(kernel_size=2)
)
self.classifier = nn.Sequential(
nn.Linear(16*5*5, 120),
nn.Tanh(),
nn.Linear(120, 84),
nn.Tanh(),
nn.Linear(84, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
logits = self.classifier(x)
probas = F.softmax(logits, dim=1)
return logits, probas