Giter Site home page Giter Site logo

huaweicloud / modelarts-lab Goto Github PK

View Code? Open in Web Editor NEW
992.0 57.0 841.0 580.93 MB

ModelArts-Lab是示例代码库。更多AI开发学习交流信息,请访问华为云AI开发者社区:huaweicloud.ai

License: Apache License 2.0

Jupyter Notebook 98.65% Python 1.09% Shell 0.01% Objective-C 0.01% MATLAB 0.15% M 0.01% Lua 0.03% C++ 0.03% C 0.02% Makefile 0.01% Cython 0.02%

modelarts-lab's Issues

在ModelArts上提交的训练跑到中途会卡住

提交的训练显示正在运行,但是日志不再更新,obs上的log更新时间也不动了,资源占用也变为0%,log没有任何报错,就是到某个时间突然不动了。
之前出现过,工作人员排查说Python进程处于Sl状态,检查发现,内核在等待62这个"文件"的数据。然后进一步查看,python进程fd下的62文件是一个socket连接,且这个连接没有/proc/net/tcp下,说明这个socket连接创建后,并没有被使用,所以Python一直卡死在“read(62,” 这个状态。
这次让log输出了图片名称,最后一次读的图片应该是正常图片。
任务号是trainjob-ddaa | jobd6683324

三期00任务的部分理论知识补充

作为小白,没有系统学习机器学习,只能拿代码理解去理解理论了。下面把00任务的相关代码进行了百度查询。

00任务的名称是:训练轮数与callbacks,其中callbacks,即回调函数。
训练轮次好理解就是:
callbacks回调函数怎么理解呢?kears官网是这样解释的:
回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。可知在接下来的操作中要深入了解如图的各项内容,代码的位置:
image
直白的讲,就是设置模型的训练次数、等参数的。

接着任务介绍里面提到本次任务我们还会进行(ModelCheckpoint),(EarlyStopping),(ReduceLROnPlateau)这三项的相关实践。简单的百度了下,对实践内容可以更好的理解。

1.ModelCheckpoint翻译过来是模型检查点,模型好理解,检查点是什么,为什么要有检查点?
Keras文档为检查点提供了一个很好的解释:
模型的体系结构,允许你重新创建模型
模型的权重
训练配置(损失、优化器、epochs和其他元信息)
优化器的状态,允许在你离开的地方恢复训练
同样,一个检查点包含了保存当前实验状态所需的信息,以便你可以从这一点恢复训练。
代码中位置:
image
直白的讲,一种保存你实验状态的方法,这样你就可以从你离开的地方开始继续学习。

2.EarlyStopping翻译过来早停,一百度就是早停法。顾名思义就是让你提前停止训练,那为啥要提前呢?查询相关资料了解到。
在进行模型的训练的时候,设置的epoch太少的时候,网络会发生欠拟合也就是学习不充分。所以,我们往往会把epoch设置很大直到发生过拟合,这时候通过刚刚说的ModelCheckpoint来获得所有的训练结果来分析,找到即将发生过拟合的点,然后操作EarlyStopping来早停,从而获得最佳模型参数。
如图:可以看到12~13次后就要开始过拟合
QQ截图20190704225110
准确值断崖式下降,这时候我们就需要使用EarlyStopping来解决了。
直白的说,当监测数据不再变好,我们就停止训练。相关代码如下:
image

3.ReduceLROnPlateau
这个称为学习率衰减,为什么要设置这个参数呢?找了些相关资料进行了解:
a.为了防止学习率过大,在收敛到全局最优点的时候会来回摆荡,所以要让学习率随着训练轮数不断按指数级下降,收敛梯度下降的学习步长。
b.网络的评价指标不在提升的时候,可以通过降低网络的学习率来提高网络性能。
c.加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减。
d.就想我们问路一样,别人告诉我们直走五分钟,有的人走的快,有的人走的慢,所以如果走的快的话,当再次问路的时候,就会发现走多了,而折回来,这就是我们训练过程中的loss曲线震荡严重的原因之一. 所以学习率要设置在合理的大小。
(这段来自https://www.cnblogs.com/gongxijun/p/8039262.html,感谢Gxjun的直白说明)
总结下:就是开始阶段学习率可以快,到了后面得降速,因为高速率下来回震荡也大。只能这样感觉的理解啦。
相关代码如下:
image
————————————————————————————————
ok,大概理解本次任务的理论了,接下再把相关的代码过一遍。
读取数据
image
数据处理
image
为什么要转化为浮点型:
浮点数的运算速度比整数要快。特别是显卡运算都是使用的浮点数,图形计算用到的很多公式,其中间结果都是有小数的,你如果用整数计算,这些小数都被略掉了,在积累很多步骤以后,最后的结果误差可能会很大。为了提高渲染物体位置精度,从GPU诞生时刻起就专注于大规模使用浮点计算单元。
x_train /= 255:对数据进行归一化到0-1 因为图像数据最大是255。
数据归一化:把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。
to_categorical:简单来说,to_categorical就是将类别向量转换为二进制。
n_classes:为标签类别总数。
构建模型
image
这一部分内容比较深,主要了解下如何调用。
image
model.summary():打印出模型概况,可以大概了解调用模型里面的神经网络结构。
模型训练
image

model.compile(loss='目标函数', optimizer=optimizer, metrics=['accuracy'])

loss:目标函数,也叫损失函数,是网络中的性能函数.
这次的损失函数为binary_crossentropy。
binary_cross_entropy是二分类的交叉熵,实际是多分类softmax_cross_entropy的一种特殊情况,当多分类中,类别只有两类时,即0或者1,即为二分类,二分类也是一个逻辑回归问题,也可以套用逻辑回归的损失函数。所以这次是训练猫狗识别,选用了该损失函数来运行。

optimizer:也叫优化器它的作用:一句话来说,用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数E(x)这种算法使用各参数的梯度值来最小化或最大化损失函数E(x)。最常用的一阶优化算法是梯度下降。
目前有:SGD、RMSprop(本次使用)、Adagrad、Adadelta、Adam、Adamax、Nadam、TFOptimizer。相关算法详细(https://blog.csdn.net/bvl10101111/article/details/72616378)
image

metrics:衡量指标,常见指标Accuracy、Precision、Recall针对多分类的计算方法。我们这次使用准确率(accuracy),准确率即分类正确的样本数占总样本数的比例。


最重要的部分来啦
image
我们先把代码过下,然后再一次了解下(ModelCheckpoint, EarlyStopping, ReduceLROnPlateau)这三指标的意义。不过在此之前先了解
运行的数据集分为:训练集(train set),验证集(validation set)和测试集(test set)。
train_loss是训练集上的损失值,train_acc是训练集准确率。
val 代表 validation
val_loss是验证集上的损失值,val_acc是验证集上的准确率。
test_loss是测试集上的损失值,test_acc是测试集上的准确率。
先来早停
早停EarlyStopping
es = EarlyStopping(monitor='val_acc', min_delta=0.001, patience=5, verbose=1, mode='auto')
monitor:中文意思监视器。监控你需要的值,如”val_acc“。

min_delta:增大或减小的阈值,只有大于这个部分才算作improvement。这个值的大小取决于monitor,也反映了你的容忍程度。

patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。又表示为能够容忍多少个epoch内都没有improvement。这个设置其实是在抖动和真正的准确率下降之间做tradeoff。

verbose:信息展示模式,当verbose = 0 为不在标准输出流输出日志信息verbose = 1 为输出进度条记录。例如 0或1(checkpoint的保存信息,类似Epoch 00001: saving model to ...)。

mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。

小结:min_delta和patience都和“避免模型停止在抖动过程中”有关系,所以调节的时候需要互相协调。通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦然。

保存最佳模型ModelCheckpoint
cp = ModelCheckpoint(filepath="./model/ckp_vgg16_dog_and_cat.h5", monitor="val_acc", verbose=1, save_best_only=True, mode="auto", period=1)
filepath:字符串,保存模型的路径。
monitor:中文意思监视器。监控你需要的值,如”val_acc“。
verbose:同上。
save_best_only:当设置为True时,监测值有改进时才会保存当前的模型( the latest best model according to the quantity monitored will not be overwritten)。
mode:同上。
period:CheckPoint之间的间隔的epoch数。
小结下:运行后发现patience个epoch中看不到模型性能提升,则可以减少学习率。接下来就是学习率了!!!

学习率衰减ReduceLROnPlateau
lr = ReduceLROnPlateau(monitor="val_acc", factor=0.1, patience=3, verbose=1, mode="auto", min_lr=0)
还是先走一遍代码
monitor:同上。
factor:学习率每次降低多少,new_lr = old_lr * factor。
patience:容忍网路的性能不提升的次数,高于这个次数就降低学习率。
verbose:同上。
mode:同上。
min_lr学习率的下限。

更多参数:
lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)

mode :(str) ,可选择‘min’或者‘max’,min表示当监控量停止下降的时候,学习率将减小,max表示当监控量停止上升的时候,学习率将减小。默认值为‘min’。
threshold:(float) - 测量新最佳值的阈值,仅关注重大变化。 默认值:1e-4。
cooldown: 减少lr后恢复正常操作之前要等待的时期数。 默认值:0。
eps ,适用于lr的最小衰减。 如果新旧lr之间的差异小于eps,则忽略更新。 默认值:1e-8。

小结下:主要是在训练后期进行收敛的操作,先通过多次数的训练找到过拟合点,再进行学习率衰减。目前,跑完是这样理解了。接下来开始实操


image
history = model.fit(x=x_train, y=y_train, batch_size=16, epochs=5, verbose=1, callbacks=callbacks, validation_split=0.25, shuffle=True, initial_epoch=0, )
先过下代码
x:输入数据。如果模型只有一个输入,那么x的类型是numpy
array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
y:标签,numpy array

batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。理解为批处理参数,它的极限值为训练集样本总数。
在深度学习中所涉及到的数据都是比较多的,一般都采用小批量数据处理原则。但是,批次越小,梯度的估值就越不准确。
image
Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况。
Batch Size从小到大的变化对网络影响
1、没有Batch Size,梯度准确,只适用于小样本数据库
2、Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
3、Batch Size增大,梯度变准确,
4、Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用
所以在硬件性能有保障的前提下,可以逐步提升直到梯度准确没有太大变化。

epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch
verbose:同上。
callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数。本次案例为[es,cp,lr]

validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。

shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。

initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。

fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况

小结下:batch_size、epochs的调整对训练结果有明显的区别,同时要根据输出的日志查看到相应的提升变化进行调整。

(云宝-物体检测)+(Notebook-python人脸识别)

ID:wjsandy

第一个实验-感觉还是非常快就做完了,因为前期有做关于识别花的实验,群里童学还开玩笑,识别图片大老婆和小老婆 ,我最后做的是识别动物类的!有兴趣可以点进去看看,这节的物体检测涨了一个知识点,导入市场的数据集,这后期用处大一些,废话不多说,特意选了几张图,发现还是不能太相信机器!

3-1

然后我用了张老虎和兔子的让预测,也会提示83%,急着写分享,就不用美女图片来预测了!有兴趣的童学可以去试试!这几天太多课了,一会7天,一会微服务,又是云计算,学的天昏地暗!

3-2

第二个Notebook实验来了!按指导一步步复制代码,运行,然后最后在ModelArts-部署上线-上线服务里,上传张人脸图来识别下!会有惊喜,识别完,再操作最后一步删推理资源。特别提一下按需的资源停止没用,要删除哦!昨天3点被计费了!

3-3
3-4
3-5

每日专家答疑,答疑时间为:16:00--17:00

400元新手资源包免费领:http://t.cn/AiKl9ahM

本次课程报名学习地址:http://t.cn/AiKjASXh

每日体验官评选参与:http://t.cn/AiKEnoZL

实验班活动详情页: https://dwz.cn/RazsyPcy

完成实验享班级奖励,课程报名截图+实验截图私信云学院小助手
领取抽奖码&开通ModelArts微认证学考资格!

【华为云学院微认证】ModelArts实现零售商客户分群,证书回帖区

【华为云学院微认证】ModelArts实现零售商客户分群,证书回帖区

小提示:本则回帖区,仅限完成这个【ModelArts 实现零售商客户分群】微认证 并获取证书者回帖,若回复其他帖子,管理员将视情况删除。

  1. 【留下微认证通过记录】
  2. 【获得通过微认证奖励积分】

通过Resnet预训练模型提升图像分类模型精度

在本次实践中,将通过resnet预训练模型来进行猫狗图像识别的模型训练。
相比之前实验中采用的VGG16网络,resnet网络要更加复杂,模型的参数数量要更多,如果仅通过已有的25000张图片来训练resnet网络,是远远不够的,幸运的是,resnet网络也提供了若干预训练模型,来加速网络的训练和提升精度。
所谓的预训练模型,就是实现使用大型的图像分类数据集完成了对模型的训练,并将训练后的模型参数保存下来。在我们的训练过程中,就可以在创建模型时直接导入这些已经训练好的模型参数,然后再对模型的某些层展开训练(这里一般指的是模型最后的全连接层)。
采用预训练模型,能够充分利用模型在大型数据集上已经提取出来的图像特征,使得即便只有少量的训练数据,也能够达到很高的训练精度,训练速度也大大提高。
接下来。我们就对我们的程序进行改造,具体代码如下:
只需将原有程序中模型创建的这部分代码:

vgg创建

改为以下代码:
首先,添加ResNet50依赖
from keras.applications.resnet50 import ResNet50
接下来,导入预训练模型
base_model = ResNet50(weights='imagenet', include_top=False, pooling=None, input_shape=(ROWS, COLS, CHANNELS), classes=2)
然后,冻结base_model所有层,这样在训练时,这些层的参数不会再参与训练
for layer in base_model.layers:
layer.trainable = False
x = base_model.output
接下来,添加自己的全链接分类层
x = Flatten()(x)
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
最终,获得最终模型
model = Model(inputs=base_model.input, outputs=predictions)
在这里,我们采用的是resnet在imagenet这个数据集上训练得到的预训练模型。Imagenet数据集有1400多万幅图片,涵盖2万多个类别。当使用ResNet50()导入模型时,程序会自动联网到github上下载预训练模型(这里我得吐槽一句,为啥我在本机直接从github上下载预训练模型就只有不到15kb的下载速度,而NoteBook就几乎是瞬间下载…)。
程序的其他部分不变,我们再次展开实验

resnet训练精度

我们可以发现,模型在训练集和验证集上的精度,均得到了极大提高
最终,在测试集上的精度如下:

resnet测试精度

可以看到,最终的模型在测试集上的分类精度高达96%,几乎是完美完成了分类任务。
由此,可以总结如下:采用常用模型的预训练模型,可以大大缩短模型训练的时间,提高模型的精度。在训练数据不充分,计算资源和开发时间有限的情况下,采用预训练模型是我们的最佳选择。

ModelArts 自学打卡

华为云账号:HaolinLiu

自动学习案例完成截图:

玫瑰效果图
雏菊效果图
蒲公英效果图
向日葵效果图

Notebook案例完成截图:

实践效果

GPU使用问题

使用训练作业功能时,无法正常使用GPU模式进行训练,希望加入相应演示文档进行相关步骤教学。

【2019-05-26】NLP自然语言处理,NER命名实体识别应用实践

本案例默认您已经练习过“手写数字图像识别应用实践”#1 ,不熟悉ModelArts的朋友请先花点时间熟悉ModelArts起手式。

实践1:按照下面步骤完成Notebook环境数据准备、模型训练、模型测试:
https://github.com/huaweicloud/ModelArts-Lab/tree/master/%E7%BB%BC%E5%90%88AI%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B/NER-BERT

实践2:ModelArts 训练服务&模型部署:NLP(自然语言处理) NER(命名实体识别)应用端到端实验:
下周放出敬请期待,欢迎您根据实践1提出自己的期望,我们会尽量在后续的实践中迭代完善。更加欢迎给我们提交Issues&PR 让我们共同进步。

在ModelArts上采用4种深度学习框架实现经典手写体识别案例

在ModelArts上采用4种深度学习框架实现经典手写体识别案例
Author:zss33266
Date:2019-07-08

华为云ModelArts支持多种主流开源的深度学习框架,作为图像识别入门的经典的手写体识别案例,华为云官网帮助文档已经做了不同版本的实现,在本次ModelArts-Lab库official_examples中也有详细的操作文档,具体实现步骤就不在详细描述,以下主要是我对主流的几个深度学习框架和手写体识别案例关键步骤做一个归纳汇总:

模型训练
一、 MXNet

框架介绍:
MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。MXNet的很多作者都是**人,其最大的贡献组织为百度,同时很多作者来自cxxnet、minerva和purine2等深度学习项目,可谓博采众家之长。它是各个框架中率先支持多GPU和分布式的,同时其分布式性能也非常高。

在ModelArts中采用MXNet框架实现手写体识别的几个核心步骤:

  1. 准备数据集,可以直接在模型市场导入到自己的数据集中,存储路径需要事先准备一个桶,如图所示:
    1
    image2
    image3

  2. 创建MXNet训练作业需要注意的地方,数据来源就是我们从市场导入的数据集,算法来源选择MXNet和对应的Python版本,可以选择2.x也可以选择3.x,代码目录和启动文件一定要事先在桶中创建好,运行参数num_epochs为最大训练的批次数,可以根据实际情况来填写,默认为10,这里定义为8,训练输出路径也需要在桶中提前创建好,用于存放训练好的模型。
    image4
    image5
    image6

  3. 查看训练作业结果,本次创建的训练资源采用的4个GPU,P100的高性能计算实例,训练速度快到飞起来,虽然每小时30元左右,但最终用了不到1分钟的时间,完成了手写体识别模型的训练,花费不足1元钱,通过日志可以看到,最后训练的精度达到了97%左右。
    image7

以上是我个人实验的一些关键步骤,具体详细的操作点击:
官方Git操作指南:
https://github.com/yepingjoy/ModelArts-Lab/tree/master/offical_examples/Using_MXNet_to_Create_a_MNIST_Dataset_Recognition_Application
官方帮助文档:
https://support.huaweicloud.com/bestpractice-modelarts/modelarts_10_0009.html

二、 Tensorflow

框架介绍:
TensorFlow最初是由Google Brain Team的研究人员和工程师开发的。其目的是面向深度神经网络和机器智能研究。自2015年底以来,TensorFlow的库已正式在GitHub上开源。TensorFlow对于快速执行基于图形的计算非常有用。灵活的TensorFlow API可以通过其GPU支持的架构在多个设备之间部署模型。TensorFlow拥有产品级的高质量代码,有Google强大的开发、维护能力的加持,整体架构设计也非常优秀。相比于同样基于Python的老牌对手Theano,TensorFlow更成熟、更完善,同时Theano的很多主要开发者都去了Google开发TensorFlow(例如书籍Deep Learning的作者Ian Goodfellow,他后来去了OpenAI)。Google作为巨头公司有比高校或者个人开发者多得多的资源投入到TensorFlow的研发,可以预见,TensorFlow未来的发展将会是飞速的,可能会把大学或者个人维护的深度学习框架远远甩在身后。

在ModelArts中采用TensorFlow框架实现手写体识别的几个核心步骤:

  1. 数据集已通过市场导入,无须再重复导入
  2. 创建TensorFlow训练作业需要注意的地方,算法来源选择TF1.8-python2.7,代码目录和启动文件一定要事先在桶中创建好,同样训练输出路径也需要在桶中提前创建好,用于存放训练好的模型。
    image8
    image15
  3. 查看训练作业结果,同样采用4个GPU,P100的高性能计算实例,用时1分24秒,通过日志可以看到,最后训练的精度达到了91%左右,可以通过调整代码算法继续训练提升精度 。
    image10

具体详细的操作点击:
官方Git操作指南:
https://github.com/yepingjoy/ModelArts-Lab/tree/master/offical_examples/Using_TensorFlow_to_Create_a_MNIST_Dataset_Recognition_Application
官方帮助文档:
https://support.huaweicloud.com/bestpractice-modelarts/modelarts_10_0010.html

三、 Caffe

框架介绍:
Caffe 全称为 Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在 TensorFlow 出现之前一直是深度学习领域 GitHub star 最多的项目),目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。Caffe 的创始人是加州大学伯克利的 Ph.D.贾扬清,他同时也是TensorFlow的作者之一,曾工作于 MSRA、NEC 和 Google Brain,目前就职于 Facebook FAIR 实验室。Caffe 的主要优势包括如下几点。

  • 容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络。
  • 训练速度快,能够训练 state-of-the-art 的模型与大规模的数据。
  • 组件模块化,可以方便地拓展到新的模型和学习任务上。

在ModelArts中采用Caffe框架实现手写体识别的几个核心步骤:

  1. 数据集已通过市场导入,无须再重复导入

  2. 创建Caffe训练作业需要注意的地方,算法来源选择Caffe1-python2.7,代码目录和启动文件一定要事先在桶中创建好,目录本次需要上传到codes的文件有三个,“train.py”:训练脚本,“lenet_solver.prototxt”:配置训练时参数的prototxt文件和lenet_train_test.prototxt”:定义网络结构的prototxt文件,且必须使用命名为“codes”文件目录。
    image11
    image12

  3. 查看训练作业结果
    image13

具体详细的操作点击:
官方Git操作指南:
https://github.com/huaweicloud/ModelArts-Lab/blob/master/official_examples/Using_Caffe_to_Create_a_MNIST_Dataset_Recognition_Application/
官方帮助文档:
https://support.huaweicloud.com/bestpractice-modelarts/modelarts_10_0011.html
四、 Moxing

框架介绍:
MoXing是华为云ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上。 相对于TensorFlow和MXNet原生API而言,MoXing API让模型代码的编写更加简单,允许用户只需要关心数据输入(input_fn)和模型构建(model_fn)的代码,即可实现任意模型在多GPU和分布式下的高性能运行,降低了TensorFlow和MXNet的使用门槛。另外,MoXing-TensorFlow还将支持自动超参选择和自动模型结构搜索,用户无需关心超参和模型结构,做到模型全自动学习。

在ModelArts中采用MoXing框架实现手写体识别的几个核心步骤:

  1. 数据集已通过市场导入,无须再重复导入
  2. 创建MoXing训练作业,代码目录和启动文件一定要事先在桶中创建好,引擎可以选择TensorFlow,MoXing框架是构建于之上的,支持调用内部各种算法。
    image14
    image15
  3. 查看训练作业结果,同样采用4个GPU,P100的高性能计算实例,用时1分14秒,比之前的原生TensorFlow引擎要快一点,通过日志可以看到,最后训练的精度达到了88%左右,可以通过调整代码算法继续训练提升精度 。
    image16

MoXing详细介绍地址:
https://github.com/huaweicloud/ModelArts-Lab/blob/master/docs/moxing_api_doc/MoXing_API_Introduction.md
官方Git操作指南:
https://github.com/huaweicloud/ModelArts-Lab/tree/master/official_examples/Using_MoXing_to_Create_a_MNIST_Dataset_Recognition_Application
官方帮助文档:
https://support.huaweicloud.com/bestpractice-modelarts/modelarts_10_0007.html

以上四个采用不同框架的手写体训练案例全部训练完成:

image17

还有一些其它的深度学习框架,像Pytorch\ Keras\CNTK等大家有兴趣也可以关注一下。

模型优化
上面的例子中,我们看看能否优化一下训练代码,提升模型的准确度,在这里我们以TensorFlow的训练模型为例,我在原有的训练代码上做了一些简单的调整,并加了注释,方便大家更深入理解这个例子:
image
调整过的训练代码我已经上传到Github,点击查看
模型调优的过程如下:

  1. 将原有的代价函数改为交叉熵代价函数,学习率learning_rate=0.5
    image
    最后训练的准确率为90.4%左右
    image
  2. 通过增加训练次数,将训练次数'max_steps', 1000,增加到1500
    image
    最后训练的准确率为91%左右,有一点点提升
    image
  3. 将梯度下降优化器GradientDescentOptimizer改为AdamOptimizer
    image
    通过日志发现,准确率上升到50%左右之后,结果不升反而开始下降了,有可能是原有的学习率0.5过高,错过了梯度最低点,最后准确率只有43%
    image
    Note::#初始化全局变量sess.run(tf.global_variables_initializer()) 这段代码要从前面移到AdamOptimizer之后;日志如果无法看到最后的训练结果,直接下载到本地记事本中查看。
    这里要说明一下的是,不管用哪一种优化器算法 ,我们的优化器目的是为了找到模型的最佳参数w,b,不断的缩小预测值与实际标签值的误差,怎么样让loss值最小,看下面这张图:
    image
    打个比方:小明现在要从一个山顶去往山下,小明需要找到最低点,但是现在他迷路了,他的每一次行动目的都是找到下山最近的路,而每一次寻找都是一个不断试错的过程,为了让这个试错的成本最小化,他需要一个指南针(可以理解为优化器Optimizer),这个指南针会指引小明到达最低点,他不停的沿着指明的方向前进,大步向前走,或者小步向前走,按照一定的步频往山下走,这个过程可以理解为学习率(learning_rate),每次往前面走一点,小明离最低的位置就越近,直到找到最低点就成功了(如果迈出去的步子大了,有可能错过最低点)
  4. 调整AdamOptimizer的学习率
    我们先看一下Adam优化器算法的参数说明
    image
    其中learning_rate的初始值为0.001,我们按照这个学习率再训练一次:
    image
    训练的准确率又回到了90%左右
    image
    再把学习率调高一个量级试下,learning_rate = 0.01
    image
    训练的准确率为92%左右,比上一次有提升
    image
  5. 经验小结
    我们通过尝试调整不同的代价函数算法、训练次数和学习率,最终将模型的精度提升了1%~2%左右,小结如下:
  • 可以尝试不同的Optimizer算法来改善模型的精度或者训练时间。
  • 通过增加训练迭代次数max_steps,大部分情况下是可以提升模型精度的。
  • 学习率learning_rate并不是越大或者越小,模型的精度就越高,要根据具体的模型算法和相关参数来决定,在不熟悉算子的提前下,可以先按照官方的默认值训练一次,然后在根据实际情况进行调整。
  • 如果反复调整参数都无法大幅度提升模型的精度,就要尝试改造模型网络结构了,比如加一些卷积层,全连接层,隐藏层或dropout层来提升结果准确率。本例子可以将模型精度提升到96%以上,具体就不详细描述(在猫狗案例中,已有Vgg16和ResNet神经网络的具体实现)

导入模型

  1. 上传模型配置和推理服务文件config.json、customize_service.py,一定要上传到之前训练作业的输出目录位置,如果训练了多次,会产生多个版本号,选择上传要导出的模型版本目录。
    image18

  2. 在导入模型中选择刚才上传过配置文件的训练作业,如果推理代码配置选项已经自动生成了地址,证明推理文件已生效。
    image19

部署在线服务

  1. 在模型管理中可以看到刚才创建好的模型,在列表操作栏中选择部署“在线服务”
    image20
  2. 部署服务完成之后,上传一张测试图片,成功预测手写体数字7。
    image22

使用华为云ModelArts做手写体识别模型总结:

  1. 数据管理快:
    数据集可以通过市场公开的数据直接导入,数据准备效率大大提升
  2. 模型训练快:
    华为云ModelArts将常用的深度学习框架,从分布式加速层抽象出来,形成一套通用框架——MoXing。不仅满足了不同方向的AI开发者,同时也能通过华为自研的硬件、软件和算法协同优化来实现训练加速。
  3. 模型部署快:
    ModelArts 可以一键部署模型,推送模型到所有云、端、边的设备上,云上的部署还支持在线和批量推理,满足大并发和分布式等多种场景需求

【讨论】使用自制数字图像测试模型精度

在本次试验中,一共收集了19个人的手写数字笔迹,共190副图片。
为批量对这些图片进行处理,对图片处理的make_your_mnist.py代码进行了一定修改,具体修改如下:
# -- coding: utf-8 --

"""
Make mnist data set.
Ensure that the PIL module is installed before using the code below.
"""
from PIL import Image
cache = '../data/mnist_data/image/'
# 从image文件夹中依次读取数字图片并进行转换
# 本次一共收集到了19个人的0-9的数字笔迹,所以转换图片共10*19=190张
for i in range(0,9):
for j in range(1,19):
# 源图像
sr = (cache+'source/%d-%d.jpg' % (i,j))
# 目标图像
tg = (cache+'target/%d-%d.jpg' % (i,j))
I = Image.open(sr)
# 转换大小 为 28 * 28
I = I.resize((28, 28))
# 图像黑白化
L = I.convert('L')
# 保存转换后的图像
L.save(tg)

最后,得到190张处理后的,黑白化的28*28大小的数字图像

提交作业

华为ID:wjsandy

第一步,创建OSB桶后,用到OBSBrowser工具--添加相应的AK-SK密钥后-上传说图片数据--------动物-植物-(美女-大老婆-小老婆)也行!

第二步,我这上传的是动物类,狮子,马,熊,兔子,老虎

第三步,机器学习,一个个标注分类,图片分类也多,提供样例越多,越训练学习分辨成功率越高!

第四步-部署上线后就可以上传让机器学习识别了,以下是我上传后机器识别的效果

第五,大家可以再用python获取下Notebook案例!祝君好运!

同学们,来学习吧,有积分好礼送哦!点我送你一程

积分获得礼品
完成5个积分获得level1礼包

完成10个积分获得level2礼包

完成15个积分获得level3礼包

完成20个积分获得level4礼包

完成25个积分获得level5礼包(必须要有一个与实际应用结合的高价值案例)

完成30个积分获得level6礼包(必须要有一个与实际应用结合的高价值案例)

礼包
Level1礼包 : ModelArts纪念T恤 + 自拍杆或蓝牙小音箱 + 2张华为云ModelArts满减代金券

Level2礼包 : 华为荣耀手环(价值500左右) + 4张满减代金券

Level3礼包 : 机械键盘或华为手表(价值1000左右) + 6张满减代金券

Level4礼包 : 华为手表(价值2000左右) + 8张满减代金券

Level5礼包 : 华为手机(价值3000左右) + 10张满减代金券

Level6礼包 : 华为旗舰手机或华为matebook电脑(价值5000以上) + 15张满减代金券

手写数字识别模型训练问题总结

经过一个多小时的尝试,终于成功训练并测试了手写数字识别模型,现在总结一下自己在尝试过程中遇到的一些问题:

  1. 关于train_mnist.py的下载,正如其他人测试过的,这个文件通过右键另存为,下载回来的内容是html网页。我本人倾向于在pycharm中新建一个python文件,然后把train_mnist.py的代码直接复制到这个文件中,再把这个python文件上传。这样做的好处在于pycharm会自动检测python代码中存在的静态错误,特别是在python中是使用相同数目的行首缩进空格来划分代码块的,程序中行首缩进空格的错误很容易就被忽略了(我在复制代码时就出现了最后一行代码的行首缩进空格全没了的情况,还是通过pycharm发现的)。
  2. 在部署模型时,需要先将推理代码customize_service.py和配置文件config.json 上传,切记切记是上传到/mnist-example/log/model/目录下,我一开始就是想当然了,python格式的文件都上传到了/mnist-example/codes/目录下了,导致模型的部署没问题,发布运行也没问题,但在预测时,预测界面没有出来图像上传的组件,通过查找原因,发现是部署时程序没能找到config.json文件,而自动生成了一个默认的配置文件的缘故。重新上传推理代码customize_service.py和配置文件config.json 后,问题得到了解决。

OpenCV显示图像问题

使用帮助文档中的mox库进行文件读取时,要显示OpenCV读取的图像时只能使用matplotlib中imshow()进行显示,为什么不能使用OpenCV自带函数imshow()显示。

【华为云ModelArts-Lab AI实战营】第一期:图像分类 (I)

【华为云 ModelArts-Lab AI实战营】第一期

  • 本期实战,会涉及少量存储费用,请保证账户余额至少1元参与本期活动,请见费用 FAQ 说明

本期实战营参与说明

本期我们将会学习图像分类的自动学习案例(自动学习可以零代码构建一个图像分类案例)和 Notebook 案例(Notebook 案例是为让大家体验交互式开发和代码调试)。

  1. 【本期实战内容】两个案例:
  2. 【加入实战微信群】
    • 欢迎您自由加入本期实战营的微信群,与 ModelArts 社区开发者一起交流
    • 请添加 “华为云 EI 微信小助手” 后,拉您入群(微信号:hwyeiqyzn)
  3. 【留下实战记录】
    • 请您在本则 Issue 下方跟帖反馈:华为云账号 + 完成实战的截图
    • 反馈信息格式,请参考下一则 Issue 回帖 @chenliang613 的样例
  4. 【手动停止服务】
    • 实验完成后,请手动停止占用云资源的服务,如:停止 “开发环境” 中所创建的 Notebook 以及 “部署上线”-“在线服务” 中所部署的在线服务,以避免因持续占用云资源导致资源包无谓消耗和欠费发生。需使用时,再启动即可。
  5. 【获得实践积分】

为避免持续扣费,请及时停止云资源占用。完成本期实战后,请记得停止自动学习案例部署的在线服务,请记得停止创建的 Notebook 案例。

点击此,跟帖反馈本期实战截图

Notebook内存溢出问题

在进行Notebook训练的过程发生程序奔溃重启后,你再操作训练的时候会遇到以下问题提示:
799c4d5a8e043c90edffb4b9813761c
这个问题的产生是因为在linux系统崩溃的时候会产生一个core文件。它是一个内存映象,文件会比较大,这就导致了我们再执行时候内存溢出问题。
解决过程思路如下:
流程图
步骤1:打开Notebook中的Terminal
Terminal
输入查询命令:nvidia-smi 如图可看到红色框内的GPU内存占用情况
QQ截图20190615130152
但是GPU默认就是不管多大先给分配起来。还得再执行top 命令来查询当前各项进程,涉及到python的全部kill了 如图操作:
微信图片_20190615130740
这时候再nvidia-smi查看下:
微信图片_20190615130934
内存都已经释放了。
步骤2:查询出core文件并删除。如果该文件不删除的化,只是释放显存,你再执行还是会提示显存溢出错误的。
打开work文件,华为云上的Notebook上的文件就是在work里面,输入查询命令 ls -lah 如图所示可查询到如下情况
12
可以看到该文件目前已达32G。rm掉就可以了。

以上操作是我们平时训练结束后没有去释放显存空间导致系统奔溃产生了core文件,再导致我们持续的显存不够,进行显存空间释放的操作。所以我们每次训练完毕后不能直接退出训练再执行如下操作:
QQ截图20190615132032
QQ截图20190615132050
或者去外面shutdown来释放显存。
最后感谢华为的巨震老师,以上步骤皆是他手把手远程指导完成了。嘿嘿
以后出现这样的错误就不用和我开始那样不停的删除布置好的Notebook训练模型来解决了!!!

网络爬虫+图像识别 爬图片库并分类储存

首先是爬虫的入门小程序

keyword = '美女'

url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=detail&fr=&hs=0&xthttps=111111&sf=1&fmq=1561724851319_R&pv=&ic=0&nc=1&z=&se=&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&oq=%E5%8D%8E%E4%B8%BA%E6%89%8B%E6%9C%BA%E9%AB%98%E6%B8%85%E5%A3%81%E7%BA%B8&rsp=-1&word='+keyword

result = requests.get(url).text


pic_url = re.findall('"objURL":"(.*?)",', result, re.S)

print(pic_url)

path = './webCrawlerImages/' + keyword
isExists=os.path.exists(path)
if not isExists:
    os.makedirs('./webCrawlerImages/'+keyword) 

i = 1
for each in pic_url:
    print(each)
    try:
        pic = requests.get(each, timeout = 100)
    except requests.exceptions.ConnectionError:
        print('【错误】 当前图片无法下载')
        continue
    if(pic.status_code != 200):
        continue
    dir = './webCrawlerImages/' + keyword +'/' + keyword + '_' + str(i) + '.jpg'
    fp = open(dir, 'wb')
    fp.write(pic.content)
    fp.close()
    i += 1
    

将上面的程序自动化后尝试去爬一整个图片数据库

接下来用华为ei智能服务图像识别中的图像标签将爬到的图片分门别类的存放,代码如下

totalnum = 0
for root,dirs,files in os.walk('F:\手机相册'):
    for file in files:
        if(not (file.endswith('.jpg') or file.endswith('.jpeg') or file.endswith('.png') or file.endswith('.bmp'))):
            continue
        imagepath = os.path.join(root,file)
        #将图片文件转为base64格式
        image = utils.encode_to_base64(imagepath)
        #调用华为图片标签接口获取图片标签
        tags = image_tagging.image_tagging_aksk(ak, sk, image, '/v1.0/image/tagging', 'zh', 3, 60)
        #print(imagepath)
        #print(tags.replace("\n", "").replace(" ", ""))
        #将tag转为python对象
        tags = json.loads(tags)
        if('error_code' in tags.keys()):
            print('api wrong!   code = ', tags['error_code'], '  ,  msg = ', tags['error_msg'])
            continue
        #选择识别率最高的标签
        if tags is not None:
            if(len(tags['result']['tags'])):
                maintag = tags['result']['tags'][0]['tag']
            else:
                maintag = '无法分类'
            #将图片移入识别率最高的标签的文件夹内
            path = 'F:\\手机相册智慧分类\\'+maintag
            isExists=os.path.exists(path)
            if not isExists:
                os.makedirs(path)
            shutil.copyfile(imagepath,path + '\\' + file) 
            totalnum += 1
            print(totalnum, ' : ', maintag)

在此基础上还可以尝试将爬取的图片直接分类存放,省去中间过渡仓库的io消耗

20190630
A-M-Benchmarking已将故宫图片数据爬出超过15G

使用A-M-Benchmarking爬出的数据尝试分类过程中发现问题:
华为云现在提供的图片标记服务,并不能很好的对这个图片数据集进行分类
考虑使用tf框架对现有数据进行聚类后标注数据,训练一个专用的模型

今天使用的分类代码:先从obs下载图片到内存,将内存的图片通过华为云的图片标记服务进行分类后移入相应的标签文件夹

print('List all objects in folder tw_Image_DownLoads/ \n')
resp = obsClient.listObjects(bucketName, 'laoyunshiBT/tw_Image_DownLoads/')
#print(resp)
totalnum = 0
for content in resp.body.contents:
    if(content.key.endswith('.jpeg') or content.key.endswith('.jpg') or content.key.endswith('.png') or content.key.endswith('.bmp')):
        filename = content.key
        # 对图片依次进行缩放、旋转
        getObjectRequest = GetObjectRequest(imageProcess='image/resize,m_lfit,h_540,w_540')

        #作为流下载到内存stream
        resp = obsClient.getObject(bucketName, filename, loadStreamInMemory = False, getObjectRequest = getObjectRequest)
        #buffer = stream.body.buffer
        if resp.status < 300:
            print('requestId:', resp.requestId)
            # 读取对象内容
            while True:
                #chunk = resp.body.response.read(65536)
                chunk = resp.body.response.read()
                if not chunk:
                    break

                BytesIOObj = BytesIO()
                BytesIOObj.write(chunk)
                global base64_str
                base64_str = base64.b64encode(BytesIOObj.getvalue())
                ImageFile.LOAD_TRUNCATED_IMAGES = True
                global img
                img = Image.open(BytesIOObj)
                imshow(img)
                #print(chunk)
            resp.body.response.close()
        else:
            print('errorCode:', resp.errorCode)
            print('errorMessage:', resp.errorMessage)

        tags = image_tagging.image_tagging_aksk(ak, sk, base64_str, '/v1.0/image/tagging', 'zh', 3, 60)
        #将tag转为python对象
        tags = json.loads(tags)
        if('error_code' in tags.keys()):
            print('api wrong!   code = ', tags['error_code'], '  ,  msg = ', tags['error_msg'])
            continue
            #选择识别率最高的标签
        if(len(tags['result']['tags'])):
            maintag = tags['result']['tags'][0]['tag']
        else:
            maintag = '无法分类'
        #将图片移入识别率最高的标签的文件夹内
        path = 'E:\**故宫图片集\分类存放\\'+maintag
        isExists=os.path.exists(path)
        if not isExists:
            os.makedirs(path)
        img.save(path + '\\' + os.path.basename(filename))
        #shutil.copyfile(imagepath,path + '\\' + file) 
        totalnum += 1
        print(totalnum, ' : ', maintag)

20190701:
开始分发任务到副本群27个人,分发任务代码如下

在尝试运行分发任务时发现两个注意点:

1.以流的形式获取数据后再上传,请直接将获取的流的Response上传,不要在读出数据后再上传,读出数据后再上传会导致上传失败(上传的文件都是空文件)
2.在小毛授权给我读写的桶中上传的文件,访问权限由我控制,上传时请注意将访问权限设置为公共读或者公共读写,否则桶的主人会没有权限访问文件

20190702:
昨晚的程序是单线程,每分钟处理文件35个左右,太慢,全部任务分发完成要26小时
改进程序,引入线程池,最大并发线程8个,每分钟处理文件数峰值能到2400,半小时完成了任务分发
引入进度条,直观显示任务处理情况

targetObjectKey = '任务分发/'

#准备每个用户的文件列表
namelist = []
for i in range(27):
    namelist.append([str(i)])

def downloadandupload(sourceObjectKey, targetObjectKey, pbar):
    #作为流下载到内存stream
    #print('copy ', sourceObjectKey, ' to ', targetObjectKey)
    resp = obsClient.getObject(bucketName, sourceObjectKey, loadStreamInMemory = False)
    #buffer = stream.body.buffer
    if resp.status < 300:
        headers = PutObjectHeader()
        # 设置对象访问权限为公共读
        headers.acl = HeadPermission.PUBLIC_READ
        resp = obsClient.putContent(bucketName, targetObjectKey, content = resp.body.response, headers = headers)
        if resp.status < 300:    
            #进度条更新
            pbar.update(1)
        else:    
            print('errorCode:', resp.errorCode)
            print('errorMessage:', resp.errorMessage)

#创建线程池
pool = ThreadPoolExecutor(max_workers = 8)

#统计文件夹内图片总数并乘2(因为下面的操作每个文件分给两个人标注),根据总数新建进度条
print('List all objects in folder', sourceObjectKey)
is_truncated = True
next_marker = None
totalnum = 0
while(is_truncated):
    print(totalnum)
    resp = obsClient.listObjects(bucketName, sourceObjectKey, marker = next_marker)

    is_truncated = resp.body.is_truncated
    next_marker = resp.body.next_marker

    for content in resp.body.contents:
        filename = content.key
        if(filename.endswith('.jpeg') or filename.endswith('.jpg') or filename.endswith('.bmp') or filename.endswith('.png')):
            totalnum += 1
totalnum = totalnum * 2
print(totalnum)
pbar = tqdm_notebook(total=totalnum)

print('List all objects in folder', sourceObjectKey)
is_truncated = True
next_marker = None
totalnum = 0
while(is_truncated):
    resp = obsClient.listObjects(bucketName, sourceObjectKey, marker = next_marker)

    is_truncated = resp.body.is_truncated
    next_marker = resp.body.next_marker

    for content in resp.body.contents:
        filename = content.key
        if(filename.endswith('.jpeg') or filename.endswith('.jpg') or filename.endswith('.bmp') or filename.endswith('.png')):
            totalnum += 1
            
            #确定随机范围
            range_list = range(0,27)
            result_id = random.sample(range_list, 2)
            
            if(totalnum % 50 == 0):
                print(totalnum)
                print(filename, result_id)

            for eachid in result_id:
                namelist[eachid].append(filename)
                pool.submit(downloadandupload, filename, targetObjectKey + str(eachid) + '/' + os.path.basename(filename), pbar)
                #downloadandupload(filename, targetObjectKey + str(eachid) + '/' + os.path.basename(filename))
                
file = open("故宫图片任务分发情况.txt", "w+")
for eachfolder in namelist:
    file.writelines(str(eachfolder))
file.close()

resp = obsClient.putFile(bucketName, '故宫图片任务分发情况.txt', file_path='故宫图片任务分发情况.txt')

pool.shutdown(wait=True)
print('线程池所有线程执行完毕')
    
pbar.close()
        

【2019-05-15】手写数字图像识别应用实践

实践点1:按照下面步骤完成数据准备、模型训练、模型部署:
https://github.com/huaweicloud/ModelArts-Lab/tree/master/%E7%BB%BC%E5%90%88AI%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B/MNIST%20Dataset%20Recognition

实践点2:按照下面make_your_mnist.py代码,修改代码中的文件路径,在本地制作适配mnist的图片数据,来测试模型的精准度。(其中使用的原图需要黑底白字)
https://github.com/huaweicloud/ModelArts-Lab/blob/master/%E7%BB%BC%E5%90%88AI%E5%BC%80%E5%8F%91%E6%A1%88%E4%BE%8B/MNIST%20Dataset%20Recognition/mnist_pic/make_your_mnist.py

ai 身份识别的攻防测试

故事是这样的,在华为ModelArtsModelArts实验班交流群里水了大半个月,每天不是调戏华为助理就是*扰华为老师。没事就水一篇文章混积分。终于,有一天助理发了一份微认证活动。我打开一看,福利多多啊!于是就开始了(ModelArts实验班第一期),完成了两个训练得了两个么么哒,哎。不甘心就点开了认证考试,发现居然还是进行身份证照片及人脸识别的!故事的高潮也就来了。
开心的上传我帅气身份证:

微信图片_20190621120123_副本

然后就.......
微信图片_20190625222408
尴尬 尴尬 光头就不认咯
0090c7d3ca6d6b6159fc3c0b467f457
带上假的 也不让过
这不能等头发长出来再考啊!!!余光看到了桌面上的美图秀秀!!!嘿嘿!!!
微信图片_20190625181054_副本_副本
再试
微信图片_20190625223312_副本
哈哈哈哈哈哈!!!
最后考了72勉强过了,哎。就等助理发书补课补课!!!

【华为云 ModelArts-Lab AI实战营】第三期:图像分类 (III) 模型参数&网络调优

【华为云 ModelArts-Lab AI实战营】第三期:图像分类 (III) 模型参数&网络调优

本期实战营参与说明

本期实战为图像分类第三期。本期实战,本期我们将会以 “VGG16模型” 为例,讲解深度学习中模型调参和网络优化的技巧。

  1. 【本期实战内容】
  2. 【加入实战微信群】
    • 欢迎您自由加入本期实战营的微信群,与 ModelArts 社区开发者一起交流
    • 请添加 “华为云 EI 微信小助手” 后,拉您入群(微信号:huaweisecretary)
  3. 【留下实战记录】
    • 请您在本则 Issue 下方跟帖反馈:华为云账号 + 完成实战的截图
    • 反馈信息格式,请参考如下 @sunbo57123 的样例:
  4. 【本期积分规则】
    • 第三期任务00-03,完成后按照老规矩获得1个积分。调参没有固定规则,经验总结十分重要,除了实验中进行讲解的调优方法,希望各位AI大神能够将将自己的调优经验分享出来。网络不设限制,比如 ResNet、ResNet+FPN(ROI IoU 等)、MobileNet 调优等,内容随心您定,调优的方法、思路、实践过程等等,鼓励干货满满的原创案例分享。扩展案例的提交形式统一为 ModelArts Notebook 为载体,能够复现为核心,提交评分采用社区commiter 讨论的形式,内容相似度过高的文章,按照提交时间+能够有效复现的形式取第1篇哦

00任务中:

  • 反馈两次各训练 5个epoch(共10个epoch)后的运行结果+准确率变化折线图
  • 反馈带有早停的运行结果

01任务中:

  • 任意一个优化器的结果和准确率折线图(5 epoch)

02任务中:

数据增广案例训练时间较长,为了防止ipynb文件运行时丢失kernel的链接,导致无法查看结果,建议开发者实践时将ipynb文件转换为py文件,并在terminal中执行。步骤如下:

  1. ipynb文件转换成py文件
    ipynb-to-py

转换后得到一个同名的.py文件,由于ipynb中编写了很多jupyter环境中支持的特定命令,因此需要将一些特定命令进行处理,包括:

1. 以 ! 开头的shell命令,使用Python subprocess库代替
2. %matplotlib inline 声明,无法在python环境中运行,直接删除
3. matplotlib的plot命令,在Terminal中无法直接使用,需要设定matplotlib.use('Agg')

由于处理过程较为复杂,我们直接提供了转换好的02_data_augumentation.py

  1. 在Terminal中执行命令

首先,新建一个terminal:

open-terminal

在terminal中,先更新conda相关环境变量,执行命令source /opt/conda/etc/profile.d/conda.sh,然后执行conda env list命令,查看conda环境,并切换到/home/ma-user/anaconda3/envs/TensorFlow-1.13.1环境(根据Notebook规格,环境名称可能有所不同):

进入Python环境

执行py文件:nohup python 02_data_augumentation.py > data-aug.log &,然后再敲一个回车键。这样,我们用nohup启动了一个后台执行的进程,并将训练的结果输入到data-aug.log文件中,在Terminal中,可以使用tail命令查看日志文件的内容,执行tail -f data-aug.log

nohup-tail

后台进程运行结束后,我们得到data-aug.logdata-aug-plot.png两个文件

积分所需文件

  • data-aug.log文件
  • matplot保存的准确率曲线图data-aug-plot.png

03任务中:

  • 只训练分类层的日志和准确率曲线图:
  • 训练所有参数的日志和准确率曲线图:
  1. 【手动停止服务】

    • 实验完成后,请手动停止占用云资源的服务,如:停止 “开发环境” 中所创建的 Notebook 以及 “部署上线”-“在线服务” 中所部署的在线服务,以避免因持续占用云资源导致资源包无谓消耗和欠费发生。需使用时,再启动即可。
  2. 【获得实践积分】

点击此,跟帖反馈本期实战截图

华为云ModelArts-Lab AI

华为ID:wjsandy

第一步,创建OSB桶后,用到OBSBrowser工具--添加相应的AK-SK密钥后-上传说图片数据--------动物-植物-(美女-大老婆-小老婆)也行!

第二步,我这上传的是动物类,狮子,马,熊,兔子,老虎

第三步,机器学习,一个个标注分类,图片分类也多,提供样例越多,越训练学习分辨成功率越高!

第四步-部署上线后就可以上传让机器学习识别了,以下是我上传后机器识别的效果

第五,大家可以再用python获取下Notebook案例!祝君好运!

同学们,来学习吧,有积分好礼送哦!点我送你一程

积分获得礼品
完成5个积分获得level1礼包

完成10个积分获得level2礼包

完成15个积分获得level3礼包

完成20个积分获得level4礼包

完成25个积分获得level5礼包(必须要有一个与实际应用结合的高价值案例)

完成30个积分获得level6礼包(必须要有一个与实际应用结合的高价值案例)

礼包
Level1礼包 : ModelArts纪念T恤 + 自拍杆或蓝牙小音箱 + 2张华为云ModelArts满减代金券

Level2礼包 : 华为荣耀手环(价值500左右) + 4张满减代金券

Level3礼包 : 机械键盘或华为手表(价值1000左右) + 6张满减代金券

Level4礼包 : 华为手表(价值2000左右) + 8张满减代金券

Level5礼包 : 华为手机(价值3000左右) + 10张满减代金券

Level6礼包 : 华为旗舰手机或华为matebook电脑(价值5000以上) + 15张满减代金券

【讨论】实战三期,任务00的epoch设置累积与任务02的python36_tf环境问题

任务00中的 epoch设置我尝试设置了一次17次如图:
QQ截图20190704225110
发现在12~14之间,绘制训练 & 验证的准确率值出现了断崖式的下跌。设想12应该是最理想的训练次数,于是又运行程序继续执行12次 。却没有达到我的理想图片出现了类似这样:
image
后来得知epoch的训练是累积的。只有重开了一次训练再次尝试12,如图:
QQ截图20190705141025
效果就好多了。
同时还发现这个样的情况
image
查询相关资料后,明白是因为准确率没提高就不进行保存。
image

以上为任务00

任务02中terminal找不到文件source /opt/conda/profile.d/conda.sh
按照任务提示,有的时候会遗漏这句:
image
意思是 执行(source /opt/conda/profile.d/conda.sh)前先把jupyter改成python36_tf。
如何改呢,先cd work 进入work目录,先执行(source /opt/conda/profile.d/conda.sh)
提示出现如红色箭头的路径问题。
微信图片_20190705164101
中间加上etc
再执行conda activate python36_tf就行了
如图:看蓝色箭头
image
如图成功了。再到目录栏可以得到两个文件。
微信图片_20190705164048
同时在Terminal执行华为提供的xxx.py也是很快的,点击进去查看里面代码,可以发现

image
epochs=2 ,只训练了两次
同时再点击查看02数据增训练。

训练模型总运行失败的一个原因

下载train_mnist.py文件要当心,因为如果直接点击右键进行“另存为”时,下载下来的文件可能已经变为了一个网页文件(虽然train_mnist.py点击属性时显示仍然是pathon file),但在创建训练后,就会一直初始化,并且这时日志中会出现提示“SyntsxError”。
解决方法:我的方法可能有些笨,但可以解决问题,分享一下:用notepad++将train_mnist.py打开,并比对着github中打开的源文件,将你下载的train_mnist.py中增加的内容删除(注意一般是在头部和尾部都有多出来的内容),再另存一份新的train_mnist.py。使用这个新的train_mnist.py作为启动文件再进行训练,应该就可以了。

【华为云 ModelArts-Lab AI实战营】第二期:图像分类 (II)

【华为云 ModelArts-Lab AI实战营】第二期

  • 相信访问本页面的您,已经是上一期的《华为云 ModelArts-Lab AI实战营第一期:图像分类》的学员,并且完成 “自动学习案例” 和 “Notebook案例” 了,本期我们将会以 “图像分类-综合案例” 带您更深入和全面地学习 ModelArts 的图像分类能力。
  • 若您还没有参加过上一期活动,请您点击《华为云 ModelArts-Lab AI实战营第一期:图像分类》,从头学起,基础更扎实,还可以累积更多积分哦!
  • 本期实战,会涉及少量存储费用,请保证账户余额至少1元参与本期活动,请见费用 FAQ 说明

本期实战营参与说明

本期实战为图像分类第二期。在第一期我们学习了图像分类的自动学习案例(自动学习可以零代码构建一个图像分类案例)和 Notebook 案例(Notebook 案例是为让大家体验交互式开发和代码调试)。本期实战,我们使用数据智能标注、模型训练和模型部署端到端模拟真实 AI 开发场景,构建一个图像分类应用。

  1. 【本期实战内容】
  2. 【加入实战微信群】
    • 欢迎您自由加入本期实战营的微信群,与 ModelArts 社区开发者一起交流
    • 请添加 “华为云 EI 微信小助手” 后,拉您入群(微信号:huaweisecretary)
  3. 【留下实战记录】
    • 请您在本则 Issue 下方跟帖反馈:华为云账号 + 完成实战的截图
    • 反馈信息格式,请参考如下 @chaoxu1203 的样例:
      样例
  4. 【手动停止服务】
    • 实验完成后,请手动停止占用云资源的服务,如:停止 “开发环境” 中所创建的 Notebook 以及 “部署上线”-“在线服务” 中所部署的在线服务,以避免因持续占用云资源导致资源包无谓消耗和欠费发生。需使用时,再启动即可。
  5. 【获得实践积分】

点击此,跟帖反馈本期实战截图

猫狗识别模型调参至84%以上

使用第一期的notebook项目文件image_recongition进行调参,主要调整学习率alpha 和批大小batch_size

思路为每次只调整一个参数,在上一批调参的最大结果值附近尝试更优解

调参步骤如下

alpha batch epochs result
9.00E-05 17 30 76.928
8.00E-05 17 30 76.32
7.00E-05 17 30 82.352
6.00E-05 17 30 80.992
5.00E-05 17 30 75.312
       
7.00E-05 18 30 82.192
7.00E-05 10 30 81.648
7.00E-05 12 30 79.68
7.00E-05 14 30 81.568
7.00E-05 15 30 82.368
7.00E-05 16 30 81.808
       
7.10E-05 15 30 80.544
7.20E-05 15 30 81.136
7.30E-05 15 30 81.344
7.40E-05 15 30 79.504
7.50E-05 15 30 78.976
7.60E-05 15 30 75.632
7.70E-05 15 30 82.352
7.80E-05 15 30 78.144
7.90E-05 15 30 75.296
       
7.45E-05 15 30 80.192
7.46E-05 15 30 80.976
7.47E-05 15 30 80.048
7.48E-05 15 30 81.456
7.49E-05 15 30 81.92
7.50E-05 15 30 78.976
7.51E-05 15 30 80.688
7.52E-05 15 30 79.776
7.53E-05 15 30 79.568
       
7.49E-05 10 30 81.76
7.49E-05 11 30 82.224
7.49E-05 12 30 81.216
7.49E-05 13 30 82.224
7.49E-05 14 30 82.144
7.49E-05 15 30 82.928
7.49E-05 16 30 83.936
7.49E-05 17 30 84.272
7.49E-05 18 30 83.168
7.49E-05 19 30 82.656
7.49E-05 20 30 82.704

调参至84%以上的截图如下
image
image

通过Keras来增广猫狗数据集

在【华为云 ModelArts-Lab AI实战营】第二期中的想提高猫狗识别率可以考虑增加训练数据来提高准确率。我们可以通过Keras来增广猫狗数据集。
我们先把案例提供的25000张图片进行分类及分文件夹。因为,在华为云上的Notebook上增广图片的数量在500张比较好,一次增广量可达到4000,时间在3分钟左右。
首先,我们先按500一份分装到50个文件夹内,再压缩成zip格式文件上传到notbook上。如图:
QQ截图20190626213624
我们再进入
QQ截图20190626213925
输入解压命令: unzip catdogdata.zip
QQ截图20190626214233
到文件目录界面可以看到解压出文件
QQ截图20190626213649
进行数据增广

from keras.preprocessing.image import ImageDataGenerator
import os
import numpy as np
import tensorflow as tf

def creat_x_database(rootdir, resize_row, resize_col):
    list = os.listdir(rootdir)
    database = np.arange(len(list) * resize_row * resize_col * 3).reshape(len(list), resize_row, resize_col, 3)
    for i in range(0, len(list)):
        path = os.path.join(rootdir, list[i])  # 把目录和文件名合成一个路径
        if os.path.isfile(path):  ##判断路径是否为文件
            image_raw_data = tf.gfile.FastGFile(path, 'rb').read()
            with tf.Session() as sess:
                img_data = tf.image.decode_jpeg(image_raw_data)
                resized = tf.image.resize_images(img_data, [resize_row, resize_col], method=0)
                database[i] = resized.eval()
    return database

'''
用以生成一个batch的图像数据,支持实时数据提升。训练时该函数会无限生成数据,
直到达到规定的epoch次数为止。
'''
datagen = ImageDataGenerator(
    featurewise_center=True,  # 去中心化
    featurewise_std_normalization=True,  # 标准化
    rotation_range=10,  # 旋转范围, 随机旋转(0-180)度
    width_shift_range=0.2,  # 随机沿着水平或者垂直方向,以图像的长宽小部分百分比为变化范围进行平移;
    height_shift_range=0.2,
    shear_range=0.2,  # 水平或垂直投影变换
    zoom_range=0.2,  # 按比例随机缩放图像尺寸
    horizontal_flip=True,  # 水平翻转图像
    fill_mode='nearest')  # 填充像素, 出现在旋转或平移之后


x = creat_x_database('.xxx/xxx/训练文件路径', 256, 256)
datagen.fit(x)

i = 0
for batch in datagen.flow(
        x,
        batch_size=300,
        save_to_dir='./训练完毕的路径',
        save_prefix='1',
        save_format='jpg'):

    i += 1
    if i > 15:
        break

最后得到的效果:

微信图片_20190626214839

不过这里还有个数据标注还没完成,下期再补上,因为,我也没搞出来!!!难受!!!

高校上课关于ModelArts并发和系统配置问题

两个问题帮忙确认一下:
1、60人同时并发使用modelarts是没问题的吧?
2.学习过程中需要在ModelArts平台的“开发环境-notebook”中会编写机器学习、深度学习算法,数据集有1G大小,为了教学任务高效完成,请问在创建Notebook时建议使用何种配置能完成上述需求?这块有什么约束吗?多人共用数据集怎么搞最划算?

发布服务后的参数类型错误

一个简单的TensorFlow模型(代码为附件的dense.py),本地保存模型后,测试在本地加载模型(loadModelDense.py)可以正常运行。但是发布服务后,在访问服务时报错:AbortionError(code=StatusCode.INVALID_ARGUMENT, details="Expects arg[0] to be float but double is provided")(日志.png)
即使把测试数据写死(customize_service.py),打印显示类型也是float,但错误还是提示传了double。
注意:dense.py的代码拷入在线训练环境时,把 useMox = 0 改成 useMox = 1 。

环境说明:
训练用的Notebook环境是:TF-1.8.0-python2.7
安装了 pandas 0.22.0 (config.json)

参数类型错误.zip

【讨论】使用两层卷积神经网络训练手写数字识别模型

#7 中,我使用训练好的模型对自制的数字图像进行了识别,识别的成功率只有不到4成。
为了提高识别的精度,我尝试采用两层卷积神经网络来进行手写数字图像的识别。
首先,是在本机上训练模型并测试模型的精确度,代码如下(因为对github使用还不熟练,所以只好用压缩包形式上传了)
mnist_cnn.zip
其中,
mnist_train_cnn.py是在本机训练两层卷积神经网络模型的程序代码;
mnist_test_cnn.py是使用训练好的模型来识别自制手写数字图像的程序代码;
经过测试,使用两层卷积神经网络模型后,对自制手写数字图像的识别精度成功提升到了9成左右。

ModelArts实现零售商客户分群

*流程:环境搭建(OBS桶、Notbook开发环境-华为ModelArts里都有)-数据同步(市场同步OBS数据集,work目录)-数据导入(导入工具包、导入数据集)

-数据预处理(独热编码、删除相应id列)-K值的选择(导入算法,计算出误差平方各、轮廓系数、根据肘部法则选取适合K值)

-模型构建(循环多次避免局部最优解,得出相对更优模型)-模型使用(聚类分析、预测)-结果可视化(使用matplotlib对预测结果进行可视化显示-点状图)

4-1

1、环境搭建(OBS桶、Notbook开发环境-华为ModelArts里都有)

4-2

数据同步(市场同步OBS数据集,work目录)

4-3

2、数据导入(导入工具包、导入数据集)

4-4

3、数据预处理(独热编码、删除相应id列)

4-5

4、K值的选择(导入算法,计算出误差平方各、轮廓系数、根据肘部法则选取适合K值)

4-6
4-7

5、模型构建(循环多次避免局部最优解,得出相对更优模型)

4-8

6、模型使用(聚类分析、预测)

4-9

7、结果可视化(使用matplotlib对预测结果进行可视化显示-点状图)


4-10

关于mnist数据集和train_mnist.py的一些分析

mnist数据集:
手写体数字识别数据集,是NIST数据集的一个子集,包含了60000张图片作为训练数据,10000张图片作为测试数据。其中,每一张图片都代表了0-9中的一个数字,图片的大小都为28*28,且数字都会出现在图片的正中间。

train-images-idx3-ubyte.gz:训练数据图片文件
train-labels-idx1-ubyte.gz:训练数据标签文件(即每一张图片对应的具体数字)
t10k-images-idx3-ubyte.gz:测试数据图片
t10k-labels-idx1-ubyte.gz:测试数据标签文件(即每一张图片对应的具体数字)

支持keras等其他AI框架部署服务

我有一些AI模型是基于keras的,暂时无法在ModelArts上部署。最好可以支持free style的模型包,由用户自行编写customize_service.py的所有逻辑,提高灵活性

[讨论]从实战三期的实验结果谈过拟合和欠拟合

【华为云 ModelArts-Lab AI实战营】第三期:图像分类 (III) 模型参数&网络调优

实验做完后,对过拟合和欠拟合以及现有AI框架的参数调整有了一些新的认识,写出来请各位同学指正

首先举个栗子,解释过拟合和欠拟合

假设我们在二维实数空间有一个点集P(x, y)如下图所示:
华为测试2019070520

我们取靠近y轴的14个点作为训练集:
华为测试2019070521
注意前14个点中有3个明显的噪点是我故意加入的

那么现在我们训练一个模型来拟合训练集,在这个例子中就是找到一个函数h(x)可以尽量匹配已有的点集
下面是三种模型的可视化:
华为测试2019070525
黄色线代表的模型甚至没有和训练集拟合好,这属于欠拟合
蓝色的线和训练集拟合不错,而且在测试集上表现也不错,这是个不错的模型
绿色的线和训练集拟合的太好了,把噪点的特点也提取出来了,这属于过拟合

再来看看不错的模型和过拟合的模型在整个点集上的表现:
华为测试2019070523
可以明显看出过拟合的模型一旦超出训练集(前14个点)的范围,预测的结果和期望值(点集P)相差过大,属于不能用的模型

公布一下蓝色的线代表的函数 y = 2.8 + 2.2 * x
绿色的线代表的函数 y = 2.8 + x * 2.3 + (x ** 2) * 1.1 + (x ** 3) * -0.35 + (x ** 4) * 0.0235 + (x ** 5) * -0.000001

根据leewishyuanfang的回帖做个修改:

以上的的例子属于线性回归的例子,多举一个针对分类问题(逻辑回归)的例子

首先,准备一下数据:
华为测试2019070526

有两个点集P1(蓝色)和P2(绿色),现在要想办法学习一个模型判断一个点是否属于蓝色点

将x=5这条直线左边的部分作为训练集
华为测试2019070527

那么,欠拟合的情况是这样的:
华为测试2019070528
橙色圈代表一个训练出的模型,这个模型认为橙色圈内的部分属于蓝色点

而一个不错的模型是这样的:
华为测试2019070528-1

过拟合的逻辑回归模型是这样的:
华为测试2019070528-2
当然,实际情况很少过拟合的这么夸张

在3期实训过程中,可以明显发现过拟合的情况
image

image

image

image

过拟合在实际模型训练中表现为:模型在训练集上的准确率(acc)不断上升的过程中,模型在验证集上的准确率(val_acc)缺下降了

发生的原因可总结为模型训练的过程中,在训练集中提取了并非是共性的特征并分配了过高的权重

但使用随机梯度下降的31epoch过程中,出现的情况和我的设想不同

我设想的acc和val_acc之间的关系应该是下图:
image
随着在训练集中提取的个性越来越多(学习偏见越来越大),acc越来越高,经过一个短线的震荡,val_acc应该出现断崖式的下跌

但实际情况是:
华为测试2019070513
这个算法在acc越来越高的情况下,val_acc也出现了震荡,但震荡保持的轮次很长,甚至直到完成31轮epoch都没有出现断崖式的下跌

我现在的理解是,这个算法在acc提升的过程中,主动调低了导致val_acc明显下降的特征权重,但对于具体发生了什么,希望各位同学老师拍砖提点一下。

项目OBS存在非法文件,无法导入数据

创建项目后,需要导入数据(已经传入OBS中了),然后总是说我存在非法文件

WeChat Image_20190531170431

train:
NORMARL:
PNEUMONIA:
上面是路径设置,是个简单的二分类问题,文件名就是标签名

tf返回结果被加引号

用TensorFlow模型发布成批量服务,return前的字符串:
{"result": [[1.6093103885650635]]}
输出到日志后变成了:
"{\"result\": [[1.6093103885650635]]}"
批量服务给加了引号,会导致后续程序读取json数据失败。期望结果是return前的字符串不发生变化。
注意:该result在Sklearn模型上,return的字符串不会发生改变。

customize_service.py的代码:

code

def _postprocess(self, result_data):
    print("begin to post process")
    print("result_data = " + str(result_data))
    output = result_data["output"]
    print("output = " + str(output))
    schema = json.loads('{"result":[1,2,3]}')
    schema["result"] = output
    result = json.dumps(schema)
    print("result = " + str(result))
    print("end to post process")
    return result

打印的日志:
begin to post process
result_data = {u'output': [[1.6093103885650635]]}
output = [[1.6093103885650635]]
result = {"result": [[1.6093103885650635]]}
end to post process

config.json里测试过3种配置,结果都是 "{\"result\": [[1.6093103885650635]]}"。
配置1)
"response": {
"Content-type": "applicaton/json",
"data": {"type": "object", "properties": {"resp_data": {"type": "array", "items": [{"type": "number"}]}}}
}
配置2)
"response": {
"Content-type": "text/plain",
"data": {"type": "string"}
}
配置3)
"response": {
"Content-type": "string",
"data": {"type": "string"}
}

