基于Google Cloud Platform的MNIST图像分类模型构建与部署实战
本文将通过Google Cloud Platform提供的机器学习工具,展示如何构建和部署不同类型的MNIST手写数字分类模型。我们将从基础模型开始,逐步构建更复杂的神经网络架构,并最终将模型部署到云端进行预测。
项目概述
MNIST数据集是机器学习领域的经典入门数据集,包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的手写数字灰度图像。本项目将演示如何在Google Cloud Platform上实现以下功能:
- 构建多种类型的图像分类模型(线性模型、DNN、CNN等)
- 本地训练与验证模型
- 使用Docker容器打包模型
- 在AI Platform上训练模型
- 部署训练好的模型进行预测
环境配置
首先需要配置项目的基本信息,包括项目ID、存储桶名称和区域等:
from datetime import datetime
import os
PROJECT = "your-project-id-here" # 替换为您的项目ID
BUCKET = "your-bucket-id-here" # 替换为您的存储桶名称
REGION = "us-central1" # 替换为您的存储桶区域
MODEL_TYPE = "dnn" # 可选:"linear", "dnn_dropout", "cnn", 或 "dnn"
# 设置环境变量
os.environ["PROJECT"] = PROJECT
os.environ["BUCKET"] = BUCKET
os.environ["REGION"] = REGION
os.environ["MODEL_TYPE"] = MODEL_TYPE
os.environ["TFVERSION"] = "2.1" # TensorFlow版本
模型架构设计
本项目支持四种不同类型的模型架构,通过MODEL_TYPE
参数进行切换:
- 线性模型(linear):最简单的模型,直接将图像展平后通过全连接层输出结果
- 深度神经网络(dnn):包含两个隐藏层的全连接网络
- 带Dropout的DNN(dnn_dropout):在DNN基础上添加Dropout层防止过拟合
- 卷积神经网络(cnn):使用卷积层提取图像特征,后接全连接层
模型架构定义在model.py
文件中,核心函数get_layers()
根据模型类型返回相应的层结构:
def get_layers(model_type, nclasses=10, ...):
model_layers = {
'linear': [
Flatten(),
Dense(nclasses),
Softmax()
],
'dnn': [
Flatten(),
Dense(hidden_layer_1_neurons, activation='relu'),
Dense(hidden_layer_2_neurons, activation='relu'),
Dense(nclasses),
Softmax()
],
'dnn_dropout': [
Flatten(),
Dense(hidden_layer_1_neurons, activation='relu'),
Dense(hidden_layer_2_neurons, activation='relu'),
Dropout(dropout_rate),
Dense(nclasses),
Softmax()
],
'cnn': [
Conv2D(num_filters_1, kernel_size=kernel_size_1,
activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D(pooling_size_1),
Conv2D(num_filters_2, kernel_size=kernel_size_2,
activation='relu'),
MaxPooling2D(pooling_size_2),
Flatten(),
Dense(hidden_layer_1_neurons, activation='relu'),
Dense(hidden_layer_2_neurons, activation='relu'),
Dropout(dropout_rate),
Dense(nclasses),
Softmax()
]
}
return model_layers[model_type]
数据预处理
在util.py
中定义了数据预处理和加载的函数:
def scale(image, label):
"""将图像从0-255的整数范围缩放到0-1的浮点范围"""
image = tf.cast(image, tf.float32)
image /= 255
image = tf.expand_dims(image, -1) # 添加通道维度
return image, label
def load_dataset(data, training=True, buffer_size=5000, batch_size=100, nclasses=10):
"""加载MNIST数据集到tf.data.Dataset"""
(x_train, y_train), (x_test, y_test) = data
x = x_train if training else x_test
y = y_train if training else y_test
y = tf.keras.utils.to_categorical(y, nclasses) # 将标签转为one-hot编码
dataset = tf.data.Dataset.from_tensor_slices((x, y))
dataset = dataset.map(scale).batch(batch_size)
if training:
dataset = dataset.shuffle(buffer_size).repeat()
return dataset
本地训练
在将模型部署到云端之前,我们可以先在本地进行训练和验证:
# 设置训练参数
current_time = datetime.now().strftime("%y%m%d_%H%M%S")
model_type = 'dnn' # 可以更改为其他模型类型
os.environ["MODEL_TYPE"] = model_type
os.environ["JOB_DIR"] = f"gs://{BUCKET}/mnist_{model_type}_{current_time}/"
os.environ["JOB_NAME"] = f"mnist_{model_type}_{current_time}"
# 运行本地训练
!python3 -m mnistmodel.trainer.task \
--job-dir=$JOB_DIR \
--epochs=5 \
--steps_per_epoch=50 \
--model_type=$MODEL_TYPE
云端训练
为了在AI Platform上运行训练任务,我们需要将代码打包成Docker容器:
- 创建Dockerfile:
FROM gcr.io/deeplearning-platform-release/tf2-cpu
COPY mnistmodel/trainer /mnistmodel/trainer
ENTRYPOINT ["python3", "-m", "mnistmodel.trainer.task"]
- 构建并推送Docker镜像:
!docker build -f mnistmodel/Dockerfile -t $IMAGE_URI ./
!docker push $IMAGE_URI
- 提交AI Platform训练任务:
!gcloud ai-platform jobs submit training $JOB_NAME \
--staging-bucket=gs://$BUCKET \
--region=$REGION \
--master-image-uri=$IMAGE_URI \
--scale-tier=BASIC_GPU \ # 使用GPU加速
--job-dir=$JOB_DIR \
-- \
--model_type=$MODEL_TYPE
模型部署
训练完成后,我们可以将模型部署到AI Platform进行预测:
MODEL_NAME="mnist"
MODEL_VERSION=${MODEL_TYPE}
MODEL_LOCATION=${JOB_DIR}keras_export/
# 创建模型和版本
gcloud ai-platform models create ${MODEL_NAME} --regions $REGION
gcloud ai-platform versions create ${MODEL_VERSION} \
--model ${MODEL_NAME} \
--origin ${MODEL_LOCATION} \
--framework tensorflow \
--runtime-version=2.1
部署完成后,您可以通过AI Platform的预测服务调用该模型进行手写数字识别。
模型选择建议
对于MNIST这样的简单图像分类任务,不同模型的性能表现如下:
- 线性模型:最简单,训练速度快,但准确率较低(约92%)
- DNN:准确率提升至约97%,训练时间适中
- 带Dropout的DNN:防止过拟合,在验证集上表现更稳定
- CNN:最适合图像数据,准确率可达99%以上,但训练时间较长
建议从小模型开始,逐步尝试更复杂的架构,根据实际需求在准确率和训练成本之间取得平衡。
总结
本文详细介绍了如何在Google Cloud Platform上构建、训练和部署MNIST手写数字分类模型的全过程。通过这个项目,您可以学习到:
- 使用TensorFlow 2.x构建不同类型的神经网络
- 数据预处理和加载的最佳实践
- 本地与云端训练的配置方法
- 使用Docker容器打包机器学习应用
- 模型部署和预测服务的创建
这套流程不仅适用于MNIST数据集,也可以扩展到其他图像分类任务,是掌握云端机器学习工作流的绝佳起点。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考