Python CNN卷积神经网络实例讲解

本文介绍了如何使用Python和Keras库实现一个简单的卷积神经网络,用于MNIST数据集的手写数字分类,包括数据准备、模型构建、训练与评估过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卷积神经网络(Convolutional Neural Network,CNN)是一种常用于图像识别、语音识别和自然语言处理等领域的神经网络模型。在本文中,我们将介绍如何用 Python 实现一个简单的卷积神经网络,来对手写数字进行分类。

1. 数据集准备

我们将使用 MNIST 数据集,这是一个由手写数字图片组成的经典数据集。在 Python 中,可以通过 tf.keras.datasets.mnist 模块来加载 MNIST 数据集。

import tensorflow as tf

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# 将像素值归一化到 0~1 之间
x_train, x_test = x_train / 255.0, x_test / 255.0

2. 搭建卷积神经网络模型

我们将会使用 Keras 来搭建卷积神经网络模型。在 Keras 中,可以通过 tf.keras.Sequential 类来创建序列模型。我们将在模型中使用 2 个卷积层和 2 个池化层,最后接上一个全连接层和一个输出层,来对手写数字进行分类。

# 创建一个序列模型
model = tf.keras.Sequential([
    # 第一层卷积层,32 个 3x3 的卷积核,激活函数为 relu
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    # 第一层池化层,2x2 窗口大小
    tf.keras.layers.MaxPooling2D((2, 2)),
    # 第二层卷积层,64 个 3x3 的卷积核,激活函数为 relu
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    # 第二层池化层,2x2 窗口大小
    tf.keras.layers.MaxPooling2D((2, 2)),
    # 将特征张量展开成一维向量
    tf.keras.layers.Flatten(),
    # 全连接层,128 个神经元,激活函数为 relu
    tf.keras.layers.Dense(128, activation='relu'),
    # 输出层,10 个神经元,激活函数为 softmax
    tf.keras.layers.Dense(10, activation='softmax')
])

3. 编译模型并训练

在训练之前,我们需要先编译模型,为模型指定损失函数、优化器和评估指标。我们将使用交叉熵作为损失函数,Adam 作为优化器,并评估模型的精度(accuracy)指标。

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train[..., tf.newaxis], y_train, epochs=5,
          validation_data=(x_test[..., tf.newaxis], y_test))

4. 模型评估与预测

训练完成后,我们可以使用测试集来评估模型的性能。

# 评估模型
model.evaluate(x_test[..., tf.newaxis], y_test, verbose=2)

此外,我们还可以使用模型来进行预测,对新的手写数字进行分类。

# 对手写数字进行分类
import numpy as np
from PIL import Image

# 加载一个手写数字图片
image = Image.open('test.png').convert('L')
image = image.resize((28, 28))
image_arr = np.array(image)

# 对图片进行归一化
image_arr = image_arr / 255.0

# 对图片进行预处理,增加一个维度
input_data = image_arr.reshape(1, 28, 28, 1)

# 进行预测
prediction = model.predict(input_data)
print('预测结果为:', np.argmax(prediction))

至此,我们已经成功实现并训练了一个简单的卷积神经网络模型,用于手写数字的分类。

### CNN卷积神经网络代码实现与解释 #### 使用TensorFlow/Keras构建CNN模型 下面是一个简单的CNN模型实例,该模型适用于图像分类任务。此示例展示了如何利用`tensorflow.keras`模块创建一个基础的卷积神经网络。 ```python import tensorflow as tf from tensorflow.keras import layers, models # 定义CNN架构 model = models.Sequential() # 添加第一个卷积层和最大池化层 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) # 增加更多卷积层以提取更复杂的特征模式 model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) # 将三维张量展平成一维向量以便于后续处理 model.add(layers.Flatten()) # 连接全连接层(密集层) model.add(layers.Dense(64, activation='relu')) # 输出层,假设为10类别的分类问题 model.add(layers.Dense(10)) # 编译模型并指定损失函数、优化器以及评估指标 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 打印模型概要信息 print(model.summary()) ``` 这段代码定义了一个典型的CNN结构,包含了多个卷积层、激活函数、池化操作以及最终的全连接层[^1]。每一层都负责特定的任务: - **Conv2D**: 应用二维卷积滤波器到输入数据上,用于检测局部特征。 - **MaxPooling2D**: 对特征图执行下采样操作,减少参数数量的同时保留重要特性。 - **Flatten**: 把多维度的数据转换成一维数组形式,方便送入后面的全连接层。 - **Dense**: 构建标准的人工神经元网络层,通常位于顶层作为分类器的一部分。 #### 使用PyTorch构建CNN模型 同样的功能也可以通过PyTorch来完成,以下是对应的实现方式: ```python import torch.nn as nn import torch.optim as optim class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 卷积层配置 self.conv_layers = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1), nn.ReLU() ) # 全连接层设置 self.fc_layers = nn.Sequential( nn.Linear(64 * 7 * 7, 64), nn.ReLU(), nn.Linear(64, 10) ) def forward(self, x): batch_size = x.size(0) # 处理卷积部分 x = self.conv_layers(x) # 展开至线性层所需的形状 x = x.view(batch_size, -1) # 经过全连接层得到预测结果 logits = self.fc_layers(x) return logits # 初始化模型对象 net = SimpleCNN() # 设置损失函数与优化算法 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=0.001) # 显示模型结构详情 print(net) ``` 上述两段代码分别基于TensorFlow和PyTorch实现了相同的CNN逻辑[^4]。两者的主要区别在于API的设计风格不同——前者更加面向高层次抽象,后者则提供了更大的灵活性给开发者自定义组件间的交互流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚公搬程序

你的鼓励将是我们最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值