[ModelArts-Lab AI实战营] 副本任务:古画内容识别

感谢 (排名不分先后)
@MarxGo & leewishyuanfang 为本次提供的爬虫程序
@benmcq2019 为本次副本任务提供OBS存储
@bochuan007 统筹本次副本任务的标注工作

@感谢所有参加本次副本任务付出时间、精力进行标注、搬运、协调、技术支持的所有人

本期副本测试数据说明

数据OBS桶位置:gg-image.obs.cn-north-1.myhuaweicloud.com
obs未标注数据地址: obs://gg-image/tbgg/tw_Image_v1/
obs已标注数据地址: obs://gg-image/tbgg/GroundTruth/
标注数据分类:具体标注方法请参考 这个链接
ObjectDetector (对象识别标注): obs://gg-image/tbgg/GroundTruth/ObjectDetector/
PaintingStyle(绘画风格标注): obs://gg-image/tbgg/GroundTruth/PaintingStyle/

ObjectDetector (对象识别标注),PaintingStyle(绘画风格标注)具体线上标注工具使用请参考xxx链接
ObjectDetector (对象识别标注) 目标识别古画中的人、鸟、花三中object
PaintingStyle(绘画风格标注)目标识别古画的绘画风格:至少可以区分是否为工笔 或者 是否为白描。可扩展为区分:工笔、皴法、白描、没骨、指头画等多种风格划分

