脚把脚教你利用PAI训练出自己的CNN手写识别模型并部署为可用的服务

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 虽然已经 9102 年了,MNIST手写数据集也早已经被各路神仙玩出了各种花样,比如其中比较秀的有用MINST训练手写日语字体的。但是目前还是很少有整体的将训练完之后的结果部署为一个可使用的服务的。大多数还是停留在最终Print出一个Accuracy。

虽然已经 9102 年了MNIST手写数据集也早已经被各路神仙玩出了各种花样,比如其中比较秀的有用MINST训练手写日语字体的。但是目前还是很少有整体的将训练完之后的结果部署为一个可使用的服务的。大多数还是停留在最终Print出一个Accuracy。
这一次我们就借助阿里云的PAI平台来快速构建训练一个手写模型并且部署出一个生产可用级别的服务的教程让大家可以在其他的产品中调用这个服务作出更加有意思的项目。

整个部分会分为3篇文章分别对应机器学习中: 构建训练以及导出模型 模型的部署以及模型的调用。这篇文章里我们先讲讲如何构建训练并导出这个手写字体识别的模型。整个教程的代码基于Snapchat的ML大佬 Aymeric Damien Tensorflow 入门教程系列

Step 1: 下载代码

首先我们可以把代码Clone到本地或者直接Clone到DSW的实例。如何Clone到DSW实例的方法可以参考我的这篇文章。Clone完代码之后我们还需要准备训练所需要的数据集这边可以直接从Yann Lecun的网站下载。我这边然后我们可先运行一遍看一下效果。
_Accuracy_

我们可以看到代码Clone下来之后直接运行就已经帮我们训练出了model并且给出了现在这个Model的精度。在500个batch之后准确率达到了95%以上而且基于GPU的DSW实例训练这500个Batch只需要十几秒的时间。

Step 2: 修改部分代码使得可以自动导出SavedModel

这一步就是比较重要的地方了我们第一个需要关注的就是当前的这个Model里面的Input和Output.

Input还比较清楚我们直接找所有placeholder就可以了
placeholder_

Output这一块就比较复杂了,在当前的model里我们可以看到output并不是直接定义的Y而是softmax之后的prediction
ConstructModel

找到了这些之后就比较简单了。首先我们创建一个 Saver , 它可以帮助我们保存所有的tf变量以便之后导出模型使用

# 'Saver' op to save and restore all the variables
saver = tf.train.Saver()

然后我们在模型训练的session结束的时候导出模型就好了。我们可以通过以下这段代码来导出我们训练好的模型

import datetime
# 声明导出模型路径这边加入了时间作为路径名 这样每次训练的时候就可以保存多个版本的模型了
export_path = "./model-" + datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')

# 保存训练的日志文件方便如果出问题了我们可以用 tensorboard 来可视化神经网络排查问题
tf.summary.FileWriter('./graph-' + datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') , sess.graph)

# 构建我们的Builder
builder = tf.saved_model.builder.SavedModelBuilder(export_path)

# 声明各种输入这里有一个X和一个keep_prob作为输入然后
tensor_info_x = tf.saved_model.utils.build_tensor_info(X)
tensor_info_keep_prob = tf.saved_model.utils.build_tensor_info(keep_prob)
tensor_info_y = tf.saved_model.utils.build_tensor_info(prediction)

prediction_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
        # 声明输入
        inputs={
            'images': tensor_info_x,
            'keep_prob' : tensor_info_keep_prob
        },
        # 声明输出
        outputs={
            'scores': tensor_info_y
        },
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
    )
)



legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
    sess, [tf.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
    },
    legacy_init_op=legacy_init_op)
# 保存模型
builder.save()

我们可以吧这段代码插在这里这样训练完成的时候就会自动导出了
_

导出之后应该会有如下的文件结构我们也可以在左边的文件管理器中查看

./model-2019-05-20_13:50:26
├── saved_model.pb
└── variables
    ├── variables.data-00000-of-00001
    └── variables.index

1 directory, 3 files

Step 3: 部署我们的模型

终于到了可以部署的阶段了。但是在部署之前先别那么着急建议用 tensorboard 把训练日志下载到本地之后看一下。
这一步除了可以可视化的解释我们的模型之外还可以帮助我们理清我们的模型的输入和输出分别是什么。
这边我先在有日志文件的路径打开一个tensorboard 通过这个命令

tensorboard --logdir ./

然后我们在游览器里输入默认地址 localhost:6006 就可以看到了
Tensorboard_

