0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Raspberry Pi 3上構(gòu)建機(jī)器學(xué)習(xí)應(yīng)用程序

電子設(shè)計(jì) ? 來(lái)源:郭婷 ? 作者:電子設(shè)計(jì) ? 2019-01-17 08:24 ? 次閱讀

希望評(píng)估機(jī)器學(xué)習(xí)方法的開(kāi)發(fā)人員發(fā)現(xiàn)了越來(lái)越多的專(zhuān)業(yè)硬件和開(kāi)發(fā)平臺(tái),這些平臺(tái)通常針對(duì)特定類(lèi)別的機(jī)器學(xué)習(xí)架構(gòu)和應(yīng)用程序進(jìn)行調(diào)整。雖然這些專(zhuān)業(yè)平臺(tái)對(duì)于許多機(jī)器學(xué)習(xí)應(yīng)用程序至關(guān)重要,但很少有新的機(jī)器學(xué)習(xí)人員可以做出有關(guān)選擇理想平臺(tái)的明智決策。

開(kāi)發(fā)人員需要一個(gè)更易于訪問(wèn)的平臺(tái)來(lái)獲得機(jī)器開(kāi)發(fā)經(jīng)驗(yàn)學(xué)習(xí)應(yīng)用程序并更深入地了解資源需求和最終的功能。

Digi-Key文章“使用隨時(shí)可用的硬件和軟件開(kāi)始機(jī)器學(xué)習(xí)”中所述,開(kāi)發(fā)任何用于監(jiān)督機(jī)器學(xué)習(xí)的模型包括三個(gè)關(guān)鍵步驟:

準(zhǔn)備培訓(xùn)模型的數(shù)據(jù)

模型實(shí)施

模型培訓(xùn)

數(shù)據(jù)準(zhǔn)備將熟悉的數(shù)據(jù)采集方法與標(biāo)記特定數(shù)據(jù)實(shí)例所需的額外步驟相結(jié)合,以便在培訓(xùn)過(guò)程中使用。對(duì)于最后兩個(gè)步驟,機(jī)器學(xué)習(xí)模型專(zhuān)家直到最近才需要使用相對(duì)較低級(jí)別的數(shù)學(xué)庫(kù)來(lái)實(shí)現(xiàn)模型算法中涉及的詳細(xì)計(jì)算。機(jī)器學(xué)習(xí)框架的可用性大大降低了模型實(shí)施和培訓(xùn)的復(fù)雜性。

今天,任何熟悉Python或其他支持語(yǔ)言的開(kāi)發(fā)人員都可以使用這些框架快速開(kāi)發(fā)能夠運(yùn)行的機(jī)器學(xué)習(xí)模型。各種各樣的平臺(tái)。本文將介紹如何在Raspberry Pi 3上開(kāi)發(fā)機(jī)器學(xué)習(xí)應(yīng)用程序之前的機(jī)器學(xué)習(xí)堆棧和培訓(xùn)過(guò)程。

機(jī)器學(xué)習(xí)堆棧

為了支持模型開(kāi)發(fā),機(jī)器學(xué)習(xí)框架提供了一整套資源(圖1)。在典型堆棧的頂部,培訓(xùn)和推理庫(kù)提供定義,培訓(xùn)和運(yùn)行模型的服務(wù)。這些模型反過(guò)來(lái)建立在內(nèi)核函數(shù)的優(yōu)化實(shí)現(xiàn)上,例如卷積和激活函數(shù),如ReLU,以及矩陣乘法等。這些優(yōu)化的數(shù)學(xué)函數(shù)適用于較低級(jí)別的驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序提供抽象層以與通用CPU連接,或者在可用時(shí)充分利用專(zhuān)用硬件(如圖形處理單元(GPU))。

如何在Raspberry Pi 3上構(gòu)建機(jī)器學(xué)習(xí)應(yīng)用程序

圖1:在典型的機(jī)器學(xué)習(xí)堆棧中,更高級(jí)別的庫(kù)提供了實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)和其他機(jī)器學(xué)習(xí)算法的功能,借鑒了專(zhuān)業(yè)的數(shù)學(xué)庫(kù)實(shí)現(xiàn)針對(duì)底層硬件層中的CPU和GPU優(yōu)化的內(nèi)核函數(shù)。 (圖片來(lái)源:Google)

隨著提供這些堆棧的TensorFlow等機(jī)器學(xué)習(xí)框架的可用性,無(wú)論硬件目標(biāo)如何,在應(yīng)用程序中實(shí)現(xiàn)機(jī)器學(xué)習(xí)的開(kāi)發(fā)過(guò)程大致相同。在不同硬件平臺(tái)上利用TensorFlow的能力允許開(kāi)發(fā)人員開(kāi)始在相對(duì)適度的硬件平臺(tái)上探索模型開(kāi)發(fā),然后利用這些經(jīng)驗(yàn)在更強(qiáng)大的硬件上開(kāi)發(fā)機(jī)器學(xué)習(xí)應(yīng)用程序。

