Skip to content

TensorFlow - Keras

Keras 是一个用于构建和训练深度学习模型的高级 API。它用户友好、模块化且可扩展,可以轻松快速地原型化和实验深度学习想法。Keras 最初是一个独立的库,现在已完全集成到 TensorFlow 中,成为 tf.keras。这使其成为 TensorFlow 官方的高级 API,专为易用性和快速开发而设计。

tf.keras 支持两种主要的模型创建方式:

  • 顺序式 API (Sequential API):适用于简单的、线性的层堆栈。这是入门最简单的方式。
  • 函数式 API (Functional API):适用于更复杂的架构,例如具有多个输入/输出、共享层或非线性拓扑的模型。

tf.keras 中创建深度学习模型的典型工作流程包括以下步骤:

  • 加载和预处理数据。
  • 定义模型架构(堆叠层)。
  • 编译模型(指定损失函数、优化器和评估指标)。
  • 训练模型(在训练数据上拟合)。
  • 评估模型在测试数据上的性能。
  • 对新数据进行预测。
  • (可选)保存和加载训练好的模型。

让我们用一个例子来说明,构建一个简单的 CNN 用于 MNIST 数字分类(类似于 CNN 章,但侧重于 Keras 工作流程)。为了清晰起见,我们将使用 Jupyter Notebook 的呈现风格。

步骤 1:加载和预处理数据。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
# For reproducibility
np.random.seed(123)
tf.random.set_seed(123)
# Load pre-shuffled MNIST data
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Preprocess the data: reshape and normalize
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32') / 255
# Convert class vectors to binary class matrices (one-hot encoding)
num_classes = 10
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

此步骤导入 TensorFlow 和 Keras 中必要的库和模块,加载 MNIST 数据集,并通过重塑 (reshaping)、归一化 (normalizing) 和 one-hot 编码标签 (labels) 来准备数据进行训练。

步骤 2:使用顺序式 API (Sequential API) 定义模型架构。

model = keras.Sequential()
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Dropout(0.25))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(num_classes, activation='softmax'))
model.summary() # Display model architecture

在这里,我们创建一个 Sequential 模型并逐个添加层。Conv2D 用于卷积 (convolution),MaxPooling2D 用于下采样 (down-sampling),Dropout 用于正则化 (regularization),Flatten 将二维特征转换为一维,Dense 用于全连接层 (fully connected layers)。最后的 Dense 层使用 softmax 激活函数进行多类分类 (multi-class classification)。

步骤 3:编译 (Compile) 模型。

model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])

编译 (compilation) 配置训练过程。我们指定损失函数 (loss function) (categorical_crossentropy)、优化器 (optimizer) (adam) 和要监控的评估指标 (metrics) (accuracy)。

步骤 4:使用训练数据训练 (fit) 模型。

batch_size = 128
epochs = 10 # Reduced for brevity in tutorial output
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))

fit 方法训练模型。verbose=1 显示进度条。validation_data 允许在训练期间监控模型在测试集上的性能。

训练期间的输出将显示每个 epoch 的损失 (loss) 和准确率 (accuracy):

Epoch 1/10
469/469 [==============================] - 4s 6ms/step - loss: 0.2389 - accuracy: 0.9269 - val_loss: 0.0517 - val_accuracy: 0.9827
Epoch 2/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0857 - accuracy: 0.9745 - val_loss: 0.0393 - val_accuracy: 0.9868
Epoch 3/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0644 - accuracy: 0.9804 - val_loss: 0.0344 - val_accuracy: 0.9882
Epoch 4/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0525 - accuracy: 0.9836 - val_loss: 0.0318 - val_accuracy: 0.9893
Epoch 5/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0448 - accuracy: 0.9860 - val_loss: 0.0313 - val_accuracy: 0.9895
Epoch 6/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0380 - accuracy: 0.9881 - val_loss: 0.0275 - val_accuracy: 0.9908
Epoch 7/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0338 - accuracy: 0.9893 - val_loss: 0.0279 - val_accuracy: 0.9912
Epoch 8/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0297 - accuracy: 0.9903 - val_loss: 0.0280 - val_accuracy: 0.9910
Epoch 9/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0264 - accuracy: 0.9915 - val_loss: 0.0291 - val_accuracy: 0.9911
Epoch 10/10
469/469 [==============================] - 3s 6ms/step - loss: 0.0240 - accuracy: 0.9921 - val_loss: 0.0270 - val_accuracy: 0.9918

步骤 5:评估 (Evaluate) 模型(已通过 fit 中的 validation_data 完成,但可以显式执行)。

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

这提供了模型在未见数据上的最终性能度量。tf.keras 显著简化了深度学习工作流程,使其更易于访问。