Keras 第一个神经网络

用 Keras 构建你的第一个神经网络

以下是一个使用 TensorFlow 的 Keras API 构建第一个神经网络的详细教程,目标是解决经典的 MNIST 手写数字分类问题。本教程适合初学者,包含完整的代码、步骤解释和运行结果分析。如果你是第一次使用 Keras,我会用通俗的语言讲解,并确保代码简洁易懂。


1. 目标

  • 任务:识别手写数字(0-9),输入是 28×28 像素的灰度图像,输出是 10 个类别的概率。
  • 数据集:MNIST,包含 60,000 张训练图像和 10,000 张测试图像。

2. 环境准备

确保已安装 TensorFlow(参考之前的“TensorFlow 环境搭建”)。运行以下命令验证:

pip install tensorflow
import tensorflow as tf
print(tf.__version__)  # 确保版本为 2.x(如 2.17.0)

3. 完整代码

以下是构建、训练和评估神经网络的完整代码:

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

# 1. 加载和预处理数据
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化到 [0,1]

# 2. 构建神经网络模型
model = models.Sequential([
    layers.Flatten(input_shape=(28, 28)),  # 展平 28x28 图像为 784 维向量
    layers.Dense(128, activation='relu'),  # 隐藏层,128 个神经元
    layers.Dropout(0.2),                   # 随机丢弃 20% 神经元,防止过拟合
    layers.Dense(10, activation='softmax') # 输出层,10 个类别
])

# 3. 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 4. 训练模型
history = model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.2)

# 5. 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'\n测试集准确率: {test_acc:.4f}')

# 6. 可视化训练过程(可选)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

4. 代码逐部分解释

4.1 数据加载与预处理

  • MNIST 数据集tf.keras.datasets.mnist.load_data() 自动下载并返回训练和测试数据。
  • x_train:形状为 (60000, 28, 28),表示 60,000 张 28×28 像素图像。
  • y_train:形状为 (60000,),表示对应标签(0-9)。
  • 归一化:将像素值从 [0, 255] 缩放到 [0, 1],提高训练稳定性。
  x_train, x_test = x_train / 255.0, x_test / 255.0

4.2 构建模型

使用 Sequential 模型,线性堆叠层:

  • Flatten:将 28×28 图像展平为 784 维向量(28*28=784)。
  • Dense (128, relu):全连接隐藏层,128 个神经元,使用 ReLU 激活函数增加非线性。
  • Dropout (0.2):随机丢弃 20% 的神经元,防止过拟合。
  • Dense (10, softmax):输出层,10 个神经元(对应 0-9),使用 softmax 输出概率。

4.3 编译模型

  • 优化器adam,自适应学习率,适合大多数任务。
  • 损失函数sparse_categorical_crossentropy,适用于多分类任务,标签是整数。
  • 指标accuracy,跟踪分类准确率。

4.4 训练模型

  • epochs=5:训练 5 次完整数据集。
  • batch_size=32:每次处理 32 张图像。
  • validation_split=0.2:从训练集中分出 20% 作为验证集,监控过拟合。

4.5 评估模型

在测试集上评估模型性能,输出损失和准确率。

4.6 可视化(可选)

绘制训练和验证准确率曲线,检查模型是否过拟合。


5. 运行结果

运行代码后,你会看到:

  • 训练过程:每个 epoch 显示训练损失、训练准确率、验证损失和验证准确率。
  • 最终输出
  测试集准确率: 0.9785  # 可能略有不同,通常在 97%-98%
  • 可视化:Matplotlib 显示的曲线表明训练和验证准确率随 epoch 增加而提高。

6. 生成图表

以下是训练过程中准确率的图表代码(已包含在代码中)。如果你想单独生成:

{
  "type": "line",
  "data": {
    "labels": ["Epoch 1", "Epoch 2", "Epoch 3", "Epoch 4", "Epoch 5"],
    "datasets": [
      {
        "label": "Training Accuracy",
        "data": [0.93, 0.95, 0.96, 0.97, 0.975], // 示例数据,实际运行会不同
        "borderColor": "#1f77b4",
        "fill": false
      },
      {
        "label": "Validation Accuracy",
        "data": [0.94, 0.96, 0.965, 0.97, 0.972], // 示例数据
        "borderColor": "#ff7f0e",
        "fill": false
      }
    ]
  },
  "options": {
    "scales": {
      "x": { "title": { "display": true, "text": "Epoch" } },
      "y": { "title": { "display": true, "text": "Accuracy" }, "beginAtZero": false }
    }
  }
}

说明:此图表为示例,实际数据来自 history.history['accuracy']history.history['val_accuracy']


7. 下一步改进

  • 增加层:添加更多 Dense 层或尝试卷积层(Conv2D)提高准确率。
  • 调整超参数
  • 增加 epochs 或调整 batch_size
  • 尝试其他优化器(如 RMSprop)或学习率。
  • 数据增强:使用 tf.keras.preprocessing.image.ImageDataGenerator 增强数据。
  • 保存模型
  model.save('mnist_model.h5')

8. 常见问题

  • 准确率低:增加 epoch 数、添加层或调整学习率(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))。
  • 运行慢:检查是否启用 GPU(tf.config.list_physical_devices('GPU'))。
  • 内存不足:减小 batch_size 或使用 tf.data 优化数据加载。

9. 总结

这个简单的 Keras 神经网络展示了从数据加载到模型训练的完整流程。通过 Sequential 模型,你可以快速构建一个功能强大的分类器。MNIST 是一个经典入门数据集,适合理解 Keras 的核心功能。

如果你想深入某个部分(比如添加卷积层、自定义损失函数)或需要其他数据集的示例,请告诉我!需要更多图表(如损失曲线)或调试帮助吗?

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注