忘れそうな内容をメモしています

忘れっぽいのでメモ帳がわりに色々書いてます

kmodelの各レイヤの特徴量を可視化してみる

githubのMaixPy_scriptsに特徴量マップを可視化するサンプルコードが追加されていました。 github.com

コードはsipeed社のブログのこの記事とほぼ同じようです。判定結果を可視化するコードがgithubの方に無かったので追加してmaix bitで実行してみました。

f:id:shintarof:20200812151118j:plain
maix bitで実行してみた

特徴量マップを可視化する方法ですが、kpu.set_layersにレイヤーを指定して、kpu.forwardの結果をdraw_imageで表示するだけでOKなようです。
以下、fmap.pyのコードを一部抜粋します。

    #watch conv0
    a=kpu.set_layers(task, 1)
    fmap=kpu.forward(task,img2)     #run neural network model
    for i in range(0,16):
        tmp=kpu.fmap(fmap,i)
        tmpx2=tmp.resize(14*2,14*2) #scale to display
        a=img_lcd.draw_image(tmpx2,(i%8)*14*2,28*2+14*2*int(i/8))

ちなみにレイヤーですが、kpu.netinfo(task)で確認することができます。
詳しくはmaixpyのここに書いてありました。
fmap.pyと同じ階層にうpされていたmnist.kmodelを見てみました。

layer[0]: KL_K210_CONV, 788 bytes
layer[1]: KL_K210_CONV, 5376 bytes
layer[2]: KL_DEQUANTIZE, 24 bytes
layer[3]: KL_TENSORFLOW_FLATTEN, 24 bytes
layer[4]: KL_FULLY_CONNECTED, 200856 bytes
layer[5]: KL_QUANTIZE, 24 bytes
layer[6]: KL_K210_ADD_PADDING, 16 bytes
layer[7]: KL_K210_CONV, 784 bytes
layer[8]: KL_K210_REMOVE_PADDING, 16 bytes
layer[9]: KL_DEQUANTIZE, 24 bytes
layer[10]: KL_SOFTMAX, 16 bytes
[{"index":0, "type":KL_K210_CONV, "wi":28, "hi":28, "wo":14, "ho":14, "chi":1, "cho":16, "dw":0, "kernel_type":1, "pool_type":1, "para_size":144}, {"index":1, "type":KL_K210_CONV, "wi":14, "hi":14, "wo":7, "ho":7, "chi":16, "cho":32, "dw":0, "kernel_type":1, "pool_type":1, "para_size":4608}, {"index":2, "type":KL_DEQUANTIZE, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":24}, {"index":3, "type":KL_TENSORFLOW_FLATTEN, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":24}, {"index":4, "type":KL_FULLY_CONNECTED, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":200856}, {"index":5, "type":KL_QUANTIZE, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":24}, {"index":6, "type":KL_K210_ADD_PADDING, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":16}, {"index":7, "type":KL_K210_CONV, "wi":4, "hi":4, "wo":4, "ho":4, "chi":32, "cho":10, "dw":0, "kernel_type":0, "pool_type":0, "para_size":320}, {"index":8, "type":KL_K210_REMOVE_PADDING, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":16}, {"index":9, "type":KL_DEQUANTIZE, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":24}, {"index":10, "type":KL_SOFTMAX, "wi":0, "hi":0, "wo":0, "ho":0, "chi":0, "cho":0, "dw":0, "kernel_type":0, "pool_type":0, "para_size":16}]

set_layersで指定する番号はnetinfoでlayer[n]表示される番号に1を足した値を指定する必要がありそうです。