基于ModelArts本地WSL2-GPU復(fù)現(xiàn)lenet5模型訓(xùn)練丨【華為云AI賀新年】

      網(wǎng)友投稿 1029 2022-05-30

      基于LeNet5的手寫數(shù)字識(shí)別

      實(shí)驗(yàn)介紹

      LeNet5 + MNIST被譽(yù)為深度學(xué)習(xí)領(lǐng)域的“Hello world”。本實(shí)驗(yàn)主要介紹使用MindSpore在MNIST手寫數(shù)字?jǐn)?shù)據(jù)集上開發(fā)和訓(xùn)練一個(gè)LeNet5模型,并驗(yàn)證模型精度。

      實(shí)驗(yàn)?zāi)康?/p>

      了解如何使用MindSpore進(jìn)行簡單卷積神經(jīng)網(wǎng)絡(luò)的開發(fā)。

      了解如何使用MindSpore進(jìn)行簡單圖片分類任務(wù)的訓(xùn)練。

      了解如何使用MindSpore進(jìn)行簡單圖片分類任務(wù)的驗(yàn)證。

      預(yù)備知識(shí)

      熟練使用Python,了解Shell及Linux操作系統(tǒng)基本知識(shí)。

      具備一定的深度學(xué)習(xí)理論知識(shí),如卷積神經(jīng)網(wǎng)絡(luò)、損失函數(shù)、優(yōu)化器,訓(xùn)練策略等。

      了解華為云的基本使用方法,包括OBS(對象存儲(chǔ))、ModelArts(AI開發(fā)平臺(tái))、Notebook(開發(fā)工具)、訓(xùn)練作業(yè)等服務(wù)。華為云官網(wǎng):https://www.huaweicloud.com

      了解并熟悉MindSpore AI計(jì)算框架,MindSpore官網(wǎng):https://www.mindspore.cn

      實(shí)驗(yàn)環(huán)境

      MindSpore 1.0.0(MindSpore版本會(huì)定期更新,本指導(dǎo)也會(huì)定期刷新,與版本配套);

      華為云ModelArts(控制臺(tái)左上角選擇“華北-北京四”):ModelArts是華為云提供的面向開發(fā)者的一站式AI開發(fā)平臺(tái),集成了昇騰AI處理器資源池,用戶可以在該平臺(tái)下體驗(yàn)MindSpore;

      Windows/Ubuntu x64筆記本,NVIDIA GPU服務(wù)器,或Atlas Ascend服務(wù)器等。

      實(shí)驗(yàn)準(zhǔn)備

      數(shù)據(jù)集準(zhǔn)備

      MNIST是一個(gè)手寫數(shù)字?jǐn)?shù)據(jù)集,訓(xùn)練集包含60000張手寫數(shù)字,測試集包含10000張手寫數(shù)字,共10類。MNIST數(shù)據(jù)集的官網(wǎng):THE MNIST DATABASE。

      方式一,從MNIST官網(wǎng)下載如下4個(gè)文件到本地并解壓:

      train-images-idx3-ubyte.gz: training set images (9912422 bytes) train-labels-idx1-ubyte.gz: training set labels (28881 bytes) t10k-images-idx3-ubyte.gz: test set images (1648877 bytes) t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

      方式二,從華為云OBS中下載MNIST數(shù)據(jù)集并解壓。

      方式三(推薦),使用ModelArts訓(xùn)練作業(yè)/Notebook時(shí),可以拷貝他人共享的OBS桶內(nèi)的數(shù)據(jù)集,方法詳見適配訓(xùn)練作業(yè)、數(shù)據(jù)拷貝。

      腳本準(zhǔn)備

      從課程gitee倉庫上下載本實(shí)驗(yàn)相關(guān)腳本。將腳本和數(shù)據(jù)集組織為如下形式:

      lenet5 ├── MNIST │ ├── test │ │ ├── t10k-images-idx3-ubyte │ │ └── t10k-labels-idx1-ubyte │ └── train │ ├── train-images-idx3-ubyte │ └── train-labels-idx1-ubyte └── main.py

      創(chuàng)建OBS桶

      使用ModelArts訓(xùn)練作業(yè)/Notebook時(shí),需要使用華為云OBS存儲(chǔ)實(shí)驗(yàn)?zāi)_本和數(shù)據(jù)集,可以參考快速通過OBS控制臺(tái)上傳下載文件了解使用OBS創(chuàng)建桶、上傳文件、下載文件的使用方法(下文給出了操作步驟)。

      提示: 華為云新用戶使用OBS時(shí)通常需要?jiǎng)?chuàng)建和配置“訪問密鑰”,可以在使用OBS時(shí)根據(jù)提示完成創(chuàng)建和配置。也可以參考獲取訪問密鑰并完成ModelArts全局配置獲取并配置訪問密鑰。

      打開OBS控制臺(tái),點(diǎn)擊右上角的“創(chuàng)建桶”按鈕進(jìn)入桶配置頁面,創(chuàng)建OBS桶的參考配置如下:

      區(qū)域:華北-北京四

      數(shù)據(jù)冗余存儲(chǔ)策略:單AZ存儲(chǔ)

      桶名稱:全局唯一的字符串

      存儲(chǔ)類別:標(biāo)準(zhǔn)存儲(chǔ)

      桶策略:公共讀

      歸檔數(shù)據(jù)直讀:關(guān)閉

      企業(yè)項(xiàng)目、標(biāo)簽等配置:免

      上傳文件

      點(diǎn)擊新建的OBS桶名,再打開“對象”標(biāo)簽頁,通過“上傳對象”、“新建文件夾”等功能,將腳本和數(shù)據(jù)集上傳到OBS桶中。上傳文件后,查看頁面底部的“任務(wù)管理”狀態(tài)欄(正在運(yùn)行、已完成、失敗),確保文件均上傳完成。若失敗請:

      參考上傳對象大小限制/切換上傳方式,

      參考上傳對象失敗常見原因。

      若無法解決請新建工單,產(chǎn)品類為“對象存儲(chǔ)服務(wù)”,問題類型為“桶和對象相關(guān)”,會(huì)有技術(shù)人員協(xié)助解決。

      實(shí)驗(yàn)步驟(ModelArts訓(xùn)練作業(yè))

      ModelArts提供了訓(xùn)練作業(yè)服務(wù),訓(xùn)練作業(yè)資源池大,且具有作業(yè)排隊(duì)等功能,適合大規(guī)模并發(fā)使用。使用訓(xùn)練作業(yè)時(shí),如果有修改代碼和調(diào)試的需求,有如下三個(gè)方案:

      在本地修改代碼后重新上傳;

      使用PyCharm ToolKit配置一個(gè)本地Pycharm+ModelArts的開發(fā)環(huán)境,便于上傳代碼、提交訓(xùn)練作業(yè)和獲取訓(xùn)練日志。

      在ModelArts上創(chuàng)建Notebook,然后設(shè)置Sync OBS功能,可以在線修改代碼并自動(dòng)同步到OBS中。因?yàn)橹挥肗otebook來編輯代碼,所以創(chuàng)建CPU類型最低規(guī)格的Notebook就行。

      適配訓(xùn)練作業(yè)

      創(chuàng)建訓(xùn)練作業(yè)時(shí),運(yùn)行參數(shù)會(huì)通過腳本傳參的方式輸入給腳本代碼,腳本必須解析傳參才能在代碼中使用相應(yīng)參數(shù)。如data_url和train_url,分別對應(yīng)數(shù)據(jù)存儲(chǔ)路徑(OBS路徑)和訓(xùn)練輸出路徑(OBS路徑)。腳本對傳參進(jìn)行解析后賦值到args變量里,在后續(xù)代碼里可以使用。

      import argparse parser = argparse.ArgumentParser() parser.add_argument('--data_url', required=True, default=None, help='Location of data.') parser.add_argument('--train_url', required=True, default=None, help='Location of training outputs.') args, unknown = parser.parse_known_args()

      MindSpore暫時(shí)沒有提供直接訪問OBS數(shù)據(jù)的接口,需要通過ModelArts自帶的moxing框架與OBS交互。

      方式一,拷貝自己賬戶下OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器。

      import moxing # src_url形如's3://OBS/PATH',為OBS桶中數(shù)據(jù)集的路徑,dst_url為執(zhí)行容器中的路徑 moxing.file.copy_parallel(src_url=args.data_url, dst_url='MNIST/')

      方式二(推薦),拷貝他人共享的OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器,前提是他人賬戶下的OBS桶已設(shè)為公共讀/公共讀寫。若在創(chuàng)建桶時(shí)桶策略為私有,請參考配置標(biāo)準(zhǔn)桶策略修改為公共讀/公共讀寫。

      import moxing moxing.file.copy_parallel(src_url="s3://share-course/dataset/MNIST/", dst_url='MNIST/')

      方式三(不推薦),先關(guān)聯(lián)他人私有賬戶,再拷貝他人賬戶下OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器,前提是已獲得他人賬戶的訪問密鑰、私有訪問密鑰、OBS桶-概覽-基本信息-Endpoint。

      import moxing # 設(shè)置他人賬戶的訪問密鑰, ak:Access Key Id, sk:Secret Access Key, server:endpoint of obs bucket moxing.file.set_auth(ak='Access Key', sk='Secret Access Key', server="obs.cn-north-4.myhuaweicloud.com") moxing.file.copy_parallel(src_url="s3://share-course/dataset/MNIST/", dst_url='MNIST/')

      創(chuàng)建訓(xùn)練作業(yè)

      可以參考使用常用框架訓(xùn)練模型來創(chuàng)建并啟動(dòng)訓(xùn)練作業(yè)(下文給出了操作步驟)。

      打開ModelArts控制臺(tái)-訓(xùn)練管理-訓(xùn)練作業(yè),點(diǎn)擊“創(chuàng)建”按鈕進(jìn)入訓(xùn)練作業(yè)配置頁面,創(chuàng)建訓(xùn)練作業(yè)的參考配置:

      算法來源:常用框架->Ascend-Powered-Engine->MindSpore

      代碼目錄:選擇上述新建的OBS桶中的lenet5目錄,用obs browser+上傳

      啟動(dòng)文件:選擇上述新建的OBS桶中的lenet5目錄下的main.py,快速創(chuàng)建算法

      數(shù)據(jù)來源:數(shù)據(jù)存儲(chǔ)位置->選擇上述新建的OBS桶中的lenet5目錄下的MNIST目錄

      訓(xùn)練輸出位置:選擇上述新建的OBS桶中的lenet5目錄并在其中創(chuàng)建output目錄

      作業(yè)日志路徑:同訓(xùn)練輸出位置

      規(guī)格:Ascend:1*Ascend 910

      其他均為默認(rèn)

      啟動(dòng)并查看訓(xùn)練過程:

      點(diǎn)擊提交以開始訓(xùn)練;

      在訓(xùn)練作業(yè)列表里可以看到剛創(chuàng)建的訓(xùn)練作業(yè),在訓(xùn)練作業(yè)頁面可以看到版本管理;

      點(diǎn)擊運(yùn)行中的訓(xùn)練作業(yè),在展開的窗口中可以查看作業(yè)配置信息,以及訓(xùn)練過程中的日志,日志會(huì)不斷刷新,等訓(xùn)練作業(yè)完成后也可以下載日志到本地進(jìn)行查看;

      參考實(shí)驗(yàn)步驟(ModelArts Notebook),在日志中找到對應(yīng)的打印信息,檢查實(shí)驗(yàn)是否成功。

      epoch: 1 step: 1875, loss is 1.9393733 epoch: 2 step: 1875, loss is 0.04649485 epoch: 3 step: 1875, loss is 0.06732483 [WARNING] SESSION(168,ffff0ffff1e0,python):2022-02-10-19:52:59.136.619 [mindspore/ccsrc/backend/session/ascend_session.cc:1806] SelectKernel] There are 4 node/nodes used reduce precision to selected the kernel! Metrics: {'loss': 0.07129916341009682, 'acc': 0.9781650641025641}

      實(shí)驗(yàn)步驟(ModelArts Notebook)

      ModelArts Notebook資源池較小,且每個(gè)運(yùn)行中的Notebook會(huì)一直占用Device資源不釋放,不適合大規(guī)模并發(fā)使用(不使用時(shí)需停止實(shí)例,以釋放資源)。

      創(chuàng)建Notebook

      可以參考創(chuàng)建并打開Notebook來創(chuàng)建并打開Notebook(下文給出了操作步驟)。

      打開ModelArts控制臺(tái)-開發(fā)環(huán)境-Notebook,點(diǎn)擊“創(chuàng)建”按鈕進(jìn)入Notebook配置頁面,創(chuàng)建Notebook的參考配置:

      計(jì)費(fèi)模式:按需計(jì)費(fèi)

      名稱:notebook-lenet5

      工作環(huán)境:公共鏡像->Ascend+ARM算法開發(fā)和訓(xùn)練基礎(chǔ)鏡像,AI引擎預(yù)置TensorFlow和MindSpore

      資源池:公共資源

      類型:Ascend

      規(guī)格:單卡1*Ascend 910

      存儲(chǔ)位置:對象存儲(chǔ)服務(wù)(OBS)->選擇上述新建的OBS桶中的lenet5文件夾(此為舊版操作,新版請看下面詳細(xì)敘述)

      自動(dòng)停止:打開->選擇1小時(shí)后(后續(xù)可在Notebook中隨時(shí)調(diào)整)

      注意:

      在Jupyter Notebook/JupyterLab文件列表里,展示的是關(guān)聯(lián)的OBS桶里的文件,并不在當(dāng)前Notebook工作環(huán)境(容器)中,Notebook中的代碼無法直接訪問這些文件。

      打開Notebook前,選中文件列表里的所有文件/文件夾(實(shí)驗(yàn)?zāi)_本和數(shù)據(jù)集),并點(diǎn)擊列表上方的“Sync OBS”按鈕,使OBS桶中的所有文件同時(shí)同步到Notebook執(zhí)行容器中,這樣Notebook中的代碼才能訪問數(shù)據(jù)集。

      使用Notebook時(shí),可參考與OBS同步文件;

      使用JupyterLab時(shí),可參考與OBS同步文件。

      同步文件的大小和數(shù)量超過限制時(shí),請參考MoXing常用操作示例中的拷貝操作,將大文件(如數(shù)據(jù)集)拷貝到Notebook容器中。

      Notebook/JupyterLab文件列表頁面的“Upload/上傳”功能,會(huì)將文件上傳至OBS桶中,而不是Notebook執(zhí)行容器中,仍需額外同步/拷貝。

      在Notebook里通過代碼/命令(如wget, git、pythonurllib, requests等)獲取的文件,存在于Notebook執(zhí)行容器中,但不會(huì)顯示在文件列表里。

      每個(gè)Notebook實(shí)例僅被分配了1個(gè)Device,如果在一個(gè)實(shí)例中打開多個(gè)Notebook頁面(即多個(gè)進(jìn)程),運(yùn)行其中一個(gè)頁面上的MindSpore代碼時(shí),請關(guān)閉其他頁面的kernel,否則會(huì)出現(xiàn)Device被占用的錯(cuò)誤。

      Notebook運(yùn)行中一直處于計(jì)費(fèi)狀態(tài),不使用時(shí),在Notebook控制臺(tái)頁面點(diǎn)擊實(shí)例右側(cè)的“停止”,以停止計(jì)費(fèi)。停止后,Notebook里的內(nèi)容不會(huì)丟失(已同步至OBS)。下次需要使用時(shí),點(diǎn)擊實(shí)例右側(cè)的“啟動(dòng)”即可。可參考啟動(dòng)或停止Notebook實(shí)例。

      將數(shù)據(jù)添加到并行文件系統(tǒng)中

      創(chuàng)建完成后,添加數(shù)據(jù)存儲(chǔ)

      打開Notebook后,選擇MindSpore環(huán)境作為Kernel。

      提示:

      上述數(shù)據(jù)集和腳本的準(zhǔn)備工作也可以在Notebook環(huán)境中完成,在Jupyter Notebook文件列表頁面,點(diǎn)擊右上角的"New"->“Terminal”,進(jìn)入Notebook環(huán)境所在終端,進(jìn)入work目錄,可以使用常用的linux shell命令,如wget, gzip, tar, mkdir, mv等,完成數(shù)據(jù)集和腳本的下載和準(zhǔn)備。

      可將如下每段代碼拷貝到Notebook代碼框/Cell中,從上至下閱讀提示并執(zhí)行代碼框進(jìn)行體驗(yàn)。代碼框執(zhí)行過程中左側(cè)呈現(xiàn)[*],代碼框執(zhí)行完畢后左側(cè)呈現(xiàn)如[1],[2]等。請等上一個(gè)代碼框執(zhí)行完畢后再執(zhí)行下一個(gè)代碼框。

      數(shù)據(jù)拷貝

      若已通過“Sync OBS”功能將OBS桶中的數(shù)據(jù)集同步到Notebook執(zhí)行容器中,則跳過數(shù)據(jù)拷貝環(huán)節(jié)。若大小或數(shù)量超過同步限制,可通過ModelArts自帶的moxing框架,將數(shù)據(jù)集拷貝至執(zhí)行容器中。

      方式一,拷貝自己賬戶下OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器。

      import moxing # src_url形如's3://OBS/PATH',為OBS桶中數(shù)據(jù)集的路徑,dst_url為執(zhí)行容器中的路徑 moxing.file.copy_parallel(src_url="s3://OBS/PATH/TO/MNIST/", dst_url='MNIST/')

      方式二(推薦),拷貝他人共享的OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器,前提是他人賬戶下的OBS桶已設(shè)為公共讀/公共讀寫。若在創(chuàng)建桶時(shí)桶策略為私有,請參考配置標(biāo)準(zhǔn)桶策略修改為公共讀/公共讀寫。

      import moxing moxing.file.copy_parallel(src_url="s3://share-course/dataset/MNIST/", dst_url='MNIST/')

      方式三(不推薦),先關(guān)聯(lián)他人私有賬戶,再拷貝他人賬戶下OBS桶內(nèi)的數(shù)據(jù)集至執(zhí)行容器,前提是已獲得他人賬戶的訪問密鑰、私有訪問密鑰、OBS桶-概覽-基本信息-Endpoint。

      import moxing # 設(shè)置他人賬戶的訪問密鑰, ak:Access Key Id, sk:Secret Access Key, server:endpoint of obs bucket moxing.file.set_auth(ak='Access Key', sk='Secret Access Key', server="obs.cn-north-4.myhuaweicloud.com") moxing.file.copy_parallel(src_url="s3://share-course/dataset/MNIST/", dst_url='MNIST/')

      導(dǎo)入模塊

      導(dǎo)入MindSpore模塊和輔助模塊,設(shè)置MindSpore上下文,如執(zhí)行模式、設(shè)備等。

      import os # os.environ['DEVICE_ID'] = '0' import mindspore as ms import mindspore.context as context import mindspore.dataset.transforms.c_transforms as C import mindspore.dataset.vision.c_transforms as CV from mindspore import nn from mindspore.train import Model from mindspore.train.callback import LossMonitor context.set_context(mode=context.GRAPH_MODE, device_target='Ascend') # Ascend, CPU, GPU

      數(shù)據(jù)處理

      在使用數(shù)據(jù)集訓(xùn)練網(wǎng)絡(luò)前,首先需要對數(shù)據(jù)進(jìn)行預(yù)處理,如下:

      def create_dataset(data_dir, training=True, batch_size=32, resize=(32, 32), rescale=1/(255*0.3081), shift=-0.1307/0.3081, buffer_size=64): data_train = os.path.join(data_dir, 'train') # train set data_test = os.path.join(data_dir, 'test') # test set ds = ms.dataset.MnistDataset(data_train if training else data_test) ds = ds.map(input_columns=["image"], operations=[CV.Resize(resize), CV.Rescale(rescale, shift), CV.HWC2CHW()]) ds = ds.map(input_columns=["label"], operations=C.TypeCast(ms.int32)) # When `dataset_sink_mode=True` on Ascend, append `ds = ds.repeat(num_epochs) to the end ds = ds.shuffle(buffer_size=buffer_size).batch(batch_size, drop_remainder=True) return ds

      對其中幾張圖片進(jìn)行可視化,可以看到圖片中的手寫數(shù)字,圖片的大小為32x32。

      import matplotlib.pyplot as plt ds = create_dataset('data/lenet/lenet5/MNIST', training=False)#修改為掛載路徑即可 data = ds.create_dict_iterator(output_numpy=True).get_next() images = data['image'] labels = data['label'] for i in range(1, 5): plt.subplot(2, 2, i) plt.imshow(images[i][0]) plt.title('Number: %s' % labels[i]) plt.xticks([]) plt.show()

      定義模型

      定義LeNet5模型,模型結(jié)構(gòu)如下圖所示:

      提示: MindSpore model_zoo中提供了多種常見的模型,可以直接使用。

      class LeNet5(nn.Cell): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5, stride=1, pad_mode='valid') self.conv2 = nn.Conv2d(6, 16, 5, stride=1, pad_mode='valid') self.relu = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.flatten = nn.Flatten() self.fc1 = nn.Dense(400, 120) self.fc2 = nn.Dense(120, 84) self.fc3 = nn.Dense(84, 10) def construct(self, x): x = self.relu(self.conv1(x)) x = self.pool(x) x = self.relu(self.conv2(x)) x = self.pool(x) x = self.flatten(x) x = self.fc1(x) x = self.fc2(x) x = self.fc3(x) return x

      基于ModelArts和本地WSL2-GPU復(fù)現(xiàn)lenet5模型訓(xùn)練丨【華為云AI賀新年】

      訓(xùn)練

      使用MNIST數(shù)據(jù)集對上述定義的LeNet5模型進(jìn)行訓(xùn)練。訓(xùn)練策略如下表所示,可以調(diào)整訓(xùn)練策略并查看訓(xùn)練效果,要求驗(yàn)證精度大于95%。

      def train(data_dir, lr=0.01, momentum=0.9, num_epochs=3): ds_train = create_dataset(data_dir) ds_eval = create_dataset(data_dir, training=False) net = LeNet5() loss = nn.loss.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') opt = nn.Momentum(net.trainable_params(), lr, momentum) loss_cb = LossMonitor(per_print_times=ds_train.get_dataset_size()) model = Model(net, loss, opt, metrics={'acc', 'loss'}) # dataset_sink_mode can be True when using Ascend model.train(num_epochs, ds_train, callbacks=[loss_cb], dataset_sink_mode=False) metrics = model.eval(ds_eval, dataset_sink_mode=False) print('Metrics:', metrics) train('data/lenet/lenet5/MNIST/')#此處我們修改為自己的掛載路徑即可

      epoch: 1 step 1875, loss is 0.23394052684307098 epoch: 2 step 1875, loss is 0.4737345278263092 epoch: 3 step 1875, loss is 0.07734094560146332 Metrics: {'loss': 0.10531254443608654, 'acc': 0.9701522435897436}

      訓(xùn)練完成。

      實(shí)驗(yàn)步驟(本地CPU/GPU/Ascend)

      MindSpore還支持在本地CPU/GPU/Ascend環(huán)境上運(yùn)行,如Windows/Ubuntu x64筆記本,NVIDIA GPU服務(wù)器,以及Atlas Ascend服務(wù)器等。在本地環(huán)境運(yùn)行實(shí)驗(yàn)前,需要先參考安裝教程配置環(huán)境。

      在Windows/Ubuntu x64筆記本上運(yùn)行實(shí)驗(yàn):

      # 編輯main.py 將第15行的context設(shè)置為`device_target='CPU'或者'GPU' python main.py --data_url=D:\dataset\MNIST

      在Ascend服務(wù)器上運(yùn)行實(shí)驗(yàn):

      vim main.py # 將第15行的context設(shè)置為`device_target='Ascend'` python main.py --data_url=/PATH/TO/MNIST

      實(shí)驗(yàn)小結(jié)

      本實(shí)驗(yàn)展示了如何使用MindSpore進(jìn)行手寫數(shù)字識(shí)別,以及開發(fā)和訓(xùn)練LeNet5模型。通過對LeNet5模型做幾代的訓(xùn)練,然后使用訓(xùn)練后的LeNet5模型對手寫數(shù)字進(jìn)行識(shí)別,識(shí)別準(zhǔn)確率大于95%。即LeNet5學(xué)習(xí)到了如何進(jìn)行手寫數(shù)字識(shí)別。

      AI賀新年

      【華為云AI賀新年】有獎(jiǎng)?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/325842

      AI開發(fā)平臺(tái)ModelArts GPU加速云服務(wù)器 Linux 機(jī)器學(xué)習(xí)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【華為云社區(qū)內(nèi)容共創(chuàng)者火熱招募中】第三彈:最美人間四月天,共創(chuàng)學(xué)習(xí)好時(shí)節(jié)!
      下一篇:前端Promise總結(jié)筆記丨【W(wǎng)EB前端大作戰(zhàn)】
      相關(guān)文章
      亚洲欧洲日产国码无码久久99| 亚洲日韩精品无码专区加勒比☆ | 亚洲人成77777在线播放网站| 国产成人亚洲午夜电影| 亚洲中文字幕无码久久| 亚洲中文字幕日本无线码| 亚洲午夜国产精品无卡| 亚洲国产精品日韩在线观看| 91亚洲精品自在在线观看| 亚洲性一级理论片在线观看| 亚洲国产精品成人精品小说| 亚洲天堂福利视频| 亚洲一区二区三区四区视频| 国产精品亚洲片夜色在线 | 亚洲高清国产拍精品青青草原| 亚洲 另类 无码 在线| 亚洲午夜福利精品久久| 中文字幕精品无码亚洲字| 亚洲欧洲美洲无码精品VA| 国产亚洲综合一区柠檬导航| 亚洲阿v天堂在线| 亚洲一级二级三级不卡| 亚洲精品福利网站| 亚洲AV无码乱码在线观看代蜜桃| 亚洲a级在线观看| 亚洲精品无码成人片久久不卡 | 亚洲欧美日韩自偷自拍| 精品韩国亚洲av无码不卡区| 亚洲国产精品视频| 亚洲无线观看国产精品| 亚洲av日韩av天堂影片精品| 亚洲精品**中文毛片| 亚洲免费福利在线视频| 亚洲AV无码AV日韩AV网站| 亚洲国产精品一区二区九九| 亚洲色成人WWW永久网站| 亚洲AV成人片色在线观看高潮| 久久亚洲熟女cc98cm| 国产精品亚洲午夜一区二区三区 | 久久亚洲AV成人无码电影| 久久精品国产亚洲αv忘忧草|