Keras 核心概念

FreeGuideOnline 最新 2026-07-15

python import keras tensor = keras.ops.ones((2, 3, 4)) # 创建一个形状为 (2,3,4) 的全1张量 print(tensor.shape) # (2, 3, 4)


> **提示**:在构建模型之前,务必理解输入数据的形状,因为模型的第一层需要明确定义 `input_shape`。

---

## 层的抽象:Layer

**层(Layer)** 是 Keras 的基本构建块,它接收一个或多个张量作为输入,经过某种计算后输出一个或多个张量。层具有可学习的权重(参数),这些权重通过训练自动更新。

### 常用层类型

- **全连接层** `Dense`:`output = activation(dot(input, kernel) + bias)`
- **卷积层** `Conv2D`:提取空间特征。
- **循环层** `LSTM`、`GRU`:处理序列数据,具有内部状态。
- **归一化层** `BatchNormalization`:加速训练、稳定梯度。
- **Dropout 层** `Dropout`:随机丢弃输入单元,用于正则化。

### 定义层的方式

所有层都是 `keras.layers.Layer` 的子类。你可以直接调用现有层,或自定义层。

```python
from keras import layers

# 一个全连接层,64个单元,输入形状为(32,)(特征维度32)
dense_layer = layers.Dense(64, activation='relu', input_shape=(32,))

层可以像函数一样调用:output = dense_layer(input_tensor)


模型:层的组合

Keras 提供了两种主要的模型构建方式:Sequential 模型(简单层堆叠)和函数式 API(灵活的有向无环图)。

Sequential 模型

适用于线性堆叠的普通前馈网络。

from keras import models
from keras import layers

model = models.Sequential([
    layers.Dense(64, activation='relu', input_shape=(784,)),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

函数式 API

适用于多输入、多输出、共享层、残差连接等复杂拓扑。

inputs = keras.Input(shape=(784,))
x = layers.Dense(64, activation='relu')(inputs)
x = layers.Dense(64, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)

函数式 API 的核心是将层化为可调用对象,像搭积木一样连接张量。


编译:配置学习过程

模型在训练之前必须通过 compile() 进行配置。需要指定三个核心要素:

  • 优化器(Optimizer):决定如何更新权重,如 SGDAdam
  • 损失函数(Loss):衡量模型预测与真实目标之间的差距。
  • 指标(Metrics):用于监控训练和测试,如 accuracy
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

自定义配置

你可以灵活传入对象,微调超参数:

from keras import optimizers, losses, metrics

model.compile(
    optimizer=optimizers.Adam(learning_rate=0.001),
    loss=losses.SparseCategoricalCrossentropy(),
    metrics=[metrics.SparseCategoricalAccuracy()]
)

损失函数和指标名称后面加 Sparse 表示标签是整数形式,而非独热编码。


训练:fit() 方法

编译完成后,使用 fit() 方法将模型与数据进行拟合。

history = model.fit(
    x_train, y_train,
    batch_size=32,
    epochs=10,
    validation_split=0.2
)

关键参数

  • batch_size:每次梯度更新使用的样本数,影响训练速度和稳定性。
  • epochs:整个训练集被遍历的次数。
  • validation_datavalidation_split:用于在每个 epoch 后评估验证集性能,防止过拟合。
  • callbacks:强大的扩展机制,如 EarlyStoppingModelCheckpointTensorBoard 等。
callbacks = [
    keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True),
    keras.callbacks.ModelCheckpoint('best_model.keras', save_best_only=True)
]
model.fit(x_train, y_train, epochs=50, callbacks=callbacks, validation_data=(x_val, y_val))

fit() 返回一个 History 对象,记录每个 epoch 的损失和指标值,可用于绘制学习曲线。


评估与预测

训练完成的模型可以使用 evaluate() 在测试集上获取损失和指标值。

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc:.3f}")

使用 predict() 生成新数据的预测输出。

predictions = model.predict(x_new)
# predictions 是一个 NumPy 数组,形状为 (样本数, 输出单元数)

对于分类任务,predict 输出概率分布,可以通过 np.argmax(predictions, axis=1) 获取类别标签。


保存和加载模型

Keras 支持保存完整模型(包括架构、权重和训练配置),文件格式推荐 .keras(新格式)或 .h5

# 保存
model.save('my_model.keras')

# 加载
loaded_model = keras.models.load_model('my_model.keras')

如果你只关心权重,可以使用 model.save_weights('weights.keras')model.load_weights('weights.keras')


核心概念总结图

[数据张量] → [层 (Layer)] → [模型 (Model)]
                  ↕ 权重
         [编译 (compile)]
         · 优化器 (optimizer)
         · 损失函数 (loss)
         · 指标 (metrics)
         [训练 (fit)] → 更新权重
         [评估 (evaluate)] / [预测 (predict)]