之前帶大家一起使用Keras訓(xùn)練了一個(gè)GRU模型,并使用mnist的手寫字體數(shù)據(jù)集進(jìn)行了驗(yàn)證。本期小編將繼續(xù)帶來一篇擴(kuò)展,即GRU模型的測試方法。盡管我們將其當(dāng)作和CNN類似的方式,一次性傳給他固定長度的數(shù)據(jù),但在具體實(shí)現(xiàn)上來說,還是另有門道的。讓我們慢慢講來。
首先回顧前面我們最終訓(xùn)練并導(dǎo)出的測試模型:
注意紅色標(biāo)注的位置,這就是一個(gè)典型的GRU節(jié)點(diǎn):
模型的輸入是28*28,代表的含義是:時(shí)間步*特征維度,簡單來說,就是一次性送入模型多久的數(shù)據(jù),即時(shí)間步實(shí)際上是一個(gè)時(shí)間單位。例如,我們想測試1s的數(shù)據(jù)進(jìn)行檢測。那么可以將其提取出來10*28的特征向量,那么每一個(gè)特征代表的就是1s/10即100ms的音頻特征。了解了時(shí)間步,再回到模型本身,這里就是其中一種模型推理形式。即一次性將所有的數(shù)據(jù)都送進(jìn)去,即1s對應(yīng)的特征數(shù)據(jù)。然后計(jì)算得出一個(gè)結(jié)果。好處是:所見所得,和CNN類似,缺點(diǎn)是:必須等待1s數(shù)據(jù),且循環(huán)time_step次。
那有沒有替代方案呢?當(dāng)然,那就是小編要提到的另一種,我們在導(dǎo)出模型時(shí)候?qū)ime_step設(shè)置為1,并且設(shè)置stateful=True,同時(shí)將time_step=N的模型權(quán)重設(shè)置到新模型上。這里的stateful=True要注意,因?yàn)槲覀儗⒅斑B續(xù)的time_step拆成了獨(dú)立的,因此需要讓模型記住前一次的中間狀態(tài)。
可能這里大家有些疑問,為什么兩個(gè)模型time_step不同,權(quán)重竟然通用。這就要說GRU模型的特殊性了,我們剛才看到的被展開的小GRU節(jié)點(diǎn),其實(shí)是權(quán)重共享的。也就是說,不管展開多少次,他們的權(quán)重不會變(這個(gè)讀者可以打開模型自行查看驗(yàn)證)。因此,就可以用如下代碼生成新模型,并設(shè)置權(quán)重:
# 構(gòu)建新模型 new_model = Sequential() new_model.add(GRU(128, batch_input_shape=(1, 1, 28), unroll=True, stateful=True)) new_model.add(Dense(10, activation='softmax')) new_model.set_weights(model.get_weights()) |
讓我們看看模型的樣子:
是不是看起來非常清爽,請注意右下角那個(gè)AssignVariable,這個(gè)就是為了保存當(dāng)前狀態(tài),在下一次推理可以直接使用上一次的狀態(tài)。需要注意的是,由于模型輸入變成了一個(gè)time step,即1*28,在送入模型前,要注意一下。后續(xù)處理部分,依舊是FullyConnected+Softmax的形式,其他沒有改變,照常即可。
至此,所有關(guān)于GRU模型的介紹以及使用就全部講完了。MCU端的部署要靠大家自行體驗(yàn)了,因?yàn)槟P捅旧韺?shí)際上可以使用和CNN一樣的推理方案,只是內(nèi)部結(jié)構(gòu)不同而已,希望對大家有所幫助!
恩智浦致力于打造安全的連接和基礎(chǔ)設(shè)施解決方案,為智慧生活保駕護(hù)航。
-
mcu
+關(guān)注
關(guān)注
146文章
16922瀏覽量
349989 -
測試
+關(guān)注
關(guān)注
8文章
5113瀏覽量
126353 -
Gru
+關(guān)注
關(guān)注
0文章
12瀏覽量
7471 -
模型
+關(guān)注
關(guān)注
1文章
3121瀏覽量
48663 -
cnn
+關(guān)注
關(guān)注
3文章
350瀏覽量
22139
原文標(biāo)題:深入GRU:解鎖模型測試新維度
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論