卷积神经网络(CNN)是一种专门用于处理具有类似网格结构数据的深度学习模型,例如图像(2D网格的像素)和时间序列数据(1D网格的信号强度)。CNN在图像识别、图像分类、物体检测、语音识别等领域有着广泛的应用。
CNN的核心特点包括局部连接和权值共享:
- 局部连接意味着每个神经元只与输入数据的一个局部区域相连,这大大减少了参数的数量,提高了计算效率;
- 权值共享是指在卷积层中,相同的卷积核被用于整个输入数据,这不仅进一步减少了参数数量,还使得模型具有平移不变性,即无论物体出现在图像的哪个位置,都能被识别出来。
CNN的基本结构包括输入层、卷积层、激活函数、池化层、全连接层和输出层:
- 输入层接收原始图像数据;
- 卷积层通过卷积操作提取图像的特征;
- 激活函数引入非线性,增强模型的表达能力;
- 池化层通过下采样减少数据量,同时保留重要特征,增强模型的鲁棒性,此外多层卷积和池化层的堆叠使得模型能够逐层提取更高层次的特征;
- 全连接层将前面各层提取的特征综合起来,用于最终的分类或回归任务。
这种结构使得CNN特别适合处理图像数据,能够自动学习图像中的复杂特征,实现高效准确的图像识别。
本文展示了几种CNN网络结构在图像或文本分类中的应用,包含以下内容:
- LeNet的搭建和应用
- 微调预训练的VGG16网络
- TextCNN的搭建和应用
一、LeNet的搭建和应用
LeNet是早期最经典的卷积神经网络,由 Yann LeCun 等人在 1998 年提出,最初用于手写数字识别(MNIST 数据集),取得了十分显著的效果,其网络结构如图所示:

代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import Adam
import torch.utils.data as Data
import torchvision
from torchvision import models, transforms, datasets
from process import classify # procss的代码见:https://blog.youkuaiyun.com/moyao_miao/article/details/141466047
class LeNet(nn.Module):
"""
LeNet模型
"""
def __init__(self, size):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool1 = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.pool2 = nn.MaxPool2d(2, 2)
s = size // 4 - 3
self.fc1 = nn.Linear(16 * s * s, 120)
self.fc2 = nn.Linear(120, 84)
self.output = nn.Linear(84, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool1(x)
x = F.relu(self.conv2(x))
x = self.pool2(x)
x = x.view(x.size(0), -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
output = self.output(x)
return output
使用MNIST数据集训练模型:
if __name__ == '__main__':
train_data = torchvision.datasets.MNIST(
root=r"C:\Users\57158\data\MNIST",
train=True,
transform=transforms.ToTensor(),
download=False,
)
test_data = torchvision.datasets.MNIST(
root=r"C:\Users\57158\data\MNIST",
train=False,
tra