預(yù)計(jì)專(zhuān)業(yè)的高性能人工智能AI芯片最終將為開(kāi)發(fā)人員提供實(shí)現(xiàn)復(fù)雜機(jī)器學(xué)習(xí)算法的能力。在此之前,開(kāi)發(fā)人員可以開(kāi)始評(píng)估機(jī)器學(xué)習(xí)并使用通用平臺(tái)創(chuàng)建真正的機(jī)器學(xué)習(xí)應(yīng)用程序,包括Raspberry Pi Foundation的Raspberry Pi 3,或任何基于通用處理器(如Arm ?)的現(xiàn)成開(kāi)發(fā)板。 Cortex ? -A系列MCU或Arm Cortex-M系列MCU。

Raspberry Pi 3作為機(jī)器學(xué)習(xí)應(yīng)用程序的開(kāi)發(fā)平臺(tái)提供了一些直接的優(yōu)勢(shì)。其Arm Cortex-A53四核處理器提供了顯著的性能,而核心的NEON單指令,多數(shù)據(jù)(SIMD)擴(kuò)展能夠執(zhí)行一定程度的多媒體和機(jī)器學(xué)習(xí)類(lèi)型處理。但是,開(kāi)發(fā)人員可以使用任意數(shù)量的兼容硬件附件輕松擴(kuò)展基礎(chǔ)Raspberry Pi 3硬件平臺(tái)。

例如,要?jiǎng)?chuàng)建下面描述的機(jī)器學(xué)習(xí)圖像識(shí)別系統(tǒng),開(kāi)發(fā)人員可以添加相機(jī),如800萬(wàn)像素Raspberry Pi相機(jī)模塊v2或其低光Pi NoIR相機(jī)(圖2)。

圖2:低 - 諸如Raspberry Pi 3之類(lèi)的成本板為機(jī)器學(xué)習(xí)開(kāi)發(fā)提供了一個(gè)有用的平臺(tái),支持諸如用于開(kāi)發(fā)圖像分類(lèi)應(yīng)用程序的相機(jī)模塊之類(lèi)的附加組件。 (圖片來(lái)源:Raspberry Pi Foundation)

在軟件方面,Raspberry Pi社區(qū)創(chuàng)建了一個(gè)同樣豐富的生態(tài)系統(tǒng),開(kāi)發(fā)人員可以在其中找到包含完整的預(yù)編譯二進(jìn)制輪文件的分發(fā)版,以便在Raspberry上安裝TensorFlow皮。 TensorFlow在Raspberry Pi車(chē)輪存儲(chǔ)庫(kù)piwheels.org上為Python 3.4和3.5提供了這些車(chē)輪文件?;蛘?,由于Docker現(xiàn)在正式支持Arm架構(gòu),開(kāi)發(fā)人員可以使用dockerhub.com中的合適容器。

實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型

使用這種軟件,Raspberry Pi 3和相機(jī)模塊的組合,開(kāi)發(fā)人員可以使用Arm的示例代碼構(gòu)建一個(gè)簡(jiǎn)單的機(jī)器學(xué)習(xí)手勢(shì)識(shí)別應(yīng)用程序。此應(yīng)用程序僅用于檢測(cè)用戶何時(shí)做出特定手勢(shì):在這種情況下,以一種慶祝手勢(shì)向空中舉手。

首先,使用Python腳本(記錄。 py)記錄幾次執(zhí)行相同手勢(shì)的人的短視頻片段。由于此應(yīng)用程序應(yīng)盡可能簡(jiǎn)單,因此下一步將使用TensorFlow中嵌入的Keras機(jī)器學(xué)習(xí)應(yīng)用程序編程接口(API)開(kāi)始培訓(xùn)。在此示例中,訓(xùn)練過(guò)程在另一個(gè)Python腳本(train.py)中定義,該腳本包括Keras模型定義和訓(xùn)練序列(清單1)。

復(fù)制 def main():. 。 。 model_file = argv [1] recording_files = argv [2:] feature_extractor = PiNet()。 。 。 for i,filename in enumerate(recording_files):stdout.write('%s'%filename)stdout.flush()with open(filename,'rb')as f:x = load(f)features = [feature_extractor.features (f)對(duì)于f in x] label = np.zeros((len(recording_files),))label [i] = 1.#在該列的文件欄中創(chuàng)建一個(gè)帶有1的標(biāo)簽xs + = features#添加從此文件加載的幀的功能ys + = [label] * len(x)#為文件中的每個(gè)幀添加標(biāo)簽class_count [i] = len(x)print(“創(chuàng)建網(wǎng)絡(luò)以對(duì)%s進(jìn)行分類(lèi)“%','。join(recording_files))classifier = make_classifier(xs [0] .shape,len(recording_files))print(”訓(xùn)練網(wǎng)絡(luò)將高級(jí)功能映射到%d類(lèi)別“%len(recording_files)) classifier.fit([np.array(xs)],[np.array(ys)],epochs = 20,shuffle = True)print(“現(xiàn)在我們保存這個(gè)模型,以便我們可以隨時(shí)部署它”)分類(lèi)器。 save(model_file)def make_classifier(input_shape,num_classes):“”“制作一個(gè)非常簡(jiǎn)單的分類(lèi)器圖層:GaussianNoise:添加隨機(jī)噪聲到pre發(fā)泄我們的分類(lèi)器記住具體的例子。展平:輸入可能來(lái)自具有形狀(x,y,深度)的層;將其壓平至1D。密集:每個(gè)類(lèi)提供一個(gè)輸出,按比例縮放為1(softmax)“”##定義一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)net_input = keras.layers.Input(input_shape)noise = keras.layers.GaussianNoise(0.3)(net_input)flat = keras .layers.Flatten()(noise)net_output = keras.layers.Dense(num_classes,activation ='softmax')(flat)net = keras.models.Model([net_input],[net_output])#在使用前編譯模型損失應(yīng)該與輸出激活函數(shù)匹配,例如#binary_crossentropy用于sigmoid,categorical_crossentropy用于softmax,mse用于線性。#Adam是一個(gè)可靠的默認(rèn)優(yōu)化器,我們可以將學(xué)習(xí)速率保留為默認(rèn)值.net.compile(optimizer = keras。 optimizers.Adam(),loss ='categorical_crossentropy',metrics = ['accuracy'])return net

清單1:在Arm示例應(yīng)用程序庫(kù)的這個(gè)片段中,培訓(xùn)過(guò)程結(jié)合了一個(gè)預(yù)先訓(xùn)練好的模型,該應(yīng)用程序需要簡(jiǎn)單的分類(lèi)器。(代碼來(lái)源:Arm)

盡管這個(gè)模型很簡(jiǎn)單,它實(shí)際上非常復(fù)雜,使用了一種稱(chēng)為轉(zhuǎn)移學(xué)習(xí)的技術(shù)。轉(zhuǎn)移學(xué)習(xí)使用經(jīng)過(guò)驗(yàn)證的模型,該模型使用一個(gè)數(shù)據(jù)集作為培訓(xùn)針對(duì)不同但相關(guān)問(wèn)題集的模型的起點(diǎn)。在這種情況下,該應(yīng)用程序使用來(lái)自Google的MobileNet模型集的優(yōu)化卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型。

由Google開(kāi)發(fā)的MobileNet模型是CNN在標(biāo)記的事實(shí)標(biāo)準(zhǔn)ImageNet數(shù)據(jù)集的子集上進(jìn)行訓(xùn)練圖片。 MobileNet模型的顯著特點(diǎn)是它們被配置為支持移動(dòng)設(shè)備或通用板(如Raspberry Pi)所需的減少的資源需求。這種資源減少的成本降低了準(zhǔn)確性。雖然這些模型提供的精確度遠(yuǎn)遠(yuǎn)低于關(guān)鍵任務(wù)應(yīng)用程序的要求,但MobileNet模型可以證明對(duì)于更寬松的要求和轉(zhuǎn)移學(xué)習(xí)中的基本模型非常有用。

對(duì)于此應(yīng)用程序,train.py腳本使用MobileNet模型創(chuàng)建一個(gè)特征提取器,其中最終分類(lèi)層已被刪除:

feature_extractor = PiNet()

PiNet函數(shù)只讀取代碼庫(kù)中包含的修改后的MobileNet模型。

然后,應(yīng)用程序使用該修改后的模型為此訓(xùn)練數(shù)據(jù)集創(chuàng)建要素集(要素):

features = [feature_extractor.features(f)for f in x]

其中x是一個(gè)數(shù)組,包含在初始數(shù)據(jù)收集步驟中由record.py生成的幀。

最后,train.py腳本使用Keras fit方法訓(xùn)練模型和save方法以保存最終模型以供推理使用:

classifier.fit ([np.array(xs)],[np.array(ys)],epochs = 20,shuffle = True)

classifier.save(model_file)

要使用生成的模型文件進(jìn)行推理,請(qǐng)調(diào)用另一個(gè)腳本run.py.此腳本中的關(guān)鍵設(shè)計(jì)模式是無(wú)限循環(huán),它采用每個(gè)幀,計(jì)算要素(extractor.features),使用相同的分類(lèi)器進(jìn)行推理(classifier.predict),并生成標(biāo)簽的預(yù)測(cè)(np.argmax)。預(yù)測(cè)只是目標(biāo)手勢(shì)是否已經(jīng)發(fā)生(清單2)。

