游乐游手机版
首页/AI教程/文章详情

Python全连接神经网络多层感知机构建进阶教程

时间:2026-06-13 15:34
全连接神经网络(多层感知机)的构建 关键词:全连接神经网络、多层感知机、TensorFlow、模型训练、MNIST数据集 摘要:本文介绍了全连接神经网络(也称多层感知机,MLP)的基本概念及其构建过程。以TensorFlow框架为例,通过导入必要的库、准备和预处理MNIST手写数字数据集、构建模型结

全连接神经网络(多层感知机)的构建


关键词:全连接神经网络、多层感知机、TensorFlow、模型训练、MNIST数据集

摘要:本文介绍了全连接神经网络(也称多层感知机,MLP)的基本概念及其构建过程。以TensorFlow框架为例,通过导入必要的库、准备和预处理MNIST手写数字数据集、构建模型结构(包括Flatten层、Dense层和Dropout层)、编译模型(选择优化器、损失函数和评估指标)、训练模型以及评估模型性能等步骤,详细展示了如何实现一个简单的分类任务。文中强调了数据归一化、模型结构设计、防止过拟合等关键点,并提供了完整代码示例及运行结果说明,帮助读者理解和掌握构建全连接神经网络的核心方法。

全连接神经网络——也常被称为多层感知机(MLP)——可以说是深度学习的入门砖。简单来说,它由输入层、一个或多个隐藏层以及输出层组成,每一层的每一个神经元都与下一层的所有神经元相连,因此得名“全连接”。别小看这个基本结构,很多复杂的深度学习模型都是从这个骨架生长出来的。下面就用TensorFlow一步步搭一个简单的MLP,并拿MNIST手写数字识别来练练手。

一、构建步骤及关键点、注意点

1. 导入必要的库

在Python中,搭建神经网络通常绕不开TensorFlow或PyTorch。这里选择TensorFlow,毕竟它的Keras高级API对新手非常友好。

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手写数字数据集,它已经成了深度学习的“Hello World”。

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. 构建模型

接下来就是核心环节——搭模型。这里用Sequential模型,按顺序堆叠各层。

Python脚本

# 导入必要的库
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models
# 构建全连接神经网络模型
model = models.Sequential([
    # 将28x28的图像展平为一维向量
    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. 训练模型

编译完成后,调用fit方法让模型在数据上学习。这里设置5个epoch,看看效果如何。

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——

来源:https://blog.csdn.net/imewe/article/details/149660838
上一篇计算图概念与TensorFlow自动求导机制解析 下一篇训练神经网络并进行预测的Python AI数据分析进阶教程
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
年最新JetBrains AI助手Windows本地详细安装配置教程(含下载与环境要求)
AI教程 · 2026-07-03

年最新JetBrains AI助手Windows本地详细安装配置教程(含下载与环境要求)

JetBrainsAIAssistant可在Windows上通过IDE内置市场或离线包安装,需匹配新版JetBrainsIDE、账号登录与稳定网络。配置时应关注版本兼容、隐私设置、项目索引、快捷键和代码提交前复核,避免上传密钥与敏感业务资料。

Amazon Q Developer新手安装指南:从下载到首次运行的保姆级教程
AI教程 · 2026-07-03

Amazon Q Developer新手安装指南:从下载到首次运行的保姆级教程

AmazonQDeveloper可为编码、调试、解释项目和生成测试提供辅助。安装前需确认账号、开发环境和插件来源,按IDE或命令行路径完成配置,并在首次运行时注意权限、数据与项目安全。

Amazon Q Developer安装失败怎么办?报错日志排查与升级回滚方案
AI教程 · 2026-07-03

Amazon Q Developer安装失败怎么办?报错日志排查与升级回滚方案

AmazonQDeveloper安装失败通常与版本兼容、网络连接、身份登录、插件残留或权限配置有关。排查时应先确认环境,再查看IDE与终端日志,必要时采用清理重装、固定版本升级或回滚方案。

Amazon Q Developer本地模型运行:下载、路径与性能优化
AI教程 · 2026-07-03

Amazon Q Developer本地模型运行:下载、路径与性能优化

AmazonQDeveloper以云端能力为主,本地模型方案更适合离线补充、代码检索和私有环境辅助。配置时需确认版本、模型来源、路径权限、硬件资源与IDE集成方式,并通过量化、上下文控制和缓存策略优化性能。

Amazon Q Developer插件安装全流程:浏览器编辑器扩展市场配置
AI教程 · 2026-07-03

Amazon Q Developer插件安装全流程:浏览器编辑器扩展市场配置

AmazonQDeveloper可在浏览器控制台、VSCode、JetBrains等环境中辅助写代码、解释项目和生成测试。安装前需确认账号权限、编辑器版本与网络环境,配置时重点关注登录授权、工作区信任、数据权限和团队使用规范。