基于Google Cloud Platform的MNIST图像分类模型构建与部署实战

基于Google Cloud Platform的MNIST图像分类模型构建与部署实战

training-data-analyst Labs and demos for courses for GCP Training (http://cloud.google.com/training). training-data-analyst 项目地址: https://gitcode.com/gh_mirrors/tr/training-data-analyst

本文将通过Google Cloud Platform提供的机器学习工具,展示如何构建和部署不同类型的MNIST手写数字分类模型。我们将从基础模型开始,逐步构建更复杂的神经网络架构,并最终将模型部署到云端进行预测。

项目概述

MNIST数据集是机器学习领域的经典入门数据集,包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的手写数字灰度图像。本项目将演示如何在Google Cloud Platform上实现以下功能:

  1. 构建多种类型的图像分类模型(线性模型、DNN、CNN等)
  2. 本地训练与验证模型
  3. 使用Docker容器打包模型
  4. 在AI Platform上训练模型
  5. 部署训练好的模型进行预测

环境配置

首先需要配置项目的基本信息,包括项目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参数进行切换:

  1. 线性模型(linear):最简单的模型,直接将图像展平后通过全连接层输出结果
  2. 深度神经网络(dnn):包含两个隐藏层的全连接网络
  3. 带Dropout的DNN(dnn_dropout):在DNN基础上添加Dropout层防止过拟合
  4. 卷积神经网络(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容器:

  1. 创建Dockerfile:
FROM gcr.io/deeplearning-platform-release/tf2-cpu
COPY mnistmodel/trainer /mnistmodel/trainer
ENTRYPOINT ["python3", "-m", "mnistmodel.trainer.task"]
  1. 构建并推送Docker镜像:
!docker build -f mnistmodel/Dockerfile -t $IMAGE_URI ./
!docker push $IMAGE_URI
  1. 提交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这样的简单图像分类任务,不同模型的性能表现如下:

  1. 线性模型:最简单,训练速度快,但准确率较低(约92%)
  2. DNN:准确率提升至约97%,训练时间适中
  3. 带Dropout的DNN:防止过拟合,在验证集上表现更稳定
  4. CNN:最适合图像数据,准确率可达99%以上,但训练时间较长

建议从小模型开始,逐步尝试更复杂的架构,根据实际需求在准确率和训练成本之间取得平衡。

总结

本文详细介绍了如何在Google Cloud Platform上构建、训练和部署MNIST手写数字分类模型的全过程。通过这个项目,您可以学习到:

  1. 使用TensorFlow 2.x构建不同类型的神经网络
  2. 数据预处理和加载的最佳实践
  3. 本地与云端训练的配置方法
  4. 使用Docker容器打包机器学习应用
  5. 模型部署和预测服务的创建

这套流程不仅适用于MNIST数据集,也可以扩展到其他图像分类任务,是掌握云端机器学习工作流的绝佳起点。

training-data-analyst Labs and demos for courses for GCP Training (http://cloud.google.com/training). training-data-analyst 项目地址: https://gitcode.com/gh_mirrors/tr/training-data-analyst

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏纲墩Dean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值