[机器学习复习笔记] CNN 卷积神经网络
CNN 卷积神经网络
1. 二维卷积公式(机器学习)
上述公式中,
PS:数学中的卷积和卷积神经网络中的卷积严格意义上是两种不同的运算。卷积神经网络的卷积本质上是一种spatial filter,是互相关运算。简单地说,在机器学习中,卷积核不进行翻转;在数学中,卷积核需要进行翻转。
2. LeNet-5 模型
2.1 LeNet-5 的基本结构

公式
令输入矩阵
-
INPUT 输入层
输入一张 的图片。通常会对输入图像进行预处理(例如像素值归一化) -
卷积层 C1
输入大小:
卷积核种类数:
卷积核大小(kh, kw):
填充(P):
步长(S):
由此,每个卷积核产生一个 的特征图,共 个特征图,神经元数量: -
采样层 S2
输入大小:
采样区域:
采样方式:Max Pooling 最大池化
步长:
由此,输出的 个特征图的大小为 ,神经元数量: -
卷积层 C3
输入大小:
卷积核种类数:
卷积核大小(kh, kw):
填充(P):
步长(S):
由此,每个卷积核产生一个 的特征图,共 个特征图,神经元数量: -
采样层 S4
输入大小:
采样区域:
采样方式:Max Pooling 最大池化
步长:
由此,输出的 个特征图的大小为 ,神经元数量: -
全连接层 C5
C5将每个大小为 的特征图拉成一个长度为400的向量,并通过一个带有120个神经元的全连接层进行连接。120是由LeNet-5的设计者根据实验得到的最佳值。 -
全连接层 F6
输入大小:输入的 的向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过 函数输出
由此输出一个 的向量 -
全连接层 Output
共有 个神经元,分别代表数字 0~9。当神经元 的值为0,则表明识别的结果为数字 。采用的是径向基函数(RBF)的网络连接方式。
3. CNN计算示例

3.1 Conv2d 卷积
以计算O(0, 0, 0) 为例
3.2 ReLU 非线性激活
3.3 Pooling 池化(欠采样/下采样)
一般的有:
-
Max Pooling 最大池化:即每个块里取最大的作为输出的对应元素
-
Average Pooling 平均池化:即计算每一块的平均值作为输出的对应元素
4. LeNet-5 模型代码
#加载库
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 定义LeNet-5模型
class LeNet5(nn.Module):
def __init__(self):
super(LeNet5, self).__init__()
# C1
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1)
# S2
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
# C3
self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1)
# S4
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
# C5
self.fc1 = nn.Linear(in_features=16 * 5 * 5, out_features=120)
# F6
self.fc2 = nn.Linear(in_features=120, out_features=84)
# Output
self.fc3 = nn.Linear(in_features=84, out_features=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 * 5 * 5)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
5. Softmax 和 LogSoftmax
5.1 Softmax
torch.nn.Softmax(dim = 1)
'''
dim = 0: 对每一列的所有元素进行softmax,使得每一列元素和为1
dim = 1: 对每一行的所有元素进行softmax,使得每一行元素和为1
'''
当
由此可以看出每个元素的值域为
但是,在计算过程中,由于存在指数运算,所以可能会导致数值过大,造成 上溢出;也有可能由于数值小数位靠后,精确度不够,导致四舍五入变为0,此时就造成了 下溢出。
5.2 LogSoftmax
torch.nn.LogSoftmax(dim = 1)
公式:
由此可以看出,每个元素的映射到的值域为
参考文章
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17810145.html,未经允许严禁转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构