ObjectDetector (对象识别标注) 完成,准确率在80%以上积1分
PaintingStyle(绘画风格标注)完成,可以区分是否为工笔 或者 是否为白描准确率在80%以上积1分,能够提供扩展判断:工笔、皴法、白描、没骨、指头画 三种以上的确率在80%以上追加1分。画风、技法等可扩展分类识别均可不仅限于绘画技法。(PaintingStyle如需爬虫配合抓取原有tag 请联系@MarxGo)

本次副本除实现具体模型积分外,还提供以下获得更多积分渠道:
可以通过提供模型调优心得文章+notebook(可复现为有效标准,取可复现前三)[追加2积分]
其他相关扩展案例、实际应用案例(可复现为有效标准,取可复现前三)[追加2积分]
如有特别优秀作品,将在社区公示,提供更多额外积分。
严禁各种抄袭,模仿输出模型调优心得文章+notebook以及其他相关扩展案例、实际应用案例。雷同度过高的提交一律只计算最早提交可付现版本的积分

原则上参加本次副本的同学们都要分担标注任务,如果有特殊原因请单独说明,理由充分的可以特殊考虑。如果没有完成相关标注工作,将不能参加本次活动的积分。

本次副本命题较为开放,请不要咬文嚼字,一切以实力说话。有表达不清晰的部分请跟帖提出。
本次副本活动允许2人一组交付,积分两个人同时获得。如果有组队的同学请提前跟帖报名,确认组队情况
本次副本活动,可能随时调整积分发放方式,不能接受者,请勿参加。