从这个图里也可以看到我们的这个Model里有2个输入源分别叫做images和keep_prob。并且点击它们之后我们
还能看到对应的数据格式应该是什么样的。不过没有办法使用 Tensorboard 的同学也不用担心因为EAS
这个产品也为我们提供了构造请求的方式。这一次部署我们先使用WEB界面来部署我们的服务这一步也可以通过EASCMD来实现之后我会再写一篇如何用好EASCMD的文章。

我们可以吧模型文件下载完之后用zip打包然后到PAI产品的控制台点击EAS-模型在线服务.
ZIP打包可以用这个命令如果你是Unix的用户的话

zip -r model.zip path/to/model_files

进入EAS之后我们点击模型部署上传
EAS_

然后继续配置我们的processor这一次因为我们是用tensorflow训练的所以选择Tensorflow
然后资源选择CPU有需要的同学可以考虑GPU然后上传我们的模型文件.
EAS_

点击下一步我们选新建服务然后给我们的服务起个名字,并且配置资源数量。
EAS_

然后最后确认一下就可以点击部署了
_

Step 4: 调试我们的模型

回到EAS的控制台我们可以看到我们的服务正在被构建中。等到状态显示Running的时候我们就可以开始调试了。
我们可以先点击在线调试
_

会让我们跳转到一个Debug 接口的页面。什么都不需要填直接点击提交我们就可以看到服务的数据格式了
debug_

然后我们用一段python2的代码来调试这个刚刚部署完的服务。python3的SDK暂时还在研发中。注意要把下面的
app_key, app_secret, url 换成我们刚刚部署好的内容。点击模型名字就可以看见了。

其中测试图片的数据大家可以在下载到

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

from urlparse import urlparse
from com.aliyun.api.gateway.sdk import client
from com.aliyun.api.gateway.sdk.http import request
from com.aliyun.api.gateway.sdk.common import constant
from pai_tf_predict_proto import tf_predict_pb2

import cv2
import numpy as np

with open('9.jpg', 'rb') as infile:
    buf = infile.read()
    # 使用numpy将字节流转换成array
    x = np.fromstring(buf, dtype='uint8')
    # 将读取到的array进行图片解码获得28 × 28的矩阵
    img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)
    # 由于预测服务API需要长度为784的一维向量将矩阵reshape成784
    img = np.reshape(img, 784)

def predict(url, app_key, app_secret, request_data):
    cli = client.DefaultClient(app_key=app_key, app_secret=app_secret)
    body = request_data
    url_ele = urlparse(url)
    host = 'http://' + url_ele.hostname
    path = url_ele.path
    req_post = request.Request(host=host, protocol=constant.HTTP, url=path, method="POST", time_out=6000)
    req_post.set_body(body)
    req_post.set_content_type(constant.CONTENT_TYPE_STREAM)
    stat,header, content = cli.execute(req_post)
    return stat, dict(header) if header is not None else {}, content


def demo():
    # 输入模型信息,点击模型名字就可以获取到了
    app_key = 'YOUR_APP_KEY'
    app_secret = 'YOUR_APP_SECRET'
    url = 'YOUR_APP_URL'

    # 构造服务
    request = tf_predict_pb2.PredictRequest()
    request.signature_name = 'predict_images'
    request.inputs['images'].dtype = tf_predict_pb2.DT_FLOAT  # images 参数类型
    request.inputs['images'].array_shape.dim.extend([1, 784])  # images参数的形状
    request.inputs['images'].float_val.extend(img)  # 数据

    request.inputs['keep_prob'].dtype = tf_predict_pb2.DT_FLOAT  # keep_prob 参数的类型
    request.inputs['keep_prob'].float_val.extend([0.75])  # 默认填写一个

    # å°†pbåºåˆ—化æˆstringè¿›è¡Œä¼ è¾“
    request_data = request.SerializeToString()

    stat, header, content = predict(url, app_key, app_secret, request_data)
    if stat != 200:
        print 'Http status code: ', stat
        print 'Error msg in header: ', header['x-ca-error-message'] if 'x-ca-error-message' in header else ''
        print 'Error msg in body: ', content
    else:
        response = tf_predict_pb2.PredictResponse()
        response.ParseFromString(content)
        print(response)


if __name__ == '__main__':
    demo()

运行这个python代码然后我们会得到

outputs {
  key: "scores"
  value {
    dtype: DT_FLOAT
    array_shape {
      dim: 1
      dim: 10
    }
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 0.0
    float_val: 1.0
  }
}

