使用 OpenBayes 进行手写数字的识别

去 GitHub 贡献本页面

快速开始 讲解了如何用 OpenBayes 运行第一个机器学习任务,这里我们依然使用那个 MNIST 的例子进行进一步的阐述,介绍更多 OpenBayes 的使用细节。

了解过机器学习,尤其是最近几年大热的深度学习方法的朋友很可能有听过过 MNIST 这个数据集,数据集来自美国国家标准与技术研究所,National Institute of Standards and Technology (NIST)。训练集 (training set) 由来自 250 个不同人手写的数字构成,测试集(test set)也是同样比例的手写数字数据。

我们这里就借用这个数据集来介绍在 openbayes 中采用 tensorflow 进行图片的识别。其中会使用到 openbayes 的数据集绑定、模型的训练以及模型的使用。

获取数据以及代码

从 Github 下载样例代码:

git clone https://github.com/signcl/openbayes-mnist-example.git

切换到所下载代码目录看到代码结构如下:

.
├── code.zip
├── inference.py
├── input
│   └── mnist.npz
└── train.py

1 directory, 4 files

其中,

  1. input 目录包含了 mnist 数据集
  2. .py 包含了执行机器学习模型训练和采用模型进行推断的代码
  3. code.zip 是将目录中 .py 文件和 input 目录通过 zip 打包所获得的。在 OpenBayes 上传代码目前支持以 zip 压缩包的方式将代码上传上去

上传第一个数据集

要想进行机器学习模型的训练,通常第一步应当是准备数据,OpenBayes 数据集管理 负责用户数据集的上传、展示等功能。在 OpenBayes 中创建 Python 脚本执行任务时,其文件大小有 100M 的限制,虽然该项目中数据集非常小(仅 10M+),但是对于更大的数据集,应当在 “OpenBayes 数据集管理” 中首先上传。我们应当我们这里也是首先创建一个 mnist 的数据集并将目录中 mnist.npz 文件上传到数据集中。

首先创建 mnist 数据集。

可以看到数据集列表中出现一个新的 mnist 数据集。

点击进入 mnist 数据集页面。

数据集同样仅支持以 zip 压缩包的形式进行数据的上传。进入 input 目录,右键压缩数据集文件。

在页面点击上传压缩包,上传之。

稍等片刻,压缩包将会被解压并将数据展示到页面中。

创建第一个任务

数据集准备好后在页面左侧导航栏点击 “算力容器” > “新建容器” 创建一个 Python 脚本执行的任务,采用 train.py 训练一个 tensorflow 的手写识别模型。

在 “新建容器” 的 “绑定数据” 处点击 mnist 数据集。

页面将会展示所需要的数据集将会被绑定到 BayesGear 的 /input0 目录下。

算力选择 CPU,镜像选择 “tensorflow-1.11-cpu”,接入方式选择 Python 脚本执行,并将目录中 *.py 文件压缩上传。

注意 在执行代码上传时,要注意所打包的代码层级,在当前目录下选中所要上传的文件后右键压缩,所提交的代码 inference.py train.py 才默认处于根目录下,如果将外层目录打包(即压缩 openbayes-mnist-example 目录),所获取的 .py 文件需以 openbayes-mnist-example/inference.py 的方式获取。

在执行命令处输入命令:

python train.py -i /input0 -o /output -e 10 -m model.h5

其中:

  1. train.py 为用于模型训练的 py 文件
  2. -i /input0 指明训练所需的 mnist.npz 所在目录
  3. -o /output 指明 BayesGear 所要保存的文件目录为 /output在 Python 脚本执行模式下,BayesGear 会将 /output 目录下的结果进行保存并上传,因此所有的输出结果都应保存在该目录下其他目录下,甚至包含默认的 . 目录下的文件更新都将不会被保存
  4. -e 10 指定了模型训练的 epoch
  5. -m model.h5 指明的保存的模型的名称,当然结合 -o /output 参数,最终的训练模型会存储到 /output/model.h5

train.py 中参数的解析采用了 Python 内置的库 argparse 进行处理,更多内容见 argparse — Parser for command-line options, arguments and sub-commands

提交任务后等待 2 - 3 分钟的时间任务将开始执行。任务开启的时间通常与所绑定数据集大小有关,所需数据集越大,容器执行准备时间越长。在容器页面可以看到日志所展示的执行情况。

查看执行的目录以及输出结果

执行完毕后,点击容器页面的 “输出” 选项卡可以看到我们所指定的模型已经创建好了。

用训练好的模型进行分类

在获取了训练模型后,我们就可以用其对数据进行分类预估了。再次回到 “新建容器” 页面,创建一个名为 “mnist-task-inference” 的容器,并在绑定数据时绑定两个数据:

  1. 绑定 mnst 数据集到 /input0 目录
  2. 绑定之前容器 mnist-task 的 “输出” 到 /input1 目录

注意,在 openbayes 中可以将一个 BayesGear 的输出绑定到一个新的容器上,实现 “管道” 的效果。这里我们就是将之前的一个 “模型训练” 的输出作为了一个 “模型推断” 任务的输入。

然后同样上传之前的 zip 包,并指定执行命令

python inference.py -i /input0 -m /input1/model.h5

其中 -i /input0 指定 mnist.npz 所在目录;-m /input1/model.h5 指定需要载入的模型的目录。

提交并执行完毕后,可以看到日志中展示了对 10000 测试结果获取了 98% 的准确率。