华为ModelArts-lab 手写数字识别实验

我有幸参加了 华为ModelArts-lab 手写数字识别实验
具体步骤
1, 产生 AKSK
image

2, 创建项目

image

3,上传 训练图片

image

4, 对 图片进行人工标注

image

4,当每1类 达到5张以上,至少有2个类别以上,就可以进行训练
训练完成以后,就可以进行 进行部署
部署完成启动,就可以进行预测

缺陷,由于用于训练的的图片的数目较少,正确率不是不高
下面是我用来预测的
image
image
image

image

其实 访问 服务 使用postman,也可以使用curl
具体调用可参见

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0063.html

手写体数字识别数据集MNIST原始数据的处理问题

http://yann.lecun.com/exdb/mnist/上可下载公开的手写体数字数据集
该数据集包括有60,000个样本的训练集和10,000个样本的测试集
但解压后的文件格式为idx-utype,主流的图片浏览器不能处理
我希望找出一个方法,将idx-utype文件里的数据分割并转为主流图片格式,如jpg、png、bmp等

QQ截图20190617104753

参考了一些网上已有代码:
https://www.cnblogs.com/zhouyang209117/p/6436751.html
https://blog.csdn.net/qq_20936739/article/details/82011320

idx-utype 文件,实际上用前4个数据(魔数,样本个数,样本行宽,样本列宽)表示了整个文件的图片信息,之后的无符号byte数组就是idx-utype的实际数据

