Skip to content

Keras 第一个神经网络 ​

Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlow、CNTK 或 Theano 之上运行。它的开发重点是支持快速实验,能够以最少的代码实现从想法到结果的快速转换。

Keras 的主要特点 ​

  • 用户友好:Keras 具有简单一致的接口
  • 模块化:神经网络的各种组件(层、优化器、初始化方案等)都是可组合的模块
  • 易扩展性:可以轻松添加新模块来表达新的研究想法
  • 支持多后端:可以无缝切换 TensorFlow、Theano 和 CNTK 作为计算后端

安装 Keras ​

在开始之前,我们需要先安装 Keras 及其后端引擎(这里我们使用 TensorFlow):

bash
pip install tensorflow keras

注意:Keras 2.4.0 及以后版本已集成到 TensorFlow 中,可以直接通过 tensorflow.keras 使用


构建第一个神经网络 ​

让我们从一个简单的全连接神经网络开始,解决经典的 MNIST 手写数字识别问题。

1. 导入必要的库 ​

实例 ​

python
import numpy as np

from tensorflow import keras

from tensorflow.keras import layers

2. 准备数据 ​

MNIST 数据集包含 60,000 张训练图像和 10,000 张测试图像,每张都是 28x28 像素的手写数字灰度图。

实例 ​

python
# 加载数据

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 预处理数据

x_train = x_train.reshape(60000, 784).astype("float32") / 255

x_test = x_test.reshape(10000, 784).astype("float32") / 255

# 将标签转换为 one-hot 编码

y_train = keras.utils.to_categorical(y_train, 10)

y_test = keras.utils.to_categorical(y_test, 10)

3. 构建模型 ​

我们将构建一个简单的全连接网络,包含一个输入层、一个隐藏层和一个输出层。

实例 ​

python
model = keras.Sequential([

    layers.Dense(512, activation="relu", input_shape=(784,)),

    layers.Dense(10, activation="softmax")

])

模型结构解析 ​

实例 ​

python
graph TD

    A[输入层 784个神经元] --> B[隐藏层 512个神经元, ReLU激活]

    B --> C[输出层 10个神经元, Softmax激活]

4. 编译模型 ​

在训练模型之前,我们需要配置学习过程:

实例 ​

python
model.compile(

    optimizer="rmsprop",

    loss="categorical_crossentropy",

    metrics=["accuracy"]

)

编译参数说明 ​

参数说明常用值
optimizer优化器,用于更新权重"rmsprop", "adam", "sgd"
loss损失函数,衡量模型预测与真实值的差距"categorical_crossentropy" (分类), "mse" (回归)
metrics评估指标,用于监控训练["accuracy"]

5. 训练模型 ​

现在我们可以开始训练模型了:

实例 ​

python
history = model.fit(

    x_train, y_train,

    batch_size=128,

    epochs=10,

    validation_split=0.2

)

训练参数说明 ​

参数说明建议值
batch_size每次梯度更新使用的样本数32-256
epochs训练轮数根据数据复杂度调整
validation_split用作验证集的训练数据比例0.1-0.3

6. 评估模型 ​

训练完成后,我们可以在测试集上评估模型性能:

实例 ​

python
test_loss, test_acc = model.evaluate(x_test, y_test)

print(f"测试准确率: {test_acc:.4f}")

完整代码示例 ​

实例 ​

python
import numpy as np

from tensorflow import keras

from tensorflow.keras import layers

# 1. 加载数据

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2. 预处理

x_train = x_train.reshape(60000, 784).astype("float32") / 255

x_test = x_test.reshape(10000, 784).astype("float32") / 255

y_train = keras.utils.to_categorical(y_train, 10)

y_test = keras.utils.to_categorical(y_test, 10)

# 3. 构建模型

model = keras.Sequential([

    layers.Dense(512, activation="relu", input_shape=(784,)),

    layers.Dense(10, activation="softmax")

])

# 4. 编译模型

model.compile(

    optimizer="rmsprop",

    loss="categorical_crossentropy",

    metrics=["accuracy"]

)

# 5. 训练模型

history = model.fit(

    x_train, y_train,

    batch_size=128,

    epochs=10,

    validation_split=0.2

)

# 6. 评估模型

test_loss, test_acc = model.evaluate(x_test, y_test)

print(f"测试准确率: {test_acc:.4f}")

模型改进建议 ​

1、添加 Dropout 层:防止过拟合

实例 ​

python
model.add(layers.Dropout(0.5))

2、使用更先进的优化器:如 Adam

实例 ​

python
model.compile(optimizer="adam", ...)

3、增加隐藏层:构建更深网络

实例 ​

python
model.add(layers.Dense(256, activation="relu"))

4、使用卷积层:对于图像数据更有效

实例 ​

python
model.add(layers.Conv2D(32, (3, 3), activation="relu"))

常见问题解答 ​

Q1: 为什么我的模型准确率很低? ​

  • 检查数据预处理是否正确
  • 尝试调整学习率
  • 增加网络容量(更多层或更多神经元)

Q2: 训练过程中 loss 不下降怎么办? ​

  • 检查数据是否有问题
  • 尝试不同的优化器
  • 调整学习率(通常减小学习率)

Q3: 如何保存和加载训练好的模型? ​

实例 ​

python
# 保存模型

model.save("mnist_model.h5")

# 加载模型

loaded_model = keras.models.load_model("mnist_model.h5")

AI 思考中...

TensorFlow 高级 API – Keras

Keras 常用层类型

基于 VitePress 构建,部署于 GitHub Pages