[2]mlp模型參數(shù)提取

本文主要記錄適用keras的mlp神經(jīng)網(wǎng)絡(luò)訓(xùn)練數(shù)字識別模型,提取層隱含層的參數(shù)。然后直接用這些參數(shù)來計算,預(yù)測一張數(shù)字圖片。
首先看計算過程,輸入是一張數(shù)字圖片。27 * 19的灰度圖。由于mlp模型是全連接的。這里我們直接把輸入展開成一個1 * 513的向量。分別用輸入矩陣乘以訓(xùn)練出來的參數(shù)矩陣。


gongsi.png

用于訓(xùn)練的mlp模型非常簡單就幾行代碼,三個隱含層一個激活層

model = Sequential()
model.add(Dense(513, 128))
model.add(Dense(128, 32))
model.add(Dense(32, 10))
model.add(Activation('softmax'))

訓(xùn)練完的模型包含兩個文件。一個是模型,一個是參數(shù)。
首先直接加載模型

model = keras.models.model_from_json(open('my_model_json_str.json').read())
model.load_weights('my_model_weights.h5')

獲取模型中的model.layers
debug模式下可以看到,加載出來的layers就是剛才訓(xùn)練的時候添加的三個隱含層一個激活層:


layers.png

下一步提取每一步的參數(shù):

for layer in model.layers:
    weights = layer.get_weights()

因為這個層次比較少,自己也知道有多少層。直接可以這么拿

weight1 = layers[0].get_weights() #包含一個513 * 128的矩陣,和一個1 * 128的向量         
weight2 = layers[1].get_weights() #包含一個128 * 32的矩陣,和一個1 * 32的向量         
weight3 = layers[2].get_weights() #包含一個32 * 10的矩陣,和一個1 * 10的向量         

debug模式下,可以看到每個weight實際上有兩個元素
一個是矩陣,另一個是一個一維向量。也就是最上面那個公式中的W和b。


weight1.png

weight2.png

weight3.png

下面直接用輸入圖片(1 * 513),乘以weight1+b1的到的結(jié)果(1 * 128的矩陣),把這個結(jié)果再乘以第二層weight2+b2,得到的結(jié)果(1 * 32的矩陣)再乘以第三層weight3+b3
得到的結(jié)果即逝最終預(yù)測結(jié)果的向量(1 * 10)。

re1 = np.dot(image,weight11)+weight1[1]
re2 = np.dot(re1,weight21)+weight2[1]
re3 = np.dot(re2,weight31)+weight3[1]

debug模式下查看re3的值:


yuce0.png

十個元素中最大的是第0個,6021。也就是說用這個模型預(yù)測的結(jié)果是0.
實際上用keras自帶的預(yù)測函數(shù)預(yù)測,得到的最終結(jié)果也是一致的。只是它的結(jié)果做了歸一化處理。


modelpredict.png

到這一步,keras訓(xùn)練模型遷移至c++ 或者是java application基本上已經(jīng)算是完成了一大半,下面就是搬磚活了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容