用Python进行AI数据分析进阶教程65:
全连接神经网络(多层感知机)的构建
关键词:全连接神经网络、多层感知机、TensorFlow、模型训练、MNIST数据集
摘要:本文介绍了全连接神经网络(也称多层感知机,MLP)的基本概念及其构建过程。以TensorFlow框架为例,通过导入必要的库、准备和预处理MNIST手写数字数据集、构建模型结构(包括Flatten层、Dense层和Dropout层)、编译模型(选择优化器、损失函数和评估指标)、训练模型以及评估模型性能等步骤,详细展示了如何实现一个简单的分类任务。文中强调了数据归一化、模型结构设计、防止过拟合等关键点,并提供了完整代码示例及运行结果说明,帮助读者理解和掌握构建全连接神经网络的核心方法。
👉 欢迎订阅🔗 《用Python进行AI数据分析进阶教程》专栏 《AI大模型应用实践进阶教程》专栏 《Python编程知识集锦》专栏 《字节跳动旗下AI制作抖音视频》专栏 《智能辅助驾驶》专栏 《工具软件及IT技术集锦》专栏
全连接神经网络(Fully Connected Neural Network),也称为多层感知机(Multilayer Perceptron, MLP),是一种基本的人工神经网络模型。它由输入层、一个或多个隐藏层以及输出层组成,每一层的神经元都与下一层的所有神经元相连,因此被称为全连接。
一、构建步骤及关键点、注意点
1. 导入必要的库
在 Python 中,通常使用TensorFlow或PyTorch来构建神经网络。这里以TensorFlow为例。
Python脚本
# 导入TensorFlow库,这是一个用于机器学习和深度学习的开源框架
import tensorflow as tf
# 从tensorflow.keras模块中导入layers和models子模块
# layers用于构建神经网络层,models用于构建和管理模型
from tensorflow.keras import layers, models
(1)关键点:
- tensorflow.keras提供了高级的 API,使得构建神经网络变得简单。
- layers模块包含了各种类型的层,如全连接层(Dense)。
(2)注意点:
- 确保TensorFlow版本兼容,不同版本的 API 可能会有差异。
2. 准备数据
这里以 MNIST 手写数字数据集为例。
Python脚本
# 加载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
# 查看数据形状
print(f"训练集形状: {x_train.shape}, 标签形状: {y_train.shape}")
print(f"测试集形状: {x_test.shape}, 标签形状: {y_test.shape}")
(1)关键点:
- 数据预处理是很重要的一步,将像素值归一化到 0 – 1 之间可以提高模型的训练效果。
- 数据集分为训练集和测试集,用于模型的训练和评估。
(2)注意点:
- 不同的数据集可能需要不同的预处理方法。
3. 构建模型
Python脚本
# 导入必要的库
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models
# 构建全连接神经网络模型
model = models.Sequential([
# 将28×28的图像展平为一维向量
layers.Flatten(input_shape=(28, 28)),
# 第一个隐藏层,有128个神经元,使用ReLU激活函数
layers.Dense(128, activation='relu'),
# 防止过拟合,随机丢弃20%的神经元
layers.Dropout(0.2),
# 输出层,有10个神经元,对应0-9的数字,使用softmax激活函数
layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 查看模型结构
model.summary()
(1)关键点:
- Sequential模型是一种简单的线性堆叠模型,按顺序添加各个层。
- Flatten层将二维的图像数据展平为一维向量,以便输入到全连接层。
- Dense层是全连接层,activation参数指定激活函数,常用的有 ReLU、softmax 等。
- Dropout层用于防止过拟合,在训练过程中随机丢弃一部分神经元。
(2)注意点:
- 隐藏层的神经元数量和层数需要根据具体问题进行调整,过多的神经元或层数可能导致过拟合。
- 输出层的神经元数量和激活函数需要根据具体任务来选择,例如分类任务通常使用 softmax 激活函数。
4. 编译模型
Python脚本
# 编译模型,配置训练所需的关键参数,让模型做好训练的准备
model.compile(
# 指定优化器为 'adam'
# Adam 优化器结合了 AdaGrad 和 RMSProp 的优点,
# 能够自适应地调整每个参数的学习率,
# 使得模型在训练时收敛速度更快且更稳定
optimizer='adam',
# 指定损失函数为 'sparse_categorical_crossentropy'
# 适用于多分类问题中标签为整数编码的情况(例如 0, 1, 2…)
# 模型训练的目标是最小化这个损失值
loss='sparse_categorical_crossentropy',
# 指定评估指标为 'accuracy'
# 准确率 = 预测正确的样本数 / 总样本数
# 用于直观了解模型的分类效果
metrics=['accuracy']
)
(1)关键点:
- optimizer指定优化器,如adam,用于更新模型的参数。
- loss指定损失函数,sparse_categorical_crossentropy适用于多分类问题。
- metrics指定评估指标,这里使用accuracy来评估模型的准确率。
(2)注意点:
- 不同的任务需要选择不同的损失函数和优化器。
5. 训练模型
Python脚本
# 训练模型,通过该操作让模型学习训练数据中的特征和模式,以提升模型性能
history = model.fit(
# 传入训练数据的特征部分,即 x_train
x_train,
# 传入训练数据的标签部分,即 y_train
y_train,
# 指定训练的轮数为 5,即整个训练数据集会被模型遍历 5 次
epochs=5,
# 添加验证数据,用于监控模型在未见数据上的表现
validation_data=(x_val, y_val),
# 设置批次大小,默认通常是32
batch_size=32,
# 设置verbose参数,控制训练过程的显示详细程度
# 0=静默模式,1=进度条,2=每轮显示一行
verbose=1
)
# 可选:使用返回的history对象来分析训练过程
import matplotlib.pyplot as plt
# 绘制训练历史
def plot_training_history(history):
"""
绘制模型训练历史
"""
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 绘制损失曲线
ax1.plot(history.history['loss'], label='Training Loss')
ax1.plot(history.history['val_loss'], label='Validation Loss')
ax1.set_title('Model Loss')
ax1.set_xlabel('Epoch')
ax1.set_ylabel('Loss')
ax1.legend()
# 绘制准确率曲线(如果有的话)
if 'accuracy' in history.history:
ax2.plot(history.history['accuracy'], label='Training Accuracy')
ax2.plot(history.history['val_accuracy'], label='Validation Accuracy')
ax2.set_title('Model Accuracy')
ax2.set_xlabel('Epoch')
ax2.set_ylabel('Accuracy')
ax2.legend()
plt.tight_layout()
plt.show()
# 调用绘图函数
# plot_training_history(history)
(1)关键点:
- fit方法用于训练模型,epochs指定训练的轮数。
(2)注意点:
- 过多的训练轮数可能导致过拟合,需要通过验证集或交叉验证来选择合适的轮数。
6. 评估模型
Python脚本
# 评估模型在测试集上的性能,以了解模型的泛化能力
try:
# model.evaluate 方法返回模型在测试集上的损失值和评估指标值
test_loss, test_acc = model.evaluate(
x_test, # 测试数据的特征部分
y_test, # 测试数据的真实标签
verbose=1 # 显示评估进度(0=静默,1=进度条,2=每轮一行)
)
# 打印测试结果,使用 f-string 格式化输出
print(f"Test Loss: {test_loss:.4f}")
print(f"Test Accuracy: {test_acc:.4f} ({test_acc*100:.2f}%)")
except Exception as e:
print(f"模型评估过程中出现错误: {e}")
(1)关键点:
- evaluate方法用于评估模型在测试集上的性能。
(2)注意点:
- 测试集应该与训练集独立,以保证评估结果的客观性。
二、完整代码示例
Python脚本
# 导入必要的库
import tensorflow as tf
from tensorflow.keras import layers, models
# 设置随机种子以保证结果可复现(可选)
tf.random.set_seed(42)
# 加载 MNIST 数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 数据预处理:归一化到 [0, 1]
x_train, x_test = x_train / 255.0, x_test / 255.0
# 构建模型
model = models.Sequential([
layers.Flatten(input_shape=(28, 28)), # 展平图像
layers.Dense(128, activation='relu'), # 全连接层 + ReLU
layers.Dropout(0.2), # Dropout 防止过拟合
layers.Dense(10, activation='softmax') # 输出层,10类分类
])
# 编译模型
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 显示模型结构
model.summary()
# 训练模型
model.fit(
x_train,
y_train,
epochs=5,
validation_split=0.1 # 使用10%训练数据作为验证集(可选)
)
# 在测试集上评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
# 打印测试准确率
print(f"\\nTest accuracy: {test_acc:.4f}")
输出 / 打印结果示例及注释
plaintext
Epoch 1/5
1875/1875 [==============================] – 3s 2ms/step – loss: 0.2587 – accuracy: 0.9246
Epoch 2/5
1875/1875 [==============================] – 3s 2ms/step – loss: 0.1077 – accuracy: 0.9678
Epoch 3/5
1875/1875 [==============================] – 3s 2ms/step – loss: 0.0737 – accuracy: 0.9778
Epoch 4/5
1875/1875 [==============================] – 3s 2ms/step – loss: 0.0538 – accuracy: 0.9837
Epoch 5/5
1875/1875 [==============================] – 3s 2ms/step – loss: 0.0425 – accuracy: 0.9868
313/313 [==============================] – 1s 2ms/step – loss: 0.0733 – accuracy: 0.9787
Test accuracy: 0.9787000155448914
输出结果注释
(1)训练过程输出:
- Epoch 1/5 表示当前是第 1 轮训练,总共要进行 5 轮训练。
- 1875/1875 表示训练数据总共被分成了 1875 个批次,当前已经完成了所有批次的训练。
- 3s 2ms/step 表示这一轮训练总共花费了 3 秒,平均每个批次的训练时间是 2 毫秒。
- loss: 0.2587 表示这一轮训练结束后,模型在训练集上的损失值为 0.2587,损失值越小说明模型预测结果与真实标签越接近。
- accuracy: 0.9246 表示这一轮训练结束后,模型在训练集上的准确率为 92.46%,即模型正确预测的样本数占总样本数的比例。
(2)评估过程输出:
- 313/313 表示测试数据总共被分成了 313 个批次,当前已经完成了所有批次的评估。
- 1s 2ms/step 表示评估过程总共花费了 1 秒,平均每个批次的评估时间是 2 毫秒。
- loss: 0.0733 表示模型在测试集上的损失值为 0.0733。
- accuracy: 0.9787 表示模型在测试集上的准确率为 97.87%。
(3)最终打印结果:
- Test accuracy: 0.9787000155448914 是最终输出的测试集准确率,四舍五入后约为 97.87%,反映了模型在未见过的数据上的分类性能。
通过以上步骤,我们可以构建一个简单的全连接神经网络。在构建过程中,需要注意数据预处理、模型结构的设计、损失函数和优化器的选择,以及训练轮数的控制,以避免过拟合和欠拟合问题。
——The END——
🔗 欢迎订阅专栏
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。 敬请关注 我的 微信搜索公众号:cnFuJH CSDN博客:理工男大辉郎 抖音号:31580422589
评论前必须登录!
注册