关于深度学习:Copy攻城狮辛酸史含泪一分钟跑通MindSpore的LeNet模型

90次阅读

共计 3841 个字符,预计需要花费 10 分钟才能阅读完成。

摘要:一个 Cope 攻城狮用切身实例通知你:Cope 代码体验一时爽,BUG 批改花半天。

前言:此文为 r0.7-beta 的操作实际,为什么我的眼里常含泪水,因为我对踩坑这件事爱得深厚。谨以此文献给和我一样踩坑的小伙伴,留念踩坑时刻。

↑开局一张图,故事全靠编。

有时候经常问本人:我一个前端开发,没有 python 根底,竟然敢尝试应用深度学习框架?谁给的勇气,是梁静茹吗?有时候也经常暗示本人“技多不压身”,活得像周树人笔下的阿 Q 一样洒脱,不过事实就像 – 我是钻井工,钻了一个又一个的井,因为没有保持,一次又一次地和宝藏擦肩而过最终空手而归;有时候也经常告慰本人:“Just DO IT”,IT 这么吃香,不干 IT 还无能啥?不就是换个地儿搬砖吗?定个小指标,先跑通 MindSpore 的 LeNet 模型!

装置

优良的全场景深度学习框架开源我的项目,应该提供 Docker 装置镜像;先康康我的运行环境:

  • Ubuntu 18.04.5 LTS
  • Docker version 18.09.6

这次装置的是 CPU 版本的,命令:

docker pull mindspore/mindspore-cpu:0.7.0-betadocker run -it mindspore/mindspore-cpu:0.7.0-beta /bin/bash

一步到“胃”,间接进入到 home 目录,接下来 Copy 攻城狮要开始表演粗劣的 Copy*,跑通 MindSpore 的 LeNet 模型。

Fork 代码

为啥要 Fork 代码呢?您指望一个毫无核心技术的 Copy 攻城狮手写一个深度学习框架 MindSpore?代码千千万,Fork 第一条!不啰嗦,先 fork 一下MindSpore 官网仓库,一键领有深度学习框架。当然 Fork 之后,咱们要将代码 clone 到本地,因为我的码云账号叫 hu-qi, 所以我要 clone 的门路是 https://gitee.com/hu-qi/minds…。

git clone https://gitee.com/hu-qi/mindspore

因为码云是咱本人的,速度倍儿棒,稍等片刻,美味行将出现。

翻车现场

ModuleNotFoundError: No module named ‘mindspore.dataset.vision’.

习惯了瞎折腾,认为间接运行 train.py 就能一分钟跑通,还是“too young,too simple”。一波谬误的示范, 而后就是图中微小的坑:

幸好前人曾经踩过坑了:Windows 零碎下跑通华为 MindSpore 的 Lenet 网络, 只管是 Windows 零碎的,看上去仿佛是雷同的问题。为了记录本次踩坑历程,我决定施展一下 git 技能!

checkout 踩坑分支

为了印象更加粗浅,我决定将分支命名为 9 -12,以此留念 ”9·12 踩坑事件 ”。

cd /home/mindspore
git checkout -b 9-12

而后参照前人的经验教训开始批改本地文件。

批改文件

本次批改的是两个文件 –lenet/train.py 和 lenet/src/dataset.py。

  • lenet/src/dataset.py
# ……
# line 20 新增层级 transforms
import mindspore.dataset.transforms.vision.c_transforms as CV
# line 22 新增层级 transforms
from mindspore.dataset.transforms.vision import Int
# ……

  • lenet/train.py
# ……
# 正文 line 32 和 line34
# from mindspore.common import set_seed
# set_seed(1)# line 55 新增设置 is_grad=false
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean", is_grad=False)
# ……

在 lenet 目录满怀信心的执行命令:python train.py –device_target=CPU –dataset_sink_mode=False, 后果又是一个谬误:ValueError: The folder ./Data/train does not exist or permission denied!

一开始认为是权限的问题,通过一些尝试,发现是没有 Data 目录。那就在 lenet 下新建一个 Data 目录以及子目录 test 和 train 吧。