復(fù)制 而True:raw_frame = camera.next_frame()#使用MobileNet獲取此幀的功能z = extractor.features(raw_frame)#使用這些功能,我們可以預(yù)測(cè)a 'normal'/'yeah'class(0或1)#Keras期望一組輸入并產(chǎn)生一個(gè)輸出數(shù)組classes = classifier.predict(np.array([z]))[0]#smooth the outputs - this添加延遲但減少中斷平滑=平滑* SMOOTH_FACTOR +類(lèi)*(1.0 - SMOOTH_FACTOR)選擇= np.argmax(平滑)#所選類(lèi)是概率最高的類(lèi)#顯示類(lèi)概率和選定的類(lèi)摘要='類(lèi)%d [%s]'%(已選中,''。join('%02.0f %%'%(99 * p)為平滑的p))stderr.write(' r'+ summary)

清單2:Arm示例run.py腳本中的這個(gè)片段演示了推理的基本設(shè)計(jì)模式,使用相同的預(yù)訓(xùn)練模型提取特征和相同的分類(lèi)器來(lái)執(zhí)行推理。 (代碼源:Arm)

多分類(lèi)模型

開(kāi)發(fā)一個(gè)應(yīng)用程序來(lái)檢測(cè)一類(lèi)輸入,例如單個(gè)手勢(shì),這在機(jī)器學(xué)習(xí)開(kāi)發(fā)中是值得的,但機(jī)器學(xué)習(xí)應(yīng)用程序通常用于多類(lèi)分類(lèi)。另一個(gè)Arm示例應(yīng)用程序演示了執(zhí)行此操作所需的步驟,并提供了完成多分類(lèi)模型開(kāi)發(fā)通常所需步驟的更完整示例。例如,除了捕獲期望的手勢(shì)之外,單個(gè)手勢(shì)應(yīng)用程序不需要重要的數(shù)據(jù)準(zhǔn)備。相比之下,多分類(lèi)應(yīng)用程序涉及大量數(shù)據(jù)捕獲和相關(guān)的開(kāi)發(fā)步驟,以使用Arm提供的Python腳本使用目標(biāo)類(lèi)(手勢(shì))標(biāo)記捕獲的視頻。在這種情況下,開(kāi)發(fā)者捕獲不同動(dòng)作的短視頻剪輯,例如進(jìn)入或離開(kāi)房間,指向燈(打開(kāi)或關(guān)閉),以及制作不同的手勢(shì)以開(kāi)始或停止音樂(lè)播放。使用classify.py腳本,查看圖像并輸入相應(yīng)的標(biāo)簽(與每個(gè)操作對(duì)應(yīng)的整數(shù))。標(biāo)記完成后,保留約10%的標(biāo)記數(shù)據(jù),用于測(cè)試模型,如下所述。

使用訓(xùn)練數(shù)據(jù)和保留的測(cè)試集,下一步是創(chuàng)建模型本身。與在單個(gè)手勢(shì)應(yīng)用程序中大量使用預(yù)訓(xùn)練模型不同,此應(yīng)用程序構(gòu)建完整的CNN模型。在這種情況下,使用一系列Keras語(yǔ)句,使用構(gòu)建2D卷積層(Conv2D)的Keras函數(shù)逐層構(gòu)建模型,添加激活層(激活),池化層(MaxPooling2D)等(列表) 3)。

