当前位置: 首页 > news >正文

卷积神经网络CNN的Python实现

一、环境准备与库导入

在开始实现卷积神经网络之前,需要确保开发环境已正确配置,并导入必要的Python库。常用的深度学习框架有TensorFlow和PyTorch,本示例将基于Keras(可使用TensorFlow后端)进行实现,因为Keras具有简洁易用的特点,适合快速构建和实验模型。

1.安装依赖库

确保已安装以下Python库:

pip install numpy matplotlib tensorflow
2.导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import Adam

二、数据集准备

卷积神经网络通常用于处理图像数据,因此选择一个合适的数据集至关重要。MNIST数据集是一个经典的手写数字识别数据集,包含60,000个训练样本和10,000个测试样本,每个样本为28x28像素的灰度图像。

1.加载数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
2.数据预处理
  • 归一化:将像素值缩放到[0,1]范围内,以加快模型收敛速度。
  • 独热编码:将标签转换为独热编码形式,以适应多分类问题的损失函数。
# 归一化
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0# 添加通道维度(Keras期望输入形状为(样本数, 高, 宽, 通道))
train_images = np.expand_dims(train_images, axis=-1)
test_images = np.expand_dims(test_images, axis=-1)# 独热编码
train_labels = to_categorical(train_labels, num_classes=10)
test_labels = to_categorical(test_labels, num_classes=10)

三、模型构建

卷积神经网络的核心结构包括卷积层、池化层和全连接层。下面通过Keras的Sequential API构建一个简单的CNN模型。

1.模型架构设计
model = Sequential([# 第一层卷积层,使用32个3x3的滤波器,激活函数为ReLUConv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),# 第一层池化层,采用2x2的最大池化MaxPooling2D(pool_size=(2, 2)),# 第二层卷积层,使用64个3x3的滤波器Conv2D(64, kernel_size=(3, 3), activation='relu'),# 第二层池化层MaxPooling2D(pool_size=(2, 2)),# 展平层,将多维特征图转换为一维向量Flatten(),# 全连接层,包含128个神经元Dense(128, activation='relu'),# 输出层,使用softmax激活函数进行多分类Dense(10, activation='softmax')
])
2.模型编译

在编译模型时,需要指定损失函数、优化器和评估指标。对于多分类问题,常用的损失函数是categorical_crossentropy,优化器可以选择Adam,评估指标通常包括准确率。

model.compile(optimizer=Adam(),loss='categorical_crossentropy',metrics=['accuracy'])

四、模型训练

模型训练是调整模型参数以最小化损失函数的过程。在Keras中,可以使用fit方法进行训练。

1.设置训练参数
epochs = 10  # 训练轮数
batch_size = 128  # 每批次样本数
2.执行训练
history = model.fit(train_images, train_labels,epochs=epochs,batch_size=batch_size,validation_split=0.2)  # 使用20%的训练数据作为验证集

五、模型评估与可视化

训练完成后,需要评估模型在测试集上的性能,并通过可视化手段分析训练过程。

1.评估模型性能
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
2.绘制训练与验证的准确率和损失曲线
# 提取历史数据
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']# 绘制准确率曲线
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Accuracy over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()# 绘制损失曲线
plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Loss over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()plt.show()

六、模型改进策略

虽然上述简单的CNN模型在MNIST数据集上能够取得不错的效果,但仍有改进空间。以下是一些常见的模型优化方法:

1.数据增强

通过随机旋转、平移、缩放等操作增加训练数据的多样性,从而提高模型的泛化能力。

from tensorflow.keras.preprocessing.image import ImageDataGeneratordatagen = ImageDataGenerator(rotation_range=10,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.1)model.fit(datagen.flow(train_images, train_labels, batch_size=batch_size),epochs=epochs,validation_data=(test_images, test_labels))
2.添加Dropout层

在全连接层中加入Dropout层,随机丢弃一部分神经元,减少过拟合风险。

from tensorflow.keras.layers import Dropoutmodel = Sequential([# ...(前面的层保持不变)Flatten(),Dense(128, activation='relu'),Dropout(0.5),  # 丢弃50%的神经元Dense(10, activation='softmax')
])
3.调整网络结构

增加卷积层的数量或滤波器的大小,以提取更复杂的特征。例如,可以添加第三层卷积层:

model = Sequential([# ...(前面的层保持不变)Conv2D(128, kernel_size=(3, 3), activation='relu'),MaxPooling2D(pool_size=(2, 2)),Flatten(),Dense(128, activation='relu'),Dropout(0.5),Dense(10, activation='softmax')
])

七、完整代码示例

以下是整合上述步骤的完整代码示例:

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 加载数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据预处理
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0
train_images = np.expand_dims(train_images, axis=-1)
test_images = np.expand_dims(test_images, axis=-1)
train_labels = to_categorical(train_labels, num_classes=10)
test_labels = to_categorical(test_labels, num_classes=10)# 构建模型
model = Sequential([Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),MaxPooling2D(pool_size=(2, 2)),Conv2D(64, kernel_size=(3, 3), activation='relu'),MaxPooling2D(pool_size=(2, 2)),Flatten(),Dense(128, activation='relu'),Dropout(0.5),Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer=Adam(),loss='categorical_crossentropy',metrics=['accuracy'])# 数据增强
datagen = ImageDataGenerator(rotation_range=10,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.1)# 训练模型
history = model.fit(datagen.flow(train_images, train_labels, batch_size=128),epochs=10,validation_data=(test_images, test_labels))# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')# 可视化训练过程
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Accuracy over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Loss over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()plt.show()

http://www.dtcms.com/a/283594.html

相关文章:

  • 学习软件测试的第十七天
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(6):语法+单词)
  • github上传大文件(多种解决方案)
  • ESP32 S3 基于 Arduino 实现局域网视频流传输全解析
  • 激活函数LeakyReLU
  • C语言:第07天笔记
  • Python+Selenium自动化
  • Kotlin集合聚合
  • --- bean 的六种作用域 ---
  • Hadoop(三)
  • Doris基础-架构、数据模型、数据划分
  • SpringBoot集成Minio存储文件,开发图片上传等接口
  • 【机器学习【6】】数据理解:数据导入、数据审查与数据可视化方法论
  • 【JavaScript】从事件流到事件委托
  • 6.删除-demo
  • akamai3简单分析
  • 【无标题】LighthouseGS:面向全景式移动拍摄的室内结构感知三维高斯泼溅
  • OJ题目里面的复杂图形的输出类型的汇总展示(巧妙地利用对称性offset偏移量)
  • “重复”定义函数的睿智(Python/与ai助手“智普清言”深度交流)
  • 如何进行选择。
  • 第四章 OB SQL调优
  • OpenVela之 Arch Timer 驱动框架使用指南
  • GESP2025年6月认证C++四级( 第三部分编程题(2)排序)
  • 机器学习中Precision(查准率)和Recall(查全率)
  • 第2章通用的高并发架构设计——2.3 高并发读场景方案2:本地缓存
  • nftables的配置与使用
  • sqlite3_exec函数练习
  • 多维动态规划题解——最小路径和【LeetCode】记忆化搜索翻译为递推写法
  • # Win11开机卡死?无法进入登录界面?3招强制进安全模式,快速修复系统
  • 亚马逊广告深度优化:如何平衡大词与小词的投放,提升转化率?