cd /home/mindspore/model_zoo/official/cv/lenet
mkdir Data
mkdir Data/test && mkdir Data/train

而后仍旧满怀信心敲下执行训练的命令:python train.py –device_target=CPU –dataset_sink_mode=False

后果又是一个坑:Unexpected error. There is no valid data matching the dataset API MnistDataset.Please check file path or dataset API validation first.。怎么办?意识到脚本并没有给我主动下载 Mnist 数据集,又不懂代码,只好手动去下载了。

下载 Mnist 数据集

Mnist 数据集:http://yann.lecun.com/exdb/mn…

数据目录构造:

└─Data
    ├─test
    │      t10k-images.idx3-ubyte
    │      t10k-labels.idx1-ubyte
    │
    └─train
            train-images.idx3-ubyte
            train-labels.idx1-ubyte

既然是 linux,二话不说,先来四个 wget!

# 切换到 Data 目录
cd Data
# 下载训练图片
wget  
# 下载训练标签
wget  
#下载测试图片
wget  
# 下载测试标签
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

而后又是一波解压操作, 来四个 gunzip:

gunzip train-images-idx3-ubyte.gz
gunzip train-labels-idx1-ubyte.gz
gunzip t10k-images-idx3-ubyte.gz
gunzip t10k-labels-idx1-ubyte.gz

最初,再来一波挪动文件操作压压惊。来四个 mv:

mv train-images-idx3-ubyte ./train
mv train-labels-idx1-ubyte ./train
mv t10k-images-idx3-ubyte ./test/
mv t10k-labels-idx1-ubyte ./test/

此时此刻,感触到不懂代码真吃亏,明明几行代码就解决了,我要这么多套“切克闹”能力获取到数据集,我肯定向明明学习,争取早日解脱 Copy 攻城狮 的名称,实现 代码自在 ,赢取 开源硕果 ,走向 撸码巅峰!咳咳,再来一盘花生米,我还能唠嗑!

训练及验证

新司机再次上路,这回我总能欢快的训练了吧?

cd /home/mindspore/model_zoo/official/cv/lenet
python train.py --device_target=CPU --dataset_sink_mode=False

而后终于看到了胜利的曙光,跑起来了!跑起来了!跑起来了!看到一行行日志不断涌现,我的眼眶噙满了泪水 –“小胡,你在干啥?你丫一前端下班在跑模型,不想干了吗?今天去财务领钱……”还好隔壁王哥及时解围 –“他这是在深度学习,当前不会再把 1 像素切成 2 像素了”

接下还须要验证一下:

cd /home/mindspore/model_zoo/official/cv/lenet
python eval.py --ckpt_path="ckpt/checkpoint_lenet-10_1875.ckpt" --device_target=CPU

运行后果:

============== Starting Testing ==============
============== {'Accuracy': 0.9847756410256411} ==============

勉强能承受吧,毕竟只整了 10 个 epoch。

上传到近程仓库

只管咱们曾经跑通了 MindSpore 的 LeNet,不过我还是心愿能把踩的这些坑记录下来,最初再应用一下 git 技能:

# 切换到本地仓库目录
cd /home/mindspore
# 设置 git
git config --global user.email "huqi1008301@163.com"
git config --global user.name "hu-qi"
# 查看本地分支,确保我的 9 -12 还在
git branch
# 查看有哪些扭转
git status
# 新增扭转
git add .
# 提交扭转到缓存仓库
git commit -m 'finish LeNet'
# 推送分支到近程(依照提醒登录)git push origin 9-12

一顿操作猛如虎,一看代码原地杵,当然要切换到 9-12 这个分支才有的啦。

结语

所谓“一分钟”的体验,大略花了一个小时踩坑了,而后大略花了三个小时来记录。不足之处,期待各位大佬多多指教!

**[点击关注,第一工夫理解华为云陈腐技术~](https://bbs.huaweicloud.com/b…
)**

正文完
 0