復(fù)制 def main():如果len(argv)!= 3或argv [1] ==' - help':print(“ “”用法:train.py TRAIN_DIR VAL_DIR ...訓(xùn)練一個(gè)轉(zhuǎn)換網(wǎng)后保存TRAIN_DIR/model.h5以區(qū)分其子目錄中的圖像?!啊薄埃〆xit(1)train_data_dir = argv [1] val_data_dir = argv [2 ] nb_train_samples = len(glob('%s/*/* .png'%train_data_dir))nb_classes = len(glob('%s/*/'%train_data_dir))batch_size = 100 model = Sequential()model.add( Conv2D(32,(3,3),input_shape =(128,128,3)))model.add(Activation('elu'))model.add(MaxPooling2D(pool_size =(2,2)))model.add (Conv2D(32,(3,3)))model.add(Activation('elu'))model.add(MaxPooling2D(pool_size =(2,2)))model.add(Conv2D(64,(3,3) )))model.add(Activation('elu'))model.add(MaxPooling2D(pool_size =(2,2))) model.add(Flatten())model.add(Dense(64))model.add(Activation('elu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(激活('softmax'))model.compile(loss ='categorical_crossentropy',optimizer ='adam',metrics = ['accuracy'])

清單3:Arm多分類(lèi)示例應(yīng)用程序說(shuō)明了使用Keras函數(shù)逐層構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)。 (代碼源:Arm)

該模型還引入了dropout層的概念(清單3中的Dropout),它提供了一種稱(chēng)為正則化的模型優(yōu)化形式。在模型訓(xùn)練算法中,正則化因子降低了模型追逐每個(gè)特征的趨勢(shì),這可能導(dǎo)致模型中的過(guò)度擬合。 Dropout通過(guò)將一組隨機(jī)神經(jīng)元從處理鏈中刪除而執(zhí)行同樣的功能(圖3)。

如何在Raspberry Pi 3上構(gòu)建機(jī)器學(xué)習(xí)應(yīng)用程序

圖3:Dropout通過(guò)隨機(jī)禁用神經(jīng)元在深層神經(jīng)網(wǎng)絡(luò)中提供正則化,有效地將完全連接的神經(jīng)網(wǎng)絡(luò)(頂部)轉(zhuǎn)換為密度較低的版本(底部) 。 (圖片來(lái)源:多倫多大學(xué))

掌握完成的模型后,使用TensorFlow和其他框架內(nèi)置的傳統(tǒng)培訓(xùn)方法。對(duì)于非常復(fù)雜的模型,實(shí)際的培訓(xùn)過(guò)程可能需要數(shù)小時(shí),數(shù)天甚至數(shù)周。雖然開(kāi)發(fā)人員通常使用GPU來(lái)加速培訓(xùn),但是像之前的應(yīng)用程序一樣,使用傳輸學(xué)習(xí)可以幫助減少培訓(xùn)時(shí)間。但是,在此多分類(lèi)應(yīng)用程序中使用完整模型會(huì)轉(zhuǎn)化為更長(zhǎng)的訓(xùn)練時(shí)間。 Arm指出,這個(gè)應(yīng)用程序的培訓(xùn)時(shí)間在Raspberry Pi上可能很重要。相反,Arm建議開(kāi)發(fā)人員在自己的工作站上安裝TensorFlow,在工作站上進(jìn)行培訓(xùn),然后將訓(xùn)練好的模型復(fù)制回Raspberry Pi。

使用模型時(shí),推理過(guò)程大部分遵循相同的系列先前為單個(gè)手勢(shì)應(yīng)用程序顯示的調(diào)用。當(dāng)然,對(duì)于這個(gè)應(yīng)用程序,推理過(guò)程使用清單3中描述的自定義模型,而不是清單1中描述的單個(gè)手勢(shì)預(yù)訓(xùn)練模型和淺層分類(lèi)器。除了這個(gè)明顯的差異之外,多分類(lèi)模型開(kāi)發(fā)還增加了一個(gè)額外的步驟用于在生產(chǎn)使用之前測(cè)試模型。

在此測(cè)試階段,運(yùn)行模型就像生產(chǎn)推理一樣,但不使用一些新的輸入數(shù)據(jù),而是使用培訓(xùn)中保留的10%標(biāo)記數(shù)據(jù)。由于已經(jīng)知道每個(gè)測(cè)試圖像推斷的正確答案,因此測(cè)試腳本可以記錄實(shí)際的準(zhǔn)確度結(jié)果,以便與完成培訓(xùn)時(shí)獲得的準(zhǔn)確度結(jié)果進(jìn)行比較。

除了作為硬度量標(biāo)準(zhǔn)的基本優(yōu)勢(shì)之外,測(cè)試階段和模型響應(yīng)測(cè)試數(shù)據(jù)的方式可以提供關(guān)于可能需要采取哪些步驟來(lái)改進(jìn)模型的提示。因?yàn)樵摐y(cè)試數(shù)據(jù)包括在訓(xùn)練中使用的相同類(lèi)型的數(shù)據(jù),所以訓(xùn)練的模型應(yīng)該產(chǎn)生具有在訓(xùn)練期間實(shí)現(xiàn)的相同精度水平的預(yù)測(cè)。對(duì)于過(guò)度擬合的模型,減少輸入特征的數(shù)量并應(yīng)用更強(qiáng)大的正則化方法。對(duì)于有欠配合的模型,請(qǐng)做相反的事情;添加更多功能并減少正規(guī)化量。

基于MCU的應(yīng)用程序

TensorFlow和其他框架均提供一致的模型開(kāi)發(fā)方法,可應(yīng)用于各種目標(biāo)硬件平臺(tái)。然而,它們絕不是唯一的方法。在基于Arm的平臺(tái)上開(kāi)發(fā)機(jī)器學(xué)習(xí)應(yīng)用程序時(shí),開(kāi)發(fā)人員可以轉(zhuǎn)向公司自己的庫(kù)。