我们可以看到从0开始数的最后一个也就是第9个的结果是1 其他都是0 说明我们的结果是9和我们输入的一样。这样我们就简单轻松的构建了一个在线服务能够将用户的图片中手写数字识别出来。配合其他Web框架或者更多的东西我们就可以作出更好玩的玩具啦

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
相关文章
|
12天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的五大技巧
【4月更文挑战第7天】 在数据科学迅猛发展的今天,机器学习已成为解决复杂问题的重要工具。然而,构建一个既精确又高效的机器学习模型并非易事。本文将分享五种提升机器学习模型性能的有效技巧,包括数据预处理、特征工程、模型选择、超参数调优以及交叉验证。这些方法不仅能帮助初学者快速提高模型准确度,也为经验丰富的数据科学家提供了进一步提升模型性能的思路。
|
17天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型的最佳实践
【4月更文挑战第3天】在数据驱动的时代,构建高效的机器学习模型已成为解决复杂问题的关键。本文将探讨一系列实用的技术策略,旨在提高模型的性能和泛化能力。我们将从数据预处理、特征工程、模型选择、超参数调优到集成学习等方面进行详细讨论,并通过实例分析展示如何在实践中应用这些策略。
15 1
|
2天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
25 7
|
2天前
|
机器学习/深度学习 算法 数据处理
构建自定义机器学习模型:Scikit-learn的高级应用
【4月更文挑战第17天】本文探讨了如何利用Scikit-learn构建自定义机器学习模型,包括创建自定义估计器、使用管道集成数据处理和模型、深化特征工程以及调优与评估模型。通过继承`BaseEstimator`和相关Mixin类,用户可实现自定义算法。管道允许串联多个步骤,而特征工程涉及多项式特征和自定义变换。模型调优可借助交叉验证和参数搜索工具。掌握这些高级技巧能提升机器学习项目的效果和效率。
|
3天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从特征工程到模型调优
【4月更文挑战第16天】 在数据驱动的时代,机器学习已成为解决复杂问题的关键工具。本文旨在分享一套实用的技术流程,帮助读者构建高效的机器学习模型。我们将重点讨论特征工程的重要性、选择合适算法的策略,以及通过交叉验证和网格搜索进行模型调优的方法。文章的目标是为初学者提供一个清晰的指南,同时为有经验的实践者提供一些高级技巧。
|
4天前
|
机器学习/深度学习 人工智能 分布式计算
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
|
9天前
|
机器学习/深度学习 JavaScript 前端开发
机器学习模型部署:使用Python和Vue搭建用户友好的预测界面
【4月更文挑战第10天】本文介绍了如何使用Python和Vue.js构建机器学习模型预测界面。Python作为机器学习的首选语言,结合Vue.js的前端框架,能有效部署模型并提供直观的预测服务。步骤包括:1) 使用Python训练模型并保存;2) 创建Python后端应用提供API接口;3) 利用Vue CLI构建前端项目;4) 设计Vue组件实现用户界面;5) 前后端交互通过HTTP请求;6) 优化用户体验;7) 全面测试并部署。这种技术组合为机器学习模型的实用化提供了高效解决方案,未来有望更加智能和个性化。
|
14天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【4月更文挑战第6天】本文聚焦于机器学习模型的开发流程,旨在提供一套系统的方法论以构建出更高效的模型。我们将深入探讨数据预处理的重要性,特征工程的策略,以及如何通过交叉验证和超参数调优来提升模型性能。文章不仅涉及理论分析,还包括了实际案例的代码实现,为读者呈现一个从数据处理到模型部署的完整蓝图。
13 0
|
15天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【4月更文挑战第5天】 在机器学习领域,构建一个高效的模型并非易事。它涉及多个阶段,包括数据预处理、特征工程、模型选择、训练以及最终的评估和优化。本文深入探讨了如何通过精确的数据预处理技巧和细致的特征工程来提升模型性能,同时介绍了几种常见的模型优化策略。我们的目标是为读者提供一套实用的指导方案,帮助他们在面对复杂数据集时能够有效地构建和调整机器学习模型。
|
15天前
|
机器学习/深度学习 算法 数据挖掘
构建高效机器学习模型:从特征工程到模型调优
【4月更文挑战第4天】在数据驱动的时代,构建一个高效的机器学习模型是解决复杂问题的关键。本文将深入探讨特征工程的重要性,并分享如何通过自动化技术进行特征选择与构造。接着,我们将讨论不同的机器学习算法及其适用场景,并提供模型训练、验证和测试的最佳实践。最后,文章将展示如何使用网格搜索和交叉验证来微调模型参数,以达到最优性能。读者将获得一套完整的指南,用以提升机器学习项目的预测准确率和泛化能力。

相关产品

  • 人工智能平台 PAI