「深度学习一遍过」必修23:基于ResNet18的MNIST手写数字识别

本文详细介绍了2015年微软提出的ResNet18在MNIST手写数字识别中的应用,涉及网络结构、跳层连接原理及PyTorch实现。通过实际代码展示,助你掌握深度学习入门模型设计。

本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。
专栏地址:「深度学习一遍过」必修篇 

目录

项目 GitHub 地址

项目心得

项目代码


项目 GitHub 地址

Classic_model_examples/2015_ResNet18_MNIST at main · zhao302014/Classic_model_examples · GitHubContribute to zhao302014/Classic_model_examples development by creating an account on GitHub.https://github.com/zhao302014/Classic_model_examples/tree/main/2015_ResNet18_MNIST

项目心得

  • 2015 年——ResNet:这是由微软研究院的 Kaiming He 等四名华人提出,通过使用 ResNet Unit 成功训练出了更深层次的神经网络。该项目自己搭建了 ResNet18 网络并在 MNIST 手写数字识别项目中得到了应用。通过此次实践,我终于知道了跳层连接是如何连接的了:ResNet “跳层链接” 的代码体现在相同大小和相同特征图之间用 “+” 相连,而不是 concat。concat 操作常用于 inception 结构中,具体而言是用于特征图大小相同二通道数不同的通道合并中,而看起来简单粗暴的 “+” 连接方式则是用于 ResNet 的 “跳层连接” 结构中,具体而言是用于特征图大小相同且通道数相同的特征图合并。这让我想到一句古诗:“绝知此事要躬行” 啊!

项目代码

下面这张图是网上找的,描述的细节是真的赞!

图片来源:resnet18 50网络结构以及pytorch实现代码 - 简书 

net.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
# ------------------------------------------------- #
#      作者:赵泽荣
#      时间:2021年9月10日(农历八月初四)
#      个人站点:1.https://zhao302014.github.io/
#              2.https://blog.youkuaiyun.com/IT_charge/
#      个人GitHub地址:https://github.com/zhao302014
# ------------------------------------------------- #
import torch
import torch.nn as nn
import torch.nn.functional as F

# --------------------------------------------------------------------------------- #
#  自己搭建一个 ResNet18 模型结构
#   · 提出时间:2015 年(作者:何凯明)
#   · ResNet 解决了深度 CNN 模型难训练的问题
#   · ResNet 在 2015 名声大噪,而且影响了 2016 年 DL 在学术界和工业界的发展方向
#   · ResNet 网络是参考了 VGG19 网络,在其基础上进行了修改,并通过短路机制加入了残差单元
#   · 变化主要体现在 ResNet 直接使用 stride=2 的卷积做下采样,并且用 global average pool 层替换了全连接层
#   · ResNet 的一个重要设计原则是:当 feature map 大小降低一半时,feature map 的数量增加一倍,这保持了网络层的复杂度
#   · ResNet18 的 18 指定的是带有权重的 18 层,包括卷积层和全连接层,不包括池化层和 BN 层
#   · ResNet “跳层链接” 的代码体现在相同大小和相同特征图之间用 “+” 相连,而不是 concat
# --------------------------------------------------------------------------------- #
class MyResNet18(nn.Module):
    def __init__(self):
        super(MyResNet18, self).__init__()
        # 第一层:卷积层
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=2, padding=3)
        self.bn1 = nn.BatchNorm2d(64)
        # Max Pooling 层
        self.s1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        # 第二、三层:“实线”卷积层
        self.conv2 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(64)
        
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣仔!最靓的仔!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值