Copy攻城獅辛酸史:含淚“一分鍾”跑通MindSpore的LeNet模型


摘要:一個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的路徑是

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數據集: 

數據目錄結構:

└─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這個分支才有的啦。

結語

所謂“一分鍾”的體驗,大概花了一個小時踩坑了,然后大概花了三個小時來記錄。不足之處,期待各位大佬多多指教!

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM