卷积神经网络LeNet

先上图:LeNet的网络结构

卷积(6个5∗5的核)→降采样(池化)(2∗2的核,步长2)→卷积(16个5∗5的核)→降采样(池化)(2∗2的核,步长2)→全连接16∗5∗5→120→全连接120→84→全连接84→10\begin{matrix}卷积 \\ (6个5*5的核) \end{matrix} \rightarrow \begin{matrix}降采样(池化) \\ (2*2的核,步长2) \end{matrix}\rightarrow \begin{matrix}卷积 \\ (16个5*5的核) \end{matrix} \rightarrow \begin{matrix}降采样(池化) \\ (2*2的核,步长2)\end{matrix}\rightarrow \\ \\ \begin{matrix}全连接 \\ 16*5*5\rightarrow120\end{matrix}\rightarrow \begin{matrix}全连接 \\ 120\rightarrow84\end{matrix}\rightarrow \begin{matrix}全连接 \\ 84\rightarrow10\end{matrix} 卷积(6个5∗5的核)​→降采样(池化)(2∗2的核,步长2)​→卷积(16个5∗5的核)​→降采样(池化)(2∗2的核,步长2)​→全连接16∗5∗5→120​→全连接120→84​→全连接84→10​

LeNet分为卷积层块和全连接层块两个部分。

卷积层

卷积层块里的基本单位是卷积层后接最大池化层
卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块由两个这样的基本单位重复堆叠构成。

  • 在卷积层块中,每个卷积层都使用5×55\times 55×5的窗口,并在输出上使用sigmoid激活函数。
  • 第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。这是因为第二个卷积层比第一个卷积层的输入的高和宽要小,所以增加输出通道使两个卷积层的参数尺寸类似。
  • 卷积层块的两个最大池化层的窗口形状均为2×22\times 22×2,且步幅为2。由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。

全连接层

卷积层块的输出形状为(批量大小, 通道, 高, 宽)
当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维

  • 其中第一维是小批量中的样本
  • 第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积

全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。

实现模型

下面通过Sequential类来实现LeNet模型。

import time
import torch
from torch import nn, optimdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv = nn.Sequential(nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_sizenn.Sigmoid(),nn.MaxPool2d(2, 2), # kernel_size, stridenn.Conv2d(6, 16, 5),nn.Sigmoid(),nn.MaxPool2d(2, 2))self.fc = nn.Sequential(nn.Linear(16*4*4, 120),nn.Sigmoid(),nn.Linear(120, 84),nn.Sigmoid(),nn.Linear(84, 10))def forward(self, img):feature = self.conv(img)output = self.fc(feature.view(img.shape[0], -1))return output
net = LeNet()
print(net)
LeNet((conv): Sequential((0): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))(1): Sigmoid()(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(4): Sigmoid()(5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(fc): Sequential((0): Linear(in_features=256, out_features=120, bias=True)(1): Sigmoid()(2): Linear(in_features=120, out_features=84, bias=True)(3): Sigmoid()(4): Linear(in_features=84, out_features=10, bias=True))
)

获取数据集

def load_data_fashion_mnist(batch_size, resize=None, root='~/Datasets/FashionMNIST'):"""Download the fashion mnist dataset and then load into memory."""trans = []if resize:trans.append(torchvision.transforms.Resize(size=resize))trans.append(torchvision.transforms.ToTensor())transform = torchvision.transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root=root, train=True, download=True, transform=transform)mnist_test = torchvision.datasets.FashionMNIST(root=root, train=False, download=True, transform=transform)if sys.platform.startswith('win'):num_workers = 0  # 0表示不用额外的进程来加速读取数据else:num_workers = 4train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)return train_iter, test_iterbatch_size = 256
train_iter, test_iter = load_data_fashion_mnist(batch_size=batch_size)

训练模型

模型准确率计算:

def evaluate_accuracy(data_iter, net, device=None):if device is None and isinstance(net, torch.nn.Module):# 如果没指定device就使用net的devicedevice = list(net.parameters())[0].deviceacc_sum, n = 0.0, 0with torch.no_grad():for X, y in data_iter:if isinstance(net, torch.nn.Module):net.eval() # 评估模式, 这会关闭dropoutacc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item()net.train() # 改回训练模式else: if('is_training' in net.__code__.co_varnames): # 如果有is_training这个参数# 将is_training设置成Falseacc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item() else:acc_sum += (net(X).argmax(dim=1) == y).float().sum().item() n += y.shape[0]return acc_sum / n

在GPU上训练模型:

def train(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs):net = net.to(device)print("training on ", device)loss = torch.nn.CrossEntropyLoss()for epoch in range(num_epochs):train_l_sum, train_acc_sum, n, batch_count, start = 0.0, 0.0, 0, 0, time.time()for X, y in train_iter:X = X.to(device)y = y.to(device)y_hat = net(X)l = loss(y_hat, y)optimizer.zero_grad()l.backward()optimizer.step()train_l_sum += l.cpu().item()train_acc_sum += (y_hat.argmax(dim=1) == y).sum().cpu().item()n += y.shape[0]batch_count += 1test_acc = evaluate_accuracy(test_iter, net)print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f, time %.1f sec'% (epoch + 1, train_l_sum / batch_count, train_acc_sum / n, test_acc, time.time() - start))

学习率采用0.001,训练算法使用Adam算法,损失函数使用交叉熵损失函数。

lr, num_epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
train(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

(pytorch-深度学习系列)卷积神经网络LeNet-学习笔记相关推荐

  1. 吴恩达 深度学习系列--卷积神经网络(Convolutional Neural Networks)-03(目标检测)

    目标检测 3.1 目标定位(Object localization) 3.1.1概念 3.1.2 监督学习任务定义目标标签y 3.2 特征点检测(Landmark detection) 3.3 基于滑 ...

  2. 深度学习之卷积神经网络 LeNet

    卷积神经网络典型CNN LeNet:最早用于数字识别的CNN LeNet5:现在常说的一般就是LeNet5 AlexNet:2012ILSVRC冠军,远超第二名的CNN,比LeNet更深,用多层小卷积 ...

  3. 迁移学习resnet_ResNet-V1-50卷积神经网络迁移学习进行不同品种的花的分类识别

    运行环境 python3.6.3.tensorflow1.10.0 Intel@AIDevCloud:Intel Xeon Gold 6128 processors集群 数据和模型来源 思路 数据集分 ...

  4. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  5. 【深度学习】卷积神经网络-图片分类案例(pytorch实现)

    前言 前文已经介绍过卷积神经网络的基本概念[深度学习]卷积神经网络-CNN简单理论介绍.下面开始动手实践吧.本文任务描述如下: 从公开数据集CIFAR10中创建训练集.测试集数据,使用Pytorch构 ...

  6. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  7. 深度学习~卷积神经网络(CNN)概述

    目录​​​​​​​ 1. 卷积神经网络的形成和演变 1.1 卷积神经网络结构 1.2 卷积神经网络的应用和影响 1.3 卷积神经网络的缺陷和视图 1.3.1 缺陷:可能错分 1.3.2 解决方法:视图 ...

  8. 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

    目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...

  9. 卷积神经网络(LeNet)——【torch学习笔记】

    卷积神经网络(LeNet) 引用翻译:<动手学深度学习> 我们现在准备把所有的工具放在一起,部署你的第一个全功能卷积神经网络.在我们第一次接触图像数据时,我们将多层感知器应用于Fashio ...

  10. 解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践 魏秀参 著 ISBN:9787121345289 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2018-11-01

最新文章

  1. Android性能优化最佳实践,终局之战
  2. samba升级_潮闻快食 | adidas Originals经典鞋款Samba进化升级,C.E x Nike联名系列全释出!...
  3. 通过Docker或虚拟机快速搭建私有云平台--使用Nextcloud和ONLYOFFICE创建您的WebOffice云办公系统
  4. 服务器需要哪些芯片,云计算的服务器需要芯片
  5. 爬虫 requests 模块
  6. 罗永浩语出惊人怼iPhone;人机大战柯洁再败;三星深圳工厂整体裁撤| CSDN极客头条...
  7. 6.5移相器(Phasers)
  8. 关于onclick中的event对象和element对象
  9. 【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
  10. Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
  11. GitHub 标星 120K+!这些神器仅需一行代码即可下载全网视频!
  12. 动态令牌主要功能是什么???
  13. 【游戏算法】2D游戏中聚光灯效果
  14. spring创建ProcessEngine抛空指针异常
  15. 域服务器修复,重置 Windows 域目录还原(DRSM)密码
  16. RPG游戏《黑暗之光》流程介绍与代码分析之(二):角色创建界面的实现
  17. ​​​​​​​如何离线浏览全国7137GB海量谷歌卫星离线影像
  18. 基于MATLAB的无人机路径规划设计
  19. 360°全景图是什么?
  20. 做全景效果图用哪个软件?3d效果全景图软件如何制作?

热门文章

  1. 哪个html标签用于定义文档的标题,在HTML中,(41)用于定义文档的标题。
  2. Java 线程状态---WAITING(部分转载)
  3. ReactiveCocoa入门
  4. XMLDictionary iOS的XML处理包
  5. AI应用开发基础傻瓜书系列3-损失函数
  6. python脚本自动统计excel_python脚本实现-excel二级统计
  7. python最常用的编程方式是什么_python常用模块和对象编程
  8. fortify hp 价格_惠普推出“惠普Fortify软件安全中心套件”
  9. shell 停止tomcat_Linux停止tomcat运行
  10. 83998 连接服务器出错_来申请一个阿里云服务器玩玩?