FC2カウンター FPGAの部屋 2018年06月02日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

TensorFlow + Kerasを使ってみた11(全結合層の重みをC のヘッダに変換)

TensorFlow + Kerasを使ってみた10(バイアスをC のヘッダに変換)”の続き。

前回は、畳み込み層、全結合層1層目、全結合層2層目のバイアスをC のヘッダファイルに変換した。今回は全結合層1層目、2層目の重みをC のヘッダに変換しよう。

まずは、全結合層1層目、2層目の重みをC のヘッダに変換する fwrite_af_weight() を示す。

# 全結合層の重みをCヘッダファイルに書き出す
# 2018/05/31 by marsee

def fwrite_af_weight(weight, wfile_name, float_wt_name, fixed_wt_name, MAGNIFICATION):
    import datetime
    import numpy as np
    
    f = open(wfile_name, 'w')
    todaytime = datetime.datetime.today()
    f.write('// '+wfile_name+'\n')
    strdtime = todaytime.strftime("%Y/%m/%d %H:%M:%S")
    f.write('// {0} by marsee\n'.format(strdtime))
    f.write("\n")
    
    f.write('const float '+float_wt_name+'['+str(weight.shape[0])+']['+str(weight.shape[1])+'] = {\n')
    for i in range(weight.shape[0]):
        f.write("\t{")
        for j in range(weight.shape[1]):
            f.write(str(weight[i][j]))
            if (j==weight.shape[1]-1):
                if (i==weight.shape[0]-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
    f.write("};\n")

    f.write("\n")
    f.write('const ap_fixed<'+str(int(np.log2(MAGNIFICATION))+1)+', 1, AP_TRN_ZERO, AP_SAT> '+fixed_wt_name+'['+str(weight.shape[0])+']['+str(weight.shape[1])+'] = {\n')
    for i in range(weight.shape[0]):
        f.write("\t{")
        for j in range(weight.shape[1]):
            w_int = int(weight[i][j]*MAGNIFICATION+0.5)
            if (w_int > MAGNIFICATION-1):
                w_int = MAGNIFICATION-1
            elif (w_int < -MAGNIFICATION):
                w_int = -MAGNIFICATION
            f.write(str(float(w_int)/float(MAGNIFICATION)))
            if (j==weight.shape[1]-1):
                if(i==weight.shape[0]-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
    f.write("};\n")

    f.close()


全結合層1層目の重みを af1_weight10.h に出力する。
(2018/06/06 :修正 全結合層の1層目の重みの配列数は (1440, 100) だが、1440 の内訳は処理された画像の高さ (12)、画像の幅 (12) 、チャネル数 (10) の配列だった。想定してる配列の順番は、チャネル数 (10) 、画像の高さ (12)、画像の幅 (12) なので、重みの配列の順番を入れ替える必要がある)

fwrite_af_weight(dence_layer1_weight, 'af1_weight10.h', 'af1_fweight', 'af1_weight', MAGNIFICATION_AF)
MAGNIFICATION_AF = 2 ** (9-1)
print(dence_layer1_weight.shape)
dence_Layer1_w12_12_10_100 = np.reshape(dence_layer1_weight,(12,12,10,100))
dence_Layer1_w201 = dence_Layer1_w12_12_10_100.transpose(2,0,1,3)
dence_Layer1_w1440_100 = np.reshape(dence_Layer1_w201,(1440,100))
fwrite_af_weight(dence_Layer1_w1440_100, 'af1_weight10.h', 'af1_fweight', 'af1_weight', MAGNIFICATION_AF)


af1_weight10.h の一部を画像を貼っておく。とても大きいので、全部ブログに貼れないからだ。
tensorflow_keras_51_180601.png
tensorflow_keras_52_180601.png

全結合層2層目の重みを af2_weight10.h に出力する。

fwrite_af_weight(dence_layer2_weight, 'af2_weight10.h', 'af2_fweight', 'af2_weight', MAGNIFICATION_AF)


af2_weight10.h の一部を画像を貼っておく。
tensorflow_keras_53_180601.png
tensorflow_keras_54_180601.png
  1. 2018年06月02日 04:50 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0