首页 > 编程语言 >用 Python 开发卷积神经网络全解析

用 Python 开发卷积神经网络全解析

时间:2024-11-12 15:46:39浏览次数:3  
标签:训练 Python 模型 卷积 神经网络 test model 数据

一、准备工作
安装必要的库
在 Python 中开发卷积神经网络,我们通常会用到几个非常重要的库,比如 TensorFlow 和 Keras。TensorFlow 是一个功能强大的开源机器学习框架,而 Keras 是构建在 TensorFlow 之上的高级神经网络 API,它让模型的搭建和训练变得更加简洁直观。
可以使用以下命令来安装它们(假设你已经安装好了 Python 和 pip 包管理器):

pip install tensorflow keras
导入相关库
在 Python 代码中,我们首先要导入需要用到的库:
python
Copy
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

这里,tf 是 TensorFlow 的缩写引用,方便后续调用其中的函数和类。keras 是专门用于构建神经网络模型的模块,layers 则包含了各种神经网络层的定义,像我们后面会用到的卷积层、池化层等。np 是 numpy 的缩写,它用于处理数值数组,在数据预处理等环节会经常用到。
二、数据准备
加载数据集(以 MNIST 手写数字数据集为例)
MNIST 数据集是一个非常经典的手写数字图像数据集,常用于图像识别相关的入门学习和实验。

# 加载 MNIST 数据集,它会自动下载(如果本地没有的话)并划分训练集和测试集
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

这里返回了两个元组,分别对应训练数据和测试数据。x_train 和 x_test 是图像数据,形状为 (样本数量, 图像高度, 图像宽度),对于 MNIST 来说,图像是单通道(灰度图)的,每个像素值在 0 - 255 之间。y_train 和 y_test 则是对应的标签数据,也就是每个图像实际代表的数字(0 - 9)。
数据预处理
在将数据输入到卷积神经网络之前,通常需要对数据进行预处理,使其更适合模型的学习。

# 对训练集图像数据进行归一化,将像素值从 0-255 映射到 0-1 之间
x_train = x_train.astype('float32') / 255.0
# 对测试集图像数据做同样的归一化操作
x_test = x_test.astype('float32') / 255.0

# 将训练集标签数据进行独热编码,例如数字 3 会被编码为 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
y_train = keras.utils.to_categorical(y_train, num_classes=10)
# 对测试集标签数据也进行独热编码
y_test = keras.utils.to_categorical(y_test, num_classes=10)

数据归一化有助于模型更快更好地收敛,而独热编码能让标签数据以更合适的形式被模型处理,符合分类任务的要求。
三、构建卷积神经网络模型
接下来就是激动人心的构建卷积神经网络模型的环节啦!

# 创建一个顺序模型,它是 Keras 中构建简单线性堆叠模型的便捷方式
model = keras.Sequential()

# 添加第一个卷积层
# filters=32 表示卷积核的数量,也就是输出的特征图数量
# kernel_size=(3, 3) 表示卷积核的大小是 3x3 的正方形
# activation='relu' 使用 ReLU 作为激活函数,给输出引入非线性因素
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))

# 添加一个最大池化层,pool_size=(2, 2) 表示池化窗口大小为 2x2
# 它的作用是减少数据维度,同时保留重要特征
model.add(layers.MaxPooling2D(pool_size=(2, 2)))

# 再添加一个卷积层,增加特征提取的深度和复杂度
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# 再添加一个最大池化层
model.add(layers.MaxPooling2D(pool_size=(2, 2)))

# 将多维数据展平为一维向量,以便连接后面的全连接层
model.add(layers.Flatten())

# 添加一个全连接层,有 128 个神经元,使用 ReLU 激活函数
model.add(layers.Dense(128, activation='relu'))

# 添加输出层,num_classes=10 对应 10 个数字分类类别,使用 softmax 激活函数进行概率输出
model.add(layers.Dense(10, activation='softmax'))

这个简单的卷积神经网络模型结构包含了卷积层用于提取图像特征、池化层用于降维和减少计算量、全连接层用于整合特征并进行分类判断,最后通过 softmax 激活函数输出每个类别对应的概率。
四、编译模型
在训练模型之前,我们需要对模型进行编译,配置一些训练相关的参数。

# 选择优化器,这里使用 Adam 优化器,它能自适应地调整学习率
optimizer = tf.keras.optimizers.Adam()

# 定义损失函数,对于多分类任务,常用的是 categorical_crossentropy(分类交叉熵)
loss = 'categorical_crossentropy'

# 定义评估指标,这里选择准确率(accuracy)作为评估模型性能的指标
metrics = ['accuracy']

# 编译模型,传入优化器、损失函数和评估指标
model.compile(optimizer=optimizer, loss=loss, metrics=metrics)

编译模型这一步告诉 TensorFlow 和 Keras 在训练过程中如何去优化模型的权重,以最小化损失函数,并根据选择的评估指标来衡量模型的表现。
五、训练模型
一切准备就绪,现在可以开始训练我们构建好的卷积神经网络模型啦!

# 使用训练数据对模型进行训练
# epochs=5 表示训练的轮数,也就是整个数据集将被重复使用多少次来更新模型权重
# batch_size=128 表示每次更新权重时使用的样本数量,即一批数据的大小
model.fit(x_train, y_train, epochs=5, batch_size=128, validation_data=(x_test, y_test))
在训练过程中,模型会根据输入的训练数据不断调整权重,每一轮训练结束后,还会使用测试数据来验证模型在未见过的数据上的性能表现,我们可以看到每一轮训练后的损失值和准确率等信息。
六、评估模型
训练完成后,我们要看看模型到底学得怎么样,那就需要对模型进行评估了。
python
Copy
# 在测试集上评估模型,返回损失值和准确率等指标
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"测试集损失值: {test_loss}")
print(f"测试集准确率: {test_accuracy}")

