图像分类(上):图像分类原理与图像分类模型
一、课程背景
本节课是《PyTorch深度学习实战》实战环节的开篇,先学习图像分类的理论知识,掌握图像分类原理和常见卷积神经网络;下节课再基于原理完成一个完整的图像分类项目实践。[pdf_18]
生活中的例子:很多智能手机照相时自动给照片内容打上标签(如"多云"),还能根据识别内容推荐美化方案。这背后的技术就是卷积神经网络最常用、最广泛且最基本的一个应用——图像分类。[pdf_18]
二、图像分类原理
需求场景
线上每天有大量图片上传,需设计一个模型自动找出包含极客时间 Logo 的图片。[pdf_18]
模型功能
模型接收一张图片,输出一组概率——该图片为 Logo 的概率与该图片为其他图片(Other)的概率,通过概率判断图片类别。[pdf_18]
图片 → [模型] → [Logo prob, Other prob] → 判断分类
三、感知机(Perceptron)
基本结构
-
神经元:感知机的最基本组成单元,每个神经元是关于输入的一个线性变换 -
多层感知机:有多层神经元的网络结构,是卷积神经网络的前身
神经元计算公式
|
|
|
|---|---|
|
|
|
|
|
|
| 激活函数
|
局限
参数量大、难以训练,曾导致发展停滞,直到卷积神经网络的出现打破僵局。[pdf_18]
四、Softmax:将数值转换为概率
作用
将一组数值转换为对应的概率,概率和为1。[pdf_18]
计算公式
PyTorch 代码实现
import torch
import torch.nn as nn
# 2 个神经元的输出 y 的数值为
y = torch.randn(2)
print(y)
# 输出: tensor([ 0.2370, 1.7276 ])
m = nn.Softmax(dim=0)
out = m(y)
print(out)
# 输出: tensor([ 0.1838, 0.8162 ])
★原始 y 中最大的值具有最大的概率。Softmax 不是每个问题都会使用,有时也会使用 sigmoid 激活函数(将1个数值转换为0到1之间的概率)。[pdf_18]
五、全连接层(Full Connection Layer,fc 层)
位置与作用
-
一般放在卷积神经网络的最末端 -
用来获得最终输出——各个类别的概率[pdf_18]
重要特点
由于全连接层中神经元的个数是固定的,输入图片必须固定尺寸。现实中的图片尺寸不同,需要先统一尺寸,PyTorch 才能进一步处理。[pdf_18]
PyTorch 实现(假设输入 resize 到 128x128)
fc = nn.Linear(128 * 128, 2) # in_features=128x128, out_features=2
y = fc(x)
print(y)
# 输出: tensor([[ 72.1361, -120.3565 ]], grad_fn=<AddmmBackward>)
output = nn.Softmax(dim=1)(y)
print(output)
# 输出: tensor([[ 1., 0. ]], grad_fn=<SoftmaxBackward>)
nn.Linear 重要参数
|
|
|
|---|---|
in_features |
|
out_features |
|
bias |
|
接收任意尺度输入的方法
在最后的特征图后面加一个全局平均池化(Global Average Pooling),将每个特征图求平均,用平均值代替特征图。这样无论输入尺度是多少,进入全连接层的数据量都是固定的。[pdf_18]
六、卷积神经网络(CNN)
核心作用
提取输入图片的丰富信息,然后对接上层应用(如图片分类)。[pdf_18]
图像分类模型完整结构
输入层 → 卷积层(CNN) → 全连接层 → Softmax → 输出概率
★工作重点:整个模型的重点全都在卷积神经网络那块![pdf_18]
七、ImageNet 与经典网络结构
ImageNet 简介
业界标杆,用于评价模型的好与坏。从2010年开始每年举办 ILSVRC 挑战赛(图像分类、目标检测、图像分割等任务),其中图像分类比赛使用 1000 个类别的庞大数据集。[pdf_18]
历年 ImageNet Top-5 错误率
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
AlexNet |
|
|
|
VGG |
|
|
|
GoogLeNet |
|
|
|
ResNet |
|
|
|
SENet |
|
|
|
Human |
|
★Top-1:预测概率最大的类别正确即预测正确;Top-5:前5大概率中包含正确类别即预测正确。[pdf_18]
1. VGG
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
突破重点:[pdf_18]
-
证明了模型深度增加,效果也会越来越好 -
使用较小的 3x3 卷积代替大卷积核(AlexNet 中的 11x11、7x7、5x5) -
5x5 卷积 → 2层 3x3 卷积替换 -
7x7 卷积 → 3层 3x3 卷积替换 -
好处:减少网络参数 + 相同感受野下加深网络层数,提取更丰富的非线性信息
2. GoogLeNet(Inception)
|
|
|
|---|---|
|
|
|
|
|
Inception 模块
|
|
|
|
|
|
|
解决的问题:同一类别的图片中,主要物体在不同图片中所占区域大小不同。标准卷积只能以相同尺寸的卷积核提取特征。[pdf_18]
Inception 模块方案:拆分为使用 1x1、3x3、5x5 以及 3x3 的 max pooling 同时进行特征提取,再合并到一起,实现多尺度方式提取图片特征。[pdf_18]
优化改进:在 3x3、5x5 之前与 pooling 之后添加 1x1 卷积用来降维,降低计算成本。[pdf_18]
★面试常考知识点:1x1 卷积的作用——升维或者降维。维度指特征的通道数,1x1 卷积相当于对同一位置不同通道上的像素做线性组合,从而控制特征通道数。[pdf_18]
3. ResNet(残差神经网络)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
网络退化问题
单纯增加网络深度会引发:
-
模型容易过拟合 -
梯度消失、梯度爆炸问题
即使解决了上述问题,简单的堆叠卷积层依然不能获得很好效果。[pdf_18]
实验验证:搭建普通20层与56层卷积神经网络在CIFAR-10上验证,无论训练集还是测试集误差,56层均高于20层。
网络退化定义:网络可以收敛时,随着层数增加,精度逐渐饱和并迅速降低。原因不是过拟合(如果是过拟合,56层在训练集上的精度应高于20层)。[pdf_18]
作者猜想:网络不容易学习到恒等映射( )。[pdf_18]
残差学习
核心思想:因为网络不容易学习到恒等映射,所以强制添加一个恒等映射。[pdf_18]
实现机制:通过 shortcut connection(捷径连接) 机制完成,即恒等变换。包含 shortcut connection 的几层网络称为残差块。[pdf_18]
残差块定义:
其中 可以是 2 层或 3 层的卷积层。通过残差块,就可以训练出更深、更优秀的卷积神经网络。[pdf_18]
┌──────────────────┐
x ────→ [weight layer] ──→ [relu] ──→ [weight layer] ──→ F(x)
│ │
└─────────────── identity (shortcut) ───────────────────┘
↓
y = F(x) + x
↓
[relu]
八、全课小结
|
|
|
|---|---|
| 图像分类原理 |
|
| 感知机 → 多层感知机 |
|
| Softmax |
|
| 全连接层(fc层) |
|
| 全局平均池化 |
|
| 卷积神经网络 |
|
| ImageNet |
|
| VGG |
|
| GoogLeNet |
|
| ResNet |
|
经典网络结构脉络
AlexNet(2012)→ VGG(2014)→ GoogLeNet(2014)→ ResNet(2015)→ SENet(2017)
-
工作中很少从0到1自创网络,常在经典设计基础上做自定义配置 -
纵观网络结构发展,长江后浪推前浪,一代更比一代强[pdf_18]