Arm Compute Library開(kāi)發(fā)用于支持Arm Cortex-A系列MCU,提供了一整套實(shí)現(xiàn)CNN的功能。和其他機(jī)器學(xué)習(xí)算法。對(duì)于Arm Cortex-M系列MCU,Arm Cortex微控制器軟件接口標(biāo)準(zhǔn)(CMSIS)包括神經(jīng)網(wǎng)絡(luò)(NN)庫(kù)。正如CMSIS-DSP擴(kuò)展用于DSP應(yīng)用的CMSIS一樣,CMSIS-NN提供機(jī)器學(xué)習(xí)功能,用于在基于Arm Cortex-M的平臺(tái)上實(shí)現(xiàn)流行的NN架構(gòu)。例如,使用CMSIS-NN庫(kù)在STMicroelectronics NUCLEO-F746ZG開(kāi)發(fā)板上實(shí)現(xiàn)CNN,該開(kāi)發(fā)板是基于STMicroelectronics Arm Cortex-M7的STM32F746ZG MCU構(gòu)建的。

用CMSIS實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)-NN,開(kāi)發(fā)人員可以從TensorFlow或其他框架導(dǎo)入現(xiàn)有模型?;蛘?,他們可以通過(guò)一系列CMSIS-NN函數(shù)調(diào)用本地實(shí)現(xiàn)CNN。例如,為了實(shí)現(xiàn)能夠處理行業(yè)標(biāo)準(zhǔn)CIFAR-10標(biāo)記圖像數(shù)據(jù)集的CNN,開(kāi)發(fā)人員將逐層構(gòu)建模型,類(lèi)似于之前針對(duì)Keras所示的方法。在這種情況下,CNN層實(shí)現(xiàn)為一系列CMSIS-NN函數(shù)調(diào)用。最終的softmax層產(chǎn)生CIFAR-10所需的10個(gè)輸出神經(jīng)元(清單4)。

