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

用于訓(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)練的時候添加的三個隱含層一個激活層:

下一步提取每一步的參數(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。



下面直接用輸入圖片(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的值:

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

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