通过在独立的测试集上评估模型,我们能更客观地了解模型的泛化能力,也就是它在实际应用中面对新数据时的表现情况。
七、使用模型进行预测(可选)
如果想看看模型对新的手写数字图像的预测结果,也可以进行预测操作。

# 随机选择一个测试集样本进行预测
sample_index = np.random.randint(len(x_test))
sample_image = x_test[sample_index].reshape(1, 28, 28, 1)
sample_label = np.argmax(y_test[sample_index])

# 使用模型进行预测,得到预测结果概率分布

```python
prediction = model.predict(sample_image)
predicted_label = np.argmax(prediction)

print(f"真实标签: {sample_label}")
print(f"预测标签: {predicted_label}")

这里先随机选取了一个测试集的图像样本,然后将其形状调整为符合模型输入要求的格式,接着让模型进行预测,最后对比真实标签和预测标签,看看模型的预测是否准确。
以上就是使用 Python 开发卷积神经网络的基本流程啦!从数据准备、模型构建到训练和评估,每一步都很关键哦。当然,这只是一个简单的示例,你可以根据实际需求去调整网络结构、参数等,探索更强大、更适合特定任务的卷积神经网络模型。希望这篇博客能帮助你顺利开启卷积神经网络开发之旅呀!
请注意,实际应用中可能还需要更多的优化技巧、超参数调整以及对复杂任务的适配等工作,但掌握了这个基础流程,你就已经迈出了坚实的第一步啦。
如果你在过程中有任何疑问或者想法,欢迎在评论区留言分享哦!

标签:训练,Python,模型,卷积,神经网络,test,model,数据
From: https://blog.csdn.net/m0_50892002/article/details/143716784

相关文章

  • 基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数
    摘要:番茄成熟度检测在农业生产及质量控制中起着至关重要的作用,不仅能帮助农民及时采摘成熟的番茄,还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型,该模型使用了大量图片进行训练,能够准确识别不同成熟度阶段的......
  • python3 处理文件大小,自动选择合适单位
    内容来源于chatgptdefformat_size(bytes):"""将字节大小转换为适当的单位(KB,MB,GB等),支持负数。:parambytes:原始字节大小,可以为负数:return:字符串,格式化后的大小和单位"""#定义单位和阈值units=["B","KB","MB",&......
  • 毕业设计之python主观题自动阅卷系统(python完整源码+说明文档+演示视频)
    1项目介绍通过我们现阶段的有的大数据,人工智能计算可以将主观题做成自动阅卷的系统。大大提高了老师的工作效率和学生的考试容易程度。同时呢,不仅是对于客观题可以进行。技术方面的有效提高。对于主观题呢,我们也是采用当下的python技术以及流行的MYSQL数据库。2、项目技......
  • python中copy模块的使用,深拷贝和浅拷贝
    文章目录一、copy模块的介绍1、copy模块二、copy模块的使用拓展说明:1、id()函数的使用2、is和==的区别python的轮子太多啦,下面介绍一下这个小模块的使用一、copy模块的介绍1、copy模块copy模块用于对象的拷贝操作。copy模块非常简单,只有两个api。分别是copy.......
  • 使用 Python 实现高效网页爬虫——从获取链接到数据保存
    前言在这个时代,网络爬虫已成为数据分析与信息收集不可或缺的技术之一。本文将通过一个具体的Python项目来介绍如何构建一个简单的网络爬虫,它能够自动抓取指定网站的文章链接、标题、正文内容以及图片链接,并将这些信息保存为CSV文件。目标网站一、准备工作在开始编写爬......
  • 将本地安装的Python库集成到Docker镜像
    1.确定本地库的位置和格式首先,你需要明确本地库的位置和格式。如果是Python库,它可能是以.whl(wheel格式)、.tar.gz(压缩包格式)或者是一个包含源代码的目录形式存在。2.使用COPY或ADD指令(对于简单的本地库文件)COPY指令:如果本地库是一个简单的文件(如.whl或.tar.gz),可......
  • python使用loguru入门
    自定义json格式fromloguruimportloggerimportjsonfromdatetimeimportdatetime#定义一个函数来创建JSON格式的日志defjson_log(level,message,**kwargs):log_entry={"time":datetime.now().isoformat(),"level":level.upper(),......
  • 卷积神经网络CNN各种东西介绍的很好
    卷积神经网络(CNN)-CSDN博客https://blog.csdn.net/fuhanghang/article/details/135544761卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习(deeplearning)的代表算法之一。本文旨在介绍CNN的......
  • python毕设超市进销存管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于超市进销存管理系统的研究,现有研究主要以大型企业的进销存管理为主,专门针对超市这一特定场景的进销存管理研究较少。在国内外的研......
  • Python程序:计算特定数列之和
    题目要求编写一个Python程序,计算数列$s=a+aa+aaa+aaaa+\ldots$的和,其中$a$是一个数字,数列中每个数都是由$a$重复组成,且重复次数逐渐增加。用户可以通过键盘控制数列中相加的数的个数。解题思路为了计算这个数列的和,我们需要首先理解数列的构成。每个数都......