本文为您介绍如何使用深度学习框架TensorFlow,快速搭建图像识别的预测模型。
前提条件
已创建OSS Bucket,并完成了OSS授权,详情请参见控制台创建存储空间和云产品依赖与授权:Designer。
重要创建Bucket时,不要开通版本控制,否则可能导致训练失败。
已开启GPU,详情请参见MaxCompute资源。
背景信息
随着互联网发展,产生了大量图片及语音数据。如何有效利用这些非结构化数据,一直是困扰数据挖掘工程师的一道难题。主要原因包括:
通常需要使用深度学习算法,上手门槛高。
通常需要依赖GPU计算引擎,计算资源费用高。
Designer及原PAI-Studio已经预置了使用深度学习框架实现图片分类的模板,您可以直接从模板创建实验,并将其复用到图片鉴黄、物体检测等领域。
数据集
本实验使用CIFAR-10数据集,该数据集包含6万张像素为32*32的彩色图片,共10个类别,分别为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船及卡车,如下图所示。您可以下载该数据集及相关代码,详情请参见CIFAR 10案例。
使用过程中将该数据集拆分为训练数据集(5万张图片)和预测数据集(1万张图片)。其中5万张图片的训练数据集又被拆分为5个data_batch,1万张图片的预测数据集组成test_batch,如下图所示。
数据准备
将本实验的数据集和相关代码上传至OSS的Bucket路径。例如,在OSS的Bucket下创建aohai_test文件夹及四个子文件夹,如下图所示。每个文件夹的作用如下:
check_point:存储实验生成的模型。
说明从原PAI-Studio模板创建实验后,必须手动将TensorFlow组件的checkpoint输出目录/模型输入目录参数配置为已有的OSS文件夹路径,整个实验才能运行。本实验中,将checkpoint输出目录/模型输入目录配置为check_point文件夹路径。
cifar-10-batches-py:存储训练数据集和预测数据集对应的数据源文件cifar-10-batcher-py和预测集文件bird_mount_bluebird.jpg。
train_code:存储训练数据,即cifar_pai.py。
predict_code:存储cifar_predict_pai.py。
使用TensorFlow实现图片分类
以原PAI-Studio的操作步骤为例,来说明如何使用TensorFlow实现图片分类,具体操作步骤如下。
进入Designer页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,进入Designer页面。
- 在可视化建模(Designer)页面右上方,单击前往旧版可视化建模(Studio)。
构建实验。
在原PAI-Studio项目空间的左侧导航栏,单击首页。
在模板列表,单击Tensorflow图片分类下的从模板创建。
在新建实验对话框,配置参数(可以全部使用默认参数)。
参数
描述
名称
输入TensorFlow图片分类。
项目
不支持修改。
描述
输入使用TensorFlow实现图片分类。
位置
选择我的实验。
单击确定。
可选:等待大约十秒钟,在原PAI-Studio控制台的左侧导航栏,单击实验。
可选:在我的实验下,单击TensorFlow图片分类_XX。
其中我的实验为已配置的实验位置,TensorFlow图片分类_XX为已配置的实验名称(_XX为系统自动添加的实验序号)。
系统根据预置的模板,自动构建实验,如下图所示。
区域
描述
①
训练数据,系统已自动配置了本实验的训练数据集路径。如果使用其他数据集,只需单击画布中的读OSS数据-1,在右侧字段设置面板,将OSS数据路径配置为存储训练数据的OSS路径。
②
预测数据,系统已自动配置了本实验的预测数据集路径。如果使用其他数据集,只需单击画布中的读OSS数据-2,在右侧字段设置面板,将OSS数据路径配置为存储预测数据的OSS路径。
③
使用TensorFlow训练模型,只需要手动配置checkpoint输出目录/模型输入目录,其他参数使用默认值即可。该组件的参数与OSS路径下的文件对应关系如下:
Python代码文件:配置为OSS路径中的cifar_pai.py。
OSS数据源目录:配置为OSS路径中的cifar-10-batches-py文件夹,系统会自动从上游读OSS数据-1节点同步数据。
checkpoint输出目录/模型输入目录:配置为OSS路径中的check_point文件夹,用于存储输出模型。
④
生成预测结果,只需要手动配置checkpoint输出目录/模型输入目录,其他参数使用默认值即可。该组件的参数与OSS路径下的文件对应关系如下:
Python代码文件:配置为OSS路径中的cifar_predict_pai.py。
OSS数据源目录:配置为OSS路径中的cifar-10-batches-py文件夹,系统会自动从上游读OSS数据-2节点同步数据。
checkpoint输出目录/模型输入目录:需要与TensorFlow训练组件的模型输出目录保持一致,即配置为OSS路径中的check_point文件夹。
运行实验并查看输出结果。
单击画布上方的运行。
实验运行结束后,您可以在配置的OSS路径(checkpoint输出目录/模型输入目录)下查看预测结果。
训练代码解析
针对cifar_pai.py文件中的关键代码进行解析:
构建CNN图片训练模型
network = input_data(shape=[None, 32, 32, 3], data_preprocessing=img_prep, data_augmentation=img_aug) network = conv_2d(network, 32, 3, activation='relu') network = max_pool_2d(network, 2) network = conv_2d(network, 64, 3, activation='relu') network = conv_2d(network, 64, 3, activation='relu') network = max_pool_2d(network, 2) network = fully_connected(network, 512, activation='relu') network = dropout(network, 0.5) network = fully_connected(network, 10, activation='softmax') network = regression(network, optimizer='adam', loss='categorical_crossentropy', learning_rate=0.001)
训练生成模型model.tfl
model = tflearn.DNN(network, tensorboard_verbose=0) model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=(X_test, Y_test), show_metric=True, batch_size=96, run_id='cifar10_cnn') model_path = os.path.join(FLAGS.checkpointDir, "model.tfl") print(model_path) model.save(model_path)
预测代码解析
针对cifar_predict_pai.py文件中的关键代码进行解析。首先读入图片bird_bullocks_oriole.jpg,将其调整为32*32像素大小。然后传入model.predict预测函数评分,返回这张图片对应的十种分类[‘airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’]的权重。最后将权重最高的一个分类作为预测结果返回。
predict_pic = os.path.join(FLAGS.buckets, "bird_bullocks_oriole.jpg")
img_obj = file_io.read_file_to_string(predict_pic)
file_io.write_string_to_file("bird_bullocks_oriole.jpg", img_obj)
img = scipy.ndimage.imread("bird_bullocks_oriole.jpg", mode="RGB")
# Scale it to 32x32
img = scipy.misc.imresize(img, (32, 32), interp="bicubic").astype(np.float32, casting='unsafe')
# Predict
prediction = model.predict([img])
print (prediction[0])
print (prediction[0])
#print (prediction[0].index(max(prediction[0])))
num=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
print ("This is a %s"%(num[prediction[0].index(max(prediction[0]))]))