ResNet 09

一、发展

1989年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet。

1998年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet-5

AlexNet是2012年ISLVRC 2012(ImageNet Large Scale Visual Recognition  Challenge)竞赛的冠军网络,分类准确率由传统的 70%+提升到 80%+。 它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。


VGG在2014年由牛津大学著名研究组VGG (Visual Geometry  Group) 提出,斩获该年ImageNet竞 赛中 Localization Task (定位 任务) 第一名 和 Classification Task (分类任务) 第二名。[1.38亿个参数]

GoogLeNet在2014年由Google团队提出,斩获当年ImageNet竞赛中Classification Task (分类任务) 第一名。[论文:Going deeper with convolutions][600多万参数]

ResNet在2015年由微软实验室提出,斩获当年ImageNet竞赛中 分类任务第一名,目标检测第一名。获得COCO数据集中目标 检测第一名,图像分割第一名。[论文:Deep Residual Learning for Image Recognition]

lmageNet数据集是ILSVRC竞赛使用的是数据集,由斯坦福大学李飞飞教授主导,包含了超过1400万张全尺寸的有标记图片,大约有22000个类别的数据。ILSVRC全称ImageNet Large-Scale VisualRecognition Challenge,是视觉领域最受追捧也是最具权威的学术竞赛之一,代表了图像领域的最高水平。从2010年开始举办到2017年最后一届,使用ImageNet数据集的一个子集,总共有1000类。

该比赛的获胜者从2012年开始都是使用的深度学习的方法,12年之前都是传统方法

二、ResNet

2.1 网络特点

  • 超深的网络结构(突破1000层)
  • 提出residual模块
  • 使用Batch Normalization加速训练(丢弃dropout)

 正常网络,网络越深,错误率越高;而ResNet是网络越深,错误率越低

梯度消失或梯度爆炸问题:BN解决

退化问题:残差解决

F(x)是卷积对x的结果,最终结果是x+F(x)

如果网络效果变好:x+F(x)

如果加上网络不好:x+ 0

2.2 残差

左边是基础的残差结构

右边是改进的结构,减少参数

实线与虚线

实线是,图片输入与输出维度不变 

虚线是,图片整体长宽的下降

2.3 BN

Batch Normalization的目的是使我们的一批(Batch)  feature map满足均值为0,方差为1的分布规律[参考]。

好的,我以PyTorch框架为例,实现mnist数据集分类任务。 首先,我们需要导入相关的库和数据集。PyTorch自带了mnist数据集,我们可以直接使用。代码如下: ``` python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 定义数据预处理,将数据转换为tensor并进行归一化 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载mnist数据集 train_dataset = datasets.MNIST('data/', train=True, download=True, transform=transform) test_dataset = datasets.MNIST('data/', train=False, download=True, transform=transform) # 定义数据加载器,用于批量加载数据 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) ``` 接下来,我们可以定义卷积神经网络模型。这里以LeNet-5为例,代码如下: ``` python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5) self.pool1 = nn.MaxPool2d(kernel_size=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.pool2 = nn.MaxPool2d(kernel_size=2) self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool1(torch.relu(self.conv1(x))) x = self.pool2(torch.relu(self.conv2(x))) x = x.view(-1, 16 * 4 * 4) x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x ``` 在模型定义好后,我们需要定义损失函数和优化器。这里使用交叉熵损失函数和Adam优化器,代码如下: ``` python model = LeNet5() # 实例化模型 criterion = nn.CrossEntropyLoss() # 定义损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001) # 定义优化器 ``` 接下来,我们可以开始训练模型。代码如下: ``` python # 训练过程 def train(model, train_loader, criterion, optimizer): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() # 测试过程 def test(model, test_loader, criterion): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1) correct += pred.eq(target).sum().item() test_loss /= len(test_loader.dataset) accuracy = 100. * correct / len(test_loader.dataset) return test_loss, accuracy for epoch in range(10): train(model, train_loader, criterion, optimizer) test_loss, accuracy = test(model, test_loader, criterion) print('Epoch: {}, Test Loss: {:.4f}, Accuracy: {:.2f}%'.format(epoch+1, test_loss, accuracy)) ``` 训练10个epoch,输出如下: ``` Epoch: 1, Test Loss: 0.0317, Accuracy: 98.98% Epoch: 2, Test Loss: 0.0286, Accuracy: 99.03% Epoch: 3, Test Loss: 0.0268, Accuracy: 99.05% Epoch: 4, Test Loss: 0.0295, Accuracy: 99.02% Epoch: 5, Test Loss: 0.0264, Accuracy: 99.09% Epoch: 6, Test Loss: 0.0354, Accuracy: 98.83% Epoch: 7, Test Loss: 0.0322, Accuracy: 98.95% Epoch: 8, Test Loss: 0.0283, Accuracy: 99.07% Epoch: 9, Test Loss: 0.0284, Accuracy: 99.09% Epoch: 10, Test Loss: 0.0271, Accuracy: 99.11% ``` 可以看到,LeNet-5在mnist数据集上的分类准确率达到了99%以上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值