本文主要記錄適用keras的mlp神經網絡訓練數(shù)字識別模型役耕,提取層隱含層的參數(shù)缩赛。然后直接用這些參數(shù)來計算耙箍,預測一張數(shù)字圖片。
首先看計算過程酥馍,輸入是一張數(shù)字圖片辩昆。27 * 19的灰度圖。由于mlp模型是全連接的旨袒。這里我們直接把輸入展開成一個1 * 513的向量汁针。分別用輸入矩陣乘以訓練出來的參數(shù)矩陣。
用于訓練的mlp模型非常簡單就幾行代碼,三個隱含層一個激活層
model = Sequential()
model.add(Dense(513, 128))
model.add(Dense(128, 32))
model.add(Dense(32, 10))
model.add(Activation('softmax'))
訓練完的模型包含兩個文件砚尽。一個是模型施无,一個是參數(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就是剛才訓練的時候添加的三個隱含層一個激活層:
下一步提取每一步的參數(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的到的結果(1 * 128的矩陣)曼振,把這個結果再乘以第二層weight2+b2,得到的結果(1 * 32的矩陣)再乘以第三層weight3+b3
得到的結果即逝最終預測結果的向量(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。也就是說用這個模型預測的結果是0.
實際上用keras自帶的預測函數(shù)預測木羹,得到的最終結果也是一致的甲雅。只是它的結果做了歸一化處理。
到這一步坑填,keras訓練模型遷移至c++ 或者是java application基本上已經算是完成了一大半抛人,下面就是搬磚活了