以分割MNIST训练集图片包为例,这里有一个我改写的分割idx-utype文件数据并输出为多个jpg的代码示例,因为是改写的代码,注释掉了很多原代码中我不需要的语句,如果你觉得这些注释影响了你的阅读,请直接删除。(运行环境为anaconda的jupyterLab)

import numpy as np     
import struct    
import matplotlib.pyplot as plt     
from PIL import Image,ImageFont,ImageDraw
import scipy.misc
import imageio

filename = 'train-images.idx3-ubyte'
binfile = open(filename,'rb')#以二进制方式打开 
buf  = binfile.read()

index = 0
magic, numImages, numRows, numColums = struct.unpack_from('>iiii',buf,index)#读取4个32 int    
print(magic,' ',numImages,' ',numRows,' ',numColums)

outputImgDir='train_image_output/'

offset = 0
fmt_header = '>iiii'
offset += struct.calcsize(fmt_header)
image_size = numRows * numRows
fmt_image = '>' + str(image_size) + 'B'
for i in range(numImages):
    im = struct.unpack_from(fmt_image,buf,offset)
    offset += struct.calcsize(fmt_image)
    index += struct.calcsize(fmt_image)
    im = np.array(im)
    im = im.reshape(28,28)
    imgdir=outputImgDir+str(i)+'.jpg'

    imageio.imwrite(imgdir, im)

binfile.close() 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.