TensorFlow - Keras
TensorFlow - Keras API
Section titled “TensorFlow - Keras API”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 tffrom tensorflow import kerasfrom tensorflow.keras import layersimport numpy as np
# For reproducibilitynp.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 normalizex_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255x_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 = 10y_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 = 128epochs = 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/10469/469 [==============================] - 4s 6ms/step - loss: 0.2389 - accuracy: 0.9269 - val_loss: 0.0517 - val_accuracy: 0.9827Epoch 2/10469/469 [==============================] - 3s 6ms/step - loss: 0.0857 - accuracy: 0.9745 - val_loss: 0.0393 - val_accuracy: 0.9868Epoch 3/10469/469 [==============================] - 3s 6ms/step - loss: 0.0644 - accuracy: 0.9804 - val_loss: 0.0344 - val_accuracy: 0.9882Epoch 4/10469/469 [==============================] - 3s 6ms/step - loss: 0.0525 - accuracy: 0.9836 - val_loss: 0.0318 - val_accuracy: 0.9893Epoch 5/10469/469 [==============================] - 3s 6ms/step - loss: 0.0448 - accuracy: 0.9860 - val_loss: 0.0313 - val_accuracy: 0.9895Epoch 6/10469/469 [==============================] - 3s 6ms/step - loss: 0.0380 - accuracy: 0.9881 - val_loss: 0.0275 - val_accuracy: 0.9908Epoch 7/10469/469 [==============================] - 3s 6ms/step - loss: 0.0338 - accuracy: 0.9893 - val_loss: 0.0279 - val_accuracy: 0.9912Epoch 8/10469/469 [==============================] - 3s 6ms/step - loss: 0.0297 - accuracy: 0.9903 - val_loss: 0.0280 - val_accuracy: 0.9910Epoch 9/10469/469 [==============================] - 3s 6ms/step - loss: 0.0264 - accuracy: 0.9915 - val_loss: 0.0291 - val_accuracy: 0.9911Epoch 10/10469/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 显著简化了深度学习工作流程,使其更易于访问。