LeNet
LeNet是最早用于图像处理的神经网络,主要是为了解决手写数字识别的问题,著名的数据集Minist就是伴随着LeNet的诞生而出现的。下面是其基本架构:
其结构相对简单,其中的Pooling层可以使用MaxPooling,也可以使用AvgPooling,激活函数原始模型使用的是Sigmoid,不过也可以换成Relu,tanh等。
总结
- Lenet是是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注
- 先用卷积层来学习图片的空间信息,通过池化层降低图片的敏感度
- 然后使用全连接层来转换到类别空间,得到10类
- 两个卷积层再加一个多层感知机,最终得到从图片到类别的映射
代码实现
%matplotlib inline
import torch
from torch import nn
import torchvision
from torch.utils import data
from matplotlib import pyplot as plt
import numpy as np
trans = torchvision.transforms.ToTensor()
train_data = torchvision.datasets.FashionMNIST('../data/', train=True, download=False, transform=trans)
test_data = torchvision.datasets.FashionMNIST('../data/', train=False, download=False, transform=trans)
train_data.data.shape, test_data.data.shape
(torch.Size([60000, 28, 28]), torch.Size([10000, 28, 28]))
def get_dataloader(batch_size, train_data, test_data):
train_dataloader = data.DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_dataloader = data.DataLoader(test_data, batch_size=batch_size, shuffle=False)
return train_dataloader, test_dataloader
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2),
nn.Sigmoid(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5),
nn.Sigmoid(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120),
nn.Sigmoid(),
nn.Linear(120, 84),
nn.Sigmoid()