復(fù)制 int main(){。 。 。//conv1 img_buffer2 - > img_buffer1 arm_convolve_HWC_q7_RGB(img_buffer2,CONV1_IM_DIM,CONV1_IM_CH,conv1_wt,CONV1_OUT_CH,CONV1_KER_DIM,CONV1_PADDING,CONV1_STRIDE,conv1_bias,CONV1_BIAS_LSHIFT,CONV1_OUT_RSHIFT,img_buffer1,CONV1_OUT_DIM,(q15_t *)col_buffer,NULL); arm_relu_q7(img_buffer1,CONV1_OUT_DIM * CONV1_OUT_DIM * CONV1_OUT_CH);//pool1 img_buffer1 - > img_buffer2 arm_maxpool_q7_HWC(img_buffer1,CONV1_OUT_DIM,CONV1_OUT_CH,POOL1_KER_DIM,POOL1_PADDING,POOL1_STRIDE,POOL1_OUT_DIM,NULL,img_buffer2);//CONV2 img_buffer2 - > img_buffer1 arm_convolve_HWC_q7_fast(img_buffer2,CONV2_IM_DIM,CONV2_IM_CH,conv2_wt,CONV2_OUT_CH,CONV2_KER_DIM,CONV2_PADDING,CONV2_STRIDE,conv2_bias,CONV2_BIAS_LSHIFT,CONV2_OUT_RSHIFT,img_buffer1,CONV2_OUT_DIM,(q15_t *)col_buffer,NULL); arm_relu_q7(img_buffer1,CONV2_OUT_DIM * CONV2_OUT_DIM * CONV2_OUT_CH);//POOL2 img_buffer1 - > img_buffer2 arm_maxpool_q7_HWC(img_buffer1,CONV2_OUT_DIM,CONV2_OUT_CH,POOL2_KER_DIM,POOL2_PADDING,POOL2_STRIDE,POOL2_OUT_DIM,col_buffer,img_buffer2);//conv3 img_buffer2 - > img_buffer1 arm_convolve_HWC_q7_fast(img_buffer2,CONV3_IM_DIM,CONV3_IM_CH,conv3_wt,CONV3_OUT_CH,CONV3_KER_DIM,CONV3_PADDING ,CONV3_STRIDE,conv3_bias,CONV3_BIAS_LSHIFT,CONV3_OUT_RSHIFT,img_buffer1,CONV3_OUT_DIM,(q15_t *)col_buffer,NULL); arm_relu_q7(img_buffer1,CONV3_OUT_DIM * CONV3_OUT_DIM * CONV3_OUT_CH);//pool3 img_buffer-> img_buffer2 arm_maxpool_q7_HWC(img_buffer1,CONV3_OUT_DIM,CONV3_OUT_CH,POOL3_KER_DIM,POOL3_PADDING,POOL3_STRIDE,POOL3_OUT_DIM,col_buffer,img_buffer2); arm_fully_connected_q7_opt(img_buffer2,ip1_wt,IP1_DIM,IP1_OUT,IP1_BIAS_LSHIFT,IP1_OUT_RSHIFT,ip1_bias,output_data,(q15_t *)img_buffer1); arm_softmax_q7(output_data,10,output_data); for(int i = 0; i <10; i ++){printf(“%d:%d n”,i,output_data [i]); } return 0;}

清單4:在Arm示例CIFAR-10應(yīng)用程序的這個(gè)片段中,主例程說(shuō)明了用于構(gòu)建CIFAR10目標(biāo)卷積神經(jīng)網(wǎng)絡(luò)的一系列調(diào)用。 Arm Cortex微控制器軟件接口標(biāo)準(zhǔn)(CMSIS)神經(jīng)網(wǎng)絡(luò)(NN)庫(kù)。 (代碼來(lái)源:Arm)

通用平臺(tái)缺乏資源來(lái)提供基于GPU的系統(tǒng)可能的推理性能。結(jié)果,這些平臺(tái)通常不能可靠地支持以維持無(wú)閃爍外觀所需的通常幀速率操作的任何類(lèi)型的“實(shí)時(shí)”視頻推斷。即便如此,上述CMSIS-NN CIFAR-10模型可以實(shí)現(xiàn)大約每秒10的推理速度,這可能足夠快以支持需要有限更新速率的相對(duì)簡(jiǎn)單的應(yīng)用程序。

持續(xù)發(fā)展簡(jiǎn)化的模型,如MobileNet和TensorFlow Lite和Facebook的Caffe2Go等框架,為物聯(lián)網(wǎng)和其他連接應(yīng)用的資源受限設(shè)備實(shí)現(xiàn)機(jī)器學(xué)習(xí)提供了更多選擇。

結(jié)論

機(jī)器學(xué)習(xí)應(yīng)用程序遵循典型的數(shù)據(jù)準(zhǔn)備和培訓(xùn)開(kāi)發(fā)模式,在不同的目標(biāo)平臺(tái)上保持概念上的一致性。因此,開(kāi)發(fā)人員可以使用低成本開(kāi)發(fā)板快速獲得實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的經(jīng)驗(yàn)。

隨著機(jī)器學(xué)習(xí)庫(kù)和針對(duì)這些板優(yōu)化的框架的可用性,開(kāi)發(fā)人員可以使用諸如Raspberry之類(lèi)的板Pi 3或STMicroelectronics NUCLEO-F746ZG實(shí)現(xiàn)了有效的機(jī)器學(xué)習(xí)推理引擎,能夠?yàn)榫哂羞m度要求的應(yīng)用提供有用的結(jié)果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10778

    瀏覽量

    210487
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4637

    瀏覽量

    128464
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3226

    瀏覽量

    57511
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8325

    瀏覽量

    132194
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何在Raspberry Pi安裝TensorFlow

     在本教程中,我們將學(xué)習(xí)何在 Raspberry Pi 安裝 TensorFlow,并將展示一些在預(yù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)上進(jìn)行簡(jiǎn)單圖像分類(lèi)的示例
    發(fā)表于 09-01 16:35 ?2136次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b>安裝TensorFlow

    何在Raspbian設(shè)置沒(méi)有顯示器和鍵盤(pán)的Raspberry Pi

    在本教程中,我們將了解如何在新安裝的 Raspbian 設(shè)置沒(méi)有顯示器和鍵盤(pán)的 Raspberry Pi。
    發(fā)表于 09-22 16:31 ?1579次閱讀
    如<b class='flag-5'>何在</b>Raspbian<b class='flag-5'>上</b>設(shè)置沒(méi)有顯示器和鍵盤(pán)的<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>

    如何使用Raspberry Pi3和藍(lán)牙構(gòu)建遙控汽車(chē)

    今天我們將使用Raspberry Pi 3和藍(lán)牙構(gòu)建遙控汽車(chē),在這里我們將使用智能手機(jī)作為遙控器來(lái)控制汽車(chē)。
    的頭像 發(fā)表于 11-21 17:14 ?2402次閱讀
    如何使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi3</b>和藍(lán)牙<b class='flag-5'>構(gòu)建</b>遙控汽車(chē)

    Raspberry Pi 33 b +的Android Pie 9.0

    Android Pie 9.0。在這個(gè)視頻中,我將向您展示如何在最新的Android版本的raspberry pi 3安裝android
    發(fā)表于 09-29 14:28

    使用計(jì)算庫(kù)在Raspberry PI和HiKey 960分析AlexNet

    的 AlexNet 樣板應(yīng)用。 Arm 機(jī)器學(xué)習(xí)(ML) 平臺(tái), 啟用新的應(yīng)用程序和能力。 您必須監(jiān)測(cè)軟件的性能, 以確保算法和應(yīng)用程序能提供極好的用戶經(jīng)驗(yàn)。 您可以使用 Arm 精簡(jiǎn)
    發(fā)表于 08-29 08:05

    raspberry pi官網(wǎng)

    Raspberry Pi 宣布推出新的鏡像實(shí)用程序 Raspberry Pi Imager,以提供一種更簡(jiǎn)單的方法,將操作系統(tǒng)輕松鏡像到 m
    的頭像 發(fā)表于 03-07 10:16 ?5890次閱讀

    Eyer1951正在使用帶有節(jié)拍檢測(cè)應(yīng)用程序Raspberry Pi 3 B +

    Eyer1951正在使用帶有節(jié)拍檢測(cè)應(yīng)用程序Raspberry Pi 3 B +,該應(yīng)用程序稱(chēng)為DBNBeatTracker。Eyer19
    的頭像 發(fā)表于 10-28 15:45 ?1502次閱讀

    Raspberry Pi安裝Android的方法

    Raspberry Pi 中使用的流行操作系統(tǒng)是 Raspbian,它是一個(gè)基于 linux 的 Raspberry Pi 官方操作系統(tǒng),我們使用它
    的頭像 發(fā)表于 09-05 15:10 ?1.8w次閱讀
    在<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b>安裝Android的方法

    使用Raspberry Pi的OpenCV庫(kù)構(gòu)建人臉識(shí)別系統(tǒng)

    在本教程中,我們將學(xué)習(xí)如何使用 Raspberry Pi 的 OpenCV 庫(kù)構(gòu)建我們自己的人臉識(shí)別系統(tǒng)。將此系統(tǒng)安裝在便攜式
    發(fā)表于 09-07 15:48 ?1157次閱讀
    使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b>的OpenCV庫(kù)<b class='flag-5'>構(gòu)建</b>人臉識(shí)別系統(tǒng)

    何在Raspberry Pi 3安裝OpenCV4庫(kù)

    今天我們將學(xué)習(xí)何在 Raspberry Pi 3 安裝 OpenCV4 庫(kù),以便我們可以將其
    的頭像 發(fā)表于 09-08 16:09 ?1551次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> <b class='flag-5'>3</b><b class='flag-5'>上</b>安裝OpenCV4庫(kù)

    Raspberry Pi Zero便攜終端的構(gòu)建

    電子發(fā)燒友網(wǎng)站提供《Raspberry Pi Zero便攜終端的構(gòu)建.zip》資料免費(fèi)下載
    發(fā)表于 01-05 10:43 ?0次下載
    <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> Zero便攜終端的<b class='flag-5'>構(gòu)建</b>

    基于Raspberry PI應(yīng)用程序的典型場(chǎng)景家庭自動(dòng)化

    電子發(fā)燒友網(wǎng)站提供《基于Raspberry PI應(yīng)用程序的典型場(chǎng)景家庭自動(dòng)化.zip》資料免費(fèi)下載
    發(fā)表于 06-13 11:05 ?0次下載
    基于<b class='flag-5'>Raspberry</b> <b class='flag-5'>PI</b>的<b class='flag-5'>應(yīng)用程序</b>的典型場(chǎng)景家庭自動(dòng)化

    何在Raspberry Pi零2W阻止帶有Pi孔的廣告

    電子發(fā)燒友網(wǎng)站提供《如何在Raspberry Pi零2W阻止帶有Pi孔的廣告.zip》資料免費(fèi)下載
    發(fā)表于 06-14 10:38 ?0次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>零2W<b class='flag-5'>上</b>阻止帶有<b class='flag-5'>Pi</b>孔的廣告

    使用Raspberry Pi進(jìn)行機(jī)器學(xué)習(xí)智能庫(kù)存跟蹤

    電子發(fā)燒友網(wǎng)站提供《使用Raspberry Pi進(jìn)行機(jī)器學(xué)習(xí)智能庫(kù)存跟蹤.zip》資料免費(fèi)下載
    發(fā)表于 06-26 11:02 ?0次下載
    使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>進(jìn)行<b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>智能庫(kù)存跟蹤

    使用Raspberry Pi來(lái)托管服務(wù)應(yīng)用程序以及運(yùn)行客戶端程序

    電子發(fā)燒友網(wǎng)站提供《使用Raspberry Pi來(lái)托管服務(wù)應(yīng)用程序以及運(yùn)行客戶端程序.zip》資料免費(fèi)下載
    發(fā)表于 07-04 10:12 ?0次下載
    使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>來(lái)托管服務(wù)<b class='flag-5'>應(yīng)用程序</b>以及運(yùn)行客戶端<b class='flag-5'>程序</b>