卷积神经网络(Convolutional Neural Network, CNN)是深度学习中一种非常重要的模型结构,特别擅长处理图像数据。CNN 通过卷积操作和池化操作来自动提取图像的特征,并使用全连接层进行分类或回归等任务。
CNN 主要由以下几部分组成:
定义: 卷积操作是用一个小的卷积核在输入数据上滑动,通过点积计算生成一个新的特征图。卷积核是一个固定大小的权重矩阵,它通过学习能够提取图像的边缘、纹理等特征。
解释: 可以将卷积操作想象成一个“特征探测器”,它在图像上滑动,寻找特定的模式(例如边缘、角点等)。
代码示例:
import torch
import torch.nn as nn
# 定义一个 2D 卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=1)
# 创建一个示例输入 (1, 1, 5, 5),表示 1 张单通道的 5x5 图像
input_data = torch.tensor([[[[1.0, 2.0, 3.0, 4.0, 5.0],
[6.0, 7.0, 8.0, 9.0, 10.0],
[11.0, 12.0, 13.0, 14.0, 15.0],
[16.0, 17.0, 18.0, 19.0, 20.0],
[21.0, 22.0, 23.0, 24.0, 25.0]]]])
# 进行卷积操作
output = conv_layer(input_data)
print(f"卷积层输出: \n{
output}")
定义: ReLU(Rectified Linear Unit)是一种常用的激活函数,输出为输入值与零的最大值。
解释: ReLU 可以看作是“开启”或“关闭”神经元的开关,只有大于零的值才能通过。
代码示例:
relu = nn.ReLU()
# 使用 ReLU 激活函数
activated_output = relu(output)
print(f"ReLU 激活后的输出: \n{
activated_output}")
定义: 池化操作通过下采样减少特征图的尺寸,常见的池化方式有最大池化(Max Pooling)和平均池化(Average Pooling)。
解释: 池化操作可以理解为信息压缩,将特征图中的重要信息保留,同时减少数据量和计算量。
代码示例:
pool_layer = nn.MaxPool2d(kernel_size=2, stride=2)
# 进行池化操作
pooled_output = pool_layer(activated_output)
print(f"池化层输出: \n{
pooled_output}")
定义: 全连接层将池化后的特征图展平为一维向量,并通过线性变换得到最终的输出。它通常用于分类或回归任务。
解释: 全连接层就像是一个决策器,根据提取到的特征做出最终的判断。
代码示例:
flattened_output = pooled_output.view(-1, 1 * 2 * 2) # 展平
fc_layer = nn.Linear(4, 1) # 定义全连接层
final_output = fc_layer(flattened_output)
print(f"全连接层输出: {
final_output.item()}")
以下是一个简单的 CNN 的完整实现,它包括一个卷积层、ReLU 激活函数、池化层和全连接层。
import torch
import torch.nn as nn
import torch.nn.functional as F
# 定义一个简单的 CNN
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(10 * 4 * 4, 1) # 假设输入图像为8x8大小
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = x.view(-1, 10 * 4 <