卷积神经网络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.pswp.cn/diannao/91534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js是实现记住密码自动填充功能

记住密码自动填充使用js实现记住密码功能,在下次打开登陆页面的时候进行获取并自动填充到页面【cookie和localStorage】使用js实现记住密码功能,在下次打开登陆页面的时候进行获取并自动填充到页面【cookie和localStorage】 //添加功能----记住上一个登陆…

【Java】文件编辑器

代码:(SimpleEditor.java)import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.BorderLayout;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.BufferedReader…

PyTorch中torch.topk()详解:快速获取最大值索引

torch.topk(similarities, k=2).indices 是什么意思 torch.topk(similarities, k=2).indices 是 PyTorch 中用于获取张量中最大值元素及其索引的函数。在你的代码中,它的作用是从 similarities 向量里找出得分最高的2个元素的位置索引。 1. 核心功能:找出张量中最大的k个值…

快速搭建本地HTTP服务器:`python -m http.server`详解

文章目录 一、什么是 http.server? 二、基础使用 1. 启动服务器 2. 指定端口 3. 绑定特定IP 三、实际应用场景 1. 本地前端开发 2. 文件共享 3. 启用CGI脚本(高级) 四、目录浏览详解* 五、安全注意事项 六、进阶技巧 1. 后台运行(Linux/macOS) 2. 自定义错误页面 3. 结合其…

运维技术教程之Jenkins上的known_hosts文件

在Jenkins中,known_hosts文件用于存储已验证的远程节点主机密钥,避免每次连接时重复验证。以下是基于不同场景的解决方案:1. 创建并配置 known_hosts 文件 若Jenkins提示 No Known Hosts file 或找不到文件,需手动创建并配置&…

leetcode 3201. 找出有效子序列的最大长度 I 中等

给你一个整数数组 nums。nums 的子序列 sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列:(sub[0] sub[1]) % 2 (sub[1] sub[2]) % 2 ... (sub[x - 2] sub[x - 1]) % 2返回 nums 的 最长的有效子序列 的长度。一个 子序列 指的…

Java并发编程第三篇(深入解析Synchronized)

1. Synchronized简介:一个常见的并发“陷阱” 在正式开始学习新知识前,我们不妨先来看一个现象,这是一个很多并发编程新手都会遇到的“陷阱”: public class SynchronizedDemo implements Runnable {// 共享变量private static in…

Chatbox AI|多模型多模态交互+MCP,一个工具打造你的全能私人助手

ChatBoxAI集成GPT-4、Claude等顶尖模型,支持Windows/macOS/Linux多平台,具备隐私加密、文件智能解析(PDF/代码/图片)及开发者友好特性。其应用覆盖自媒体创作、代码实时预览、AI绘图(封面/表情包)及联网搜索…

在Autodl服务器中使用VNC建立图形界面

在Autodl服务器中使用VNC建立图形界面**AutoDL 3D 图形桌面搭建教程****第一步:安装桌面和 VNC****第二步:进行一次性配置****第三步:日常启动与使用**AutoDL 3D 图形桌面搭建教程 目标: 在你的 AutoDL 环境上,以最少的步骤搭建一…

CD54.【C++ Dev】vector和list的反向迭代器的实现

目录 1.反向迭代器的功能 2.算法 方法1:新写一个类用于反向迭代器 方法2:封装正向迭代器实现反向迭代器 解析operator* 正向迭代器和反向迭代器的关系 返回 *--tmp的原因 3.为自制的vector和list编写反向迭代器 编写统一的反向迭代器 修改vector头文件 修改list头文…

如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题 摘要 在日常 Django 项目开发中,最常见的“拦路虎”之一就是 ModuleNotFoundError: No module named django。该异常通常在以下场景出…

单页面和多页面的区别和优缺点

单页面应用(SPA)与多页面应用(MPA)的区别单页面应用(SPA)整个应用只有一个HTML文件,内容通过JavaScript动态加载和渲染。页面切换时无需重新加载整个页面,仅更新部分DOM。依赖前端框…

暑期自学嵌入式——Day05(C语言阶段)

接续上文:暑期自学嵌入式——Day04(C语言阶段)-CSDN博客 点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 主页: 一位搞嵌入式的 genius-CSDN博客 …

通用人工智能AGI遥遥无期,面临幻灭

通用人工智能AGI有可能2080年前也实现不了 首先说一下,目前的人工智能方向是错的,通用人工智能不值得追捧。 真的特别无奈,现在还有很多人在吹AI,说什么2027年就能实现AGI,如果你指的是真正的强人工智能AGI&#xff0c…

智能体开发工具链全景图:IDE、调试器与监控平台

智能体开发工具链全景图:IDE、调试器与监控平台 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

三十四、【扩展工具篇】JSON 格式化与解析:集成 Monaco Editor 打造在线 JSON 工具

三十四、【扩展工具篇】JSON 格式化与解析:集成 Monaco Editor 打造在线 JSON 工具 前言 功能概览 技术选型 实现步骤 第一步:添加路由和侧边栏菜单入口 第二步:创建 JSON 工具页面 第三部分:全面测试与验证 总结 前言 在日常的接口开发和测试中,我们经常需要处理 JSON 数…

MySQL高可用集群架构:主从复制、MGR与读写分离实战

1. MySQL高可用架构概述 MySQL高可用性(High Availability)解决方案旨在确保数据库服务在硬件故障、网络问题等异常情况下仍能持续提供服务。以下是主流的高可用方案对比: 方案 原理 优点 缺点 适用场景 主从复制 基于binlog的异步复制 简单易用,对性能影响小 数据一致性弱,…

JxBrowser 7.43.5 版本发布啦!

在此版本中,我们进行了错误修复和稳定性改进。 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

借助AI学习开源代码git0.7之编译和使用

如何学习优秀的开源代码?目前大部分的优秀开源代码,代码量都已经非常庞大,比如git。以git为例,git最新版本代码有279814行, 而git0.7版本已经大部分实现了现在git版本的基本功能,而代码量却只有4950行&…

ObservableCollection全面解析

本文仅作为参考大佬们文章的总结。 ObservableCollection是C#中一个功能强大的动态数据集合类,特别适用于需要数据绑定和UI自动更新的场景。本文将系统性地总结ObservableCollection的核心概念、使用方法、性能优化策略以及在实际项目中的应用实践。 一、Observab…