FC2カウンター FPGAの部屋 TensorFlow, Keras
FC2ブログ

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

FPGAの部屋

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

TensorFlow + Kerasを使ってみた12(MNISTのデータの一部をC のヘッダに変換)

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

前回は全結合層1層目、2層目の重みをC のヘッダに変換した。今回は、MNISTのデータの一部をC のヘッダに変換してみよう。これは、Vivado HLS のC シミュレーション時に精度を確認するためのデータとなる。

MNISTのデータの一部をC のヘッダに変換するPython コードを示す。
(2018/06/05:修正 MNIST のデータを見ると 1.0 つまり 256 のデータが存在する。これは 8 ビット長のビット表現では、 0 になってしまうことが考えられるので、Python コードを修正した)

# MNISTのデータをCの配列に出力し、ファイルに書き込み

# coding: utf-8
import sys, os
sys.path.append(os.pardir)

import numpy as np
import datetime

OUTPUT_DATA_NUM = 300 # 出力するMNISTのテストデータ数 10000までの数
OFFSET = 0 # MNISTデータセットのオフセット、100だったら100番目からOUTPUT_DATA_NUM個を出力する

# データの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 256
x_test /= 256

print(x_test.shape)

f = open("mnist_data.h", 'w')
todaytime = datetime.datetime.today()
f.write('// mnist_data.h\n')
strdtime = todaytime.strftime("%Y/%m/%d %H:%M:%S")
f.write('// {0} by marsee\n'.format(strdtime))
f.write("\n")

f.write('ap_ufixed<8, 0, AP_TRN, AP_WRAP> x_test['+str(OUTPUT_DATA_NUM)+']['+str(x_test.shape[1]*x_test.shape[2])+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write("\t{")
    for j in range(x_test.shape[1]):
        for k in range(x_test.shape[2]):
            if (x_test[i][j][k] == 1.0):
                x_test[i][j][k] = x_test[i][j][k] * 256
                x_test[i][j][k] = (x_test[i][j][k]-1)/256
            f.write(str(x_test[i][j][k]))
            if (j==x_test.shape[1]-1 and k==x_test.shape[2]-1):
                if (i==OFFSET+OUTPUT_DATA_NUM-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
f.write("};\n")

f.write('int x_test_256['+str(OUTPUT_DATA_NUM)+']['+str(x_test.shape[1]*x_test.shape[2])+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write("\t{")
    for j in range(x_test.shape[1]):
        for k in range(x_test.shape[2]):
            f.write(str(int(x_test[i][j][k]*256)))
            if (j==x_test.shape[1]-1 and k==x_test.shape[2]-1):
                if (i==OFFSET+OUTPUT_DATA_NUM-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
f.write("};\n")

f.write("\n")
f.write('int y_test['+str(OUTPUT_DATA_NUM)+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write(str(y_test[i]))
    if (i==OFFSET+OUTPUT_DATA_NUM-1):
        f.write("};\n")
    else:
        f.write(", ")
        
f.close() 


このPython コードを実行すると mnist_data.h が生成される。
mnist_data.h の一部を示す。
tensorflow_keras_55_180604.png
tensorflow_keras_56_180604.png
tensorflow_keras_57_180604.png

出力されたMNIST のデータが正しいかどうか?を確かめてみた。
x_test256[300][784] のデータをLibreOffice Calc で 28 x 28 に並べみた。
tensorflow_keras_58_180605.png

少しデータが余ってしまったが、7 に見える。
y_test[300] を見ても、最初の数は 7 なので、mnist_data.h は正しいようだ。
  1. 2018年06月04日 05:26 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

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

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

TensorFlow + Kerasを使ってみた9(畳み込み層の重みをC のヘッダに変換)”の続き。

前回は、畳み込み層の重みをC のヘッダに変換した。今回は、畳み込み層、全結合層1層目、全結合層2層目のバイアスをC のヘッダファイルに変換する。
なお、量子化の精度の評価はまだできていないので、以前に使用した量子化ビット幅を使ってやってみよう。

最初に、バイアスをC のヘッダファイルに変換する関数の fwrite_bias() を示す。

# 畳み込み層と全結合層のバイアスをCヘッダファイルに書き出す
# 2018/05/31 by marsee

def fwrite_bias(bias, wfile_name, float_b_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_b_name+'['+str(bias.shape[0])+'] = {\n\t')
    for i in range(bias.shape[0]):
        f.write(str(bias[i]))
        if (i < bias.shape[0]-1):
            f.write(", ")
    f.write("\n};\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(bias.shape[0])+'] = {\n\t')
    for i in range(bias.shape[0]):
        b_int = int(bias[i]*MAGNIFICATION+0.5)
        if (b_int > MAGNIFICATION-1):
            b_int = MAGNIFICATION-1
        elif (b_int < -MAGNIFICATION):
            b_int = -MAGNIFICATION
        f.write(str(float(b_int)/float(MAGNIFICATION)))
        if (i < bias.shape[0]-1):
            f.write(", ")
    f.write("\n};\n")

    f.close()


バイアスをC のヘッダファイルに出力する。

fwrite_bias(conv_layer_bias, 'conv1_bias10.h', 'conv1_fbias', 'conv1_bias', MAGNIFICATION_CONV)


MAGNIFICATION_AF = 2 ** (9-1)
fwrite_bias(dence_layer1_bias, 'af1_bias10.h', 'af1_fbias', 'af1_bias', MAGNIFICATION_AF)


fwrite_bias(dence_layer2_bias, 'af2_bias10.h', 'af2_fbias', 'af2_bias', MAGNIFICATION_AF)


畳み込み層のC ヘッダファイル conv1_bias10.h を示す。

// conv1_bias10.h
// 2018/05/30 05:00:50 by marsee

const float conv1_fbias[10] = {
 -0.007222185, 0.0038653917, -0.10034832, -0.102261335, -0.007837055, -0.0026648666, -0.15441592, -0.17244887, 0.0006733343, -0.17412803
};

const ap_fixed<9, 1, AP_TRN_ZERO, AP_SAT> conv1_bias[10] = {
 -0.00390625, 0.00390625, -0.09765625, -0.09765625, -0.00390625, 0.0, -0.15234375, -0.16796875, 0.0, -0.171875
};


全結合層1層目のC ヘッダファイル af1_bias10.h を示す。

// af1_bias10.h
// 2018/06/01 04:44:24 by marsee

const float af1_fbias[100] = {
 0.019238321, -0.01771137, -0.026059965, -0.010412146, 0.016551534, 0.07084589, -0.020174462, -0.03186624, 0.009918453, -0.0005349776, -0.03642758, 0.005985915, -0.02327196, -0.0062365746, -0.04722478, -0.015795827, 0.031737898, 0.033591818, 0.039311368, 0.062911175, -0.033230793, -0.015483118, 0.010640073, -0.008249342, 0.03172312, -0.057140794, -0.061525248, -0.0142213, 0.04127987, -0.020516558, 0.04062112, -0.00087091, -0.0095176855, 0.0044661723, -0.012458612, -0.0047280258, 0.035344347, 0.0032061578, 0.05681947, -0.0026758113, 0.02949447, -0.004827402, 0.03566772, 0.04697614, 0.04577419, -0.020583214, 0.013479586, -0.054213677, 0.066026285, -0.006469002, 0.015176552, 0.003240489, -0.033093527, -0.043891124, 0.016665407, -0.003594259, 0.030643634, 0.08290552, 0.0020669047, -0.015035913, 0.05790131, 0.053463947, 0.10505945, 0.0014302151, 0.022453506, 0.016916182, -0.034298472, -0.017455893, -0.03765105, -0.039369643, -0.0095089385, -0.04399201, -0.021653317, -0.043070063, 0.062387593, 0.02000768, 0.06076118, 0.008908279, -0.052377164, 0.036777783, -0.0069501484, -0.04945799, 0.066166185, -0.049473558, -0.0031864739, 0.06794129, 0.0066950982, -0.04975326, 0.030130928, 0.011892647, 0.029019792, 0.0011624178, -0.00398671, -0.0360224, 0.013510628, -0.014131005, -0.007958779, -0.0017996833, 0.026189724, 0.009352577
};

const ap_fixed<9, 1, AP_TRN_ZERO, AP_SAT> af1_bias[100] = {
 0.01953125, -0.015625, -0.0234375, -0.0078125, 0.015625, 0.0703125, -0.015625, -0.02734375, 0.01171875, 0.0, -0.03125, 0.0078125, -0.01953125, -0.00390625, -0.04296875, -0.01171875, 0.03125, 0.03515625, 0.0390625, 0.0625, -0.03125, -0.01171875, 0.01171875, -0.00390625, 0.03125, -0.0546875, -0.05859375, -0.01171875, 0.04296875, -0.015625, 0.0390625, 0.0, -0.00390625, 0.00390625, -0.0078125, 0.0, 0.03515625, 0.00390625, 0.05859375, 0.0, 0.03125, 0.0, 0.03515625, 0.046875, 0.046875, -0.015625, 0.01171875, -0.05078125, 0.06640625, -0.00390625, 0.015625, 0.00390625, -0.02734375, -0.0390625, 0.015625, 0.0, 0.03125, 0.08203125, 0.00390625, -0.01171875, 0.05859375, 0.0546875, 0.10546875, 0.0, 0.0234375, 0.015625, -0.03125, -0.01171875, -0.03515625, -0.03515625, -0.00390625, -0.0390625, -0.01953125, -0.0390625, 0.0625, 0.01953125, 0.0625, 0.0078125, -0.046875, 0.03515625, -0.00390625, -0.046875, 0.06640625, -0.046875, 0.0, 0.06640625, 0.0078125, -0.046875, 0.03125, 0.01171875, 0.02734375, 0.0, 0.0, -0.03125, 0.01171875, -0.01171875, -0.00390625, 0.0, 0.02734375, 0.0078125
};


全結合層2層目のC ヘッダファイル af2_bias10.h を示す。

// af2_bias10.h
// 2018/06/01 04:43:44 by marsee

const float af2_fbias[10] = {
 -0.055489913, 0.074969545, -0.014903568, 0.0025154892, -0.031464603, 0.041022513, -0.0558837, -0.027120732, -0.034348655, -0.001718868
};

const ap_fixed<9, 1, AP_TRN_ZERO, AP_SAT> af2_bias[10] = {
 -0.05078125, 0.07421875, -0.01171875, 0.00390625, -0.02734375, 0.04296875, -0.05078125, -0.0234375, -0.03125, 0.0
};

  1. 2018年06月01日 05:53 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

TensorFlow + Kerasを使ってみた9(畳み込み層の重みをC のヘッダに変換)

TensorFlow + Kerasを使ってみた8(全結合層の統計情報)”の続き。

前回は、全結合層の最大値、最小値、絶対値の最大値、最小値、標準偏差などの統計情報を取得した。今回は、”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化3”で行った重みやバイアスを C ヘッダにするPython コードをKeras でうまく行くかどうか?を確かめてみよう。

まずは、畳み込み層の重みをC のヘッダに変換してみよう。
結論から言うと、一部キャストを追加したら畳み込み層の重みをC のヘッダに変換するPython コードが動作した。
畳み込み層の重みをC のヘッダに変換するPython コード fwrite_conv_weight を示す。

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

def fwrite_conv_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])+']['+str(weight.shape[2])+']['+str(weight.shape[3])+'] = \n{\n')
    for i in range(weight.shape[0]):
        f.write("\t{\n")
        for j in range(weight.shape[1]):
            f.write("\t\t{\n")
            for k in range(weight.shape[2]):
                f.write("\t\t\t{")
                for m in range(weight.shape[3]):
                    f.write(str(weight[i][j][k][m]))
                    if (m==weight.shape[3]-1):
                        f.write("}")
                    else:
                        f.write(",")
                
                if (k==weight.shape[2]-1):
                    f.write("\n\t\t}\n")
                else:
                    f.write(",\n")

            if (j==weight.shape[1]-1):
                f.write("\t}\n")
            else:
                f.write(",\n")
        
        
        if (i==weight.shape[0]-1):
            f.write("};\n")
        else:
            f.write("\t,\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])+']['+str(weight.shape[2])+']['+str(weight.shape[3])+'] = \n{\n')
    for i in range(weight.shape[0]):
        f.write("\t{\n")
        for j in range(weight.shape[1]):
            f.write("\t\t{\n")
            for k in range(weight.shape[2]):
                f.write("\t\t\t{")
                for m in range(weight.shape[3]):
                    w_int = int(weight[i][j][k][m]*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 (m==weight.shape[3]-1):
                        f.write("}")
                    else:
                        f.write(",")
                
                if (k==weight.shape[2]-1):
                    f.write("\n\t\t}\n")
                else:
                     f.write(",\n")

            if (j==weight.shape[1]-1):
                f.write("\t}\n")
            else:
                f.write(",\n")
        
        
        if (i==weight.shape[0]-1):
            f.write("};\n")
        else:
            f.write("\t,\n")
 
    f.close()


下に示すPython コードを実行すると畳み込み層の重みが conv1_weight10.h という C のヘッダファイルに出力される。
(2018/06/05:修正 畳み込み層の重みの配列は(カーネルサイズh,カーネルサイズw, 入力チャネル, 出力チャネル)ということなので、Pythonコードを修正した。@NORA__0013 さんありがとうございました。)

MAGNIFICATION_CONV = 2 ** (9-1)
fwrite_conv_weight(conv_layer_weight.transpose(3,2,0,1), 'conv1_weight10.h', 'conv1_fweight', 'conv1_weight', MAGNIFICATION_CONV)


conv1_weight10.h を貼っておく。

// conv1_weight10.h
// 2018/06/03 16:10:12 by marsee

const float conv1_fweight[10][1][5][5] = 
{
    {
        {
            {0.20261094,-0.07934965,-0.22467291,-0.43532223,-0.23157348},
            {-0.3398506,-0.33518496,-0.39792794,-0.08618319,0.16632372},
            {-0.5767307,-0.4275438,-0.072111405,0.3187846,0.2654636},
            {0.11835691,0.25123549,0.38731813,0.27912328,0.15583257},
            {0.13021287,0.38388866,0.24981308,0.022721838,-0.04710154}
        }
    }
    ,
    {
        {
            {-0.48611653,-0.6372757,-0.40548003,-0.33244497,-0.13435255},
            {0.15439186,-0.34480083,-0.56099683,-0.3915109,-0.41839477},
            {0.4068115,0.3836496,0.10779987,-0.1230321,-0.4722871},
            {0.3514016,0.3169199,0.32510042,0.2981098,-0.10132303},
            {0.16548221,0.2640638,0.3619229,0.35238296,0.113044925}
        }
    }
    ,
    {
        {
            {-0.13130069,0.18190795,0.15537558,-0.1676253,-0.14785497},
            {0.06223634,0.35684425,-0.112429045,-0.44136783,-0.10125857},
            {0.10510171,0.25642243,-0.2288756,-0.29937005,0.12721944},
            {0.021834752,0.008635783,0.040261764,-0.017128099,0.055860933},
            {-0.16628554,0.12985978,0.08550146,0.2620432,0.105794474}
        }
    }
    ,
    {
        {
            {0.15156339,0.4940948,0.22510909,0.19534814,0.24242142},
            {-0.20048767,0.3314954,0.45060343,0.116408214,0.054000396},
            {-0.5791418,-0.1274401,0.15244117,0.2987521,-0.008650972},
            {-0.65549827,-0.3982863,-0.23712645,-0.04862794,-0.030009096},
            {-0.25779864,-0.3313806,-0.025542857,0.04132852,0.12885101}
        }
    }
    ,
    {
        {
            {0.36471996,0.11910628,0.0868587,-0.26476386,-0.40310845},
            {0.35694337,0.07778469,0.1454417,-0.27914035,-0.43084973},
            {0.27650365,0.19447733,0.022587685,-0.4387378,-0.27778476},
            {0.35590482,0.060368076,-0.2499182,-0.33735904,-0.2462857},
            {0.13169082,-0.12147922,-0.19614659,-0.033236343,0.04993651}
        }
    }
    ,
    {
        {
            {-0.08484216,0.17010233,0.397805,0.18052064,-0.20084426},
            {0.19511358,0.2240115,0.23805015,-0.28208354,-0.30468363},
            {0.58113253,0.23622094,-0.1035163,-0.29351595,-0.2777929},
            {-0.12703945,-0.31102535,-0.45656392,-0.36484626,0.08292956},
            {-0.516542,-0.59745365,-0.34286296,0.064657405,-0.016369406}
        }
    }
    ,
    {
        {
            {-0.05747546,-0.025008501,0.2489682,0.0009843357,-0.31173185},
            {0.10129268,0.140934,0.18465307,-0.29655868,-0.3589846},
            {0.0927546,0.12933072,0.23520534,-0.13283624,-0.2216169},
            {0.01556351,0.19052765,0.26735055,-0.11904856,0.05286852},
            {-0.16821466,0.20077062,0.24849436,-0.027033936,-0.0066970563}
        }
    }
    ,
    {
        {
            {-0.46006405,-0.07625411,0.072767265,0.21414295,0.014650909},
            {-0.41662437,-0.01859824,0.20107509,0.14830865,0.08253051},
            {-0.26404095,-0.023522798,0.15815544,0.24796312,-0.08803863},
            {-0.27005908,0.030365303,0.3283318,0.015161242,0.014568055},
            {0.0034153308,0.10755768,0.23039222,-0.050392643,-0.17668988}
        }
    }
    ,
    {
        {
            {0.09082198,-0.033604637,0.113404974,0.20493641,0.14139216},
            {0.38919494,0.21474971,0.20264329,0.2751836,0.20002662},
            {0.33294797,0.37199846,0.37084493,0.10829608,0.17661056},
            {-0.5168951,-0.29824486,-0.32331055,-0.20219678,-0.22110288},
            {-0.62100536,-0.6191712,-0.5669018,-0.39315876,-0.28045934}
        }
    }
    ,
    {
        {
            {0.12587526,0.171594,0.19060391,-0.17589498,-0.2094244},
            {-0.013645746,0.22744659,0.12572204,-0.028848726,-0.37416157},
            {-0.2322505,-0.05975187,0.3344037,0.20712087,-0.084726445},
            {-0.14462651,-0.18951881,0.26089588,0.19588387,0.12522626},
            {-0.03129309,-0.2751198,-0.120508276,0.0149853965,0.06411268}
        }
    }
};

const ap_fixed<9, 1, AP_TRN, AP_WRAP> conv1_weight[10][1][5][5] = 
{
    {
        {
            {0.203125,-0.07421875,-0.22265625,-0.4296875,-0.2265625},
            {-0.3359375,-0.33203125,-0.39453125,-0.08203125,0.16796875},
            {-0.57421875,-0.421875,-0.06640625,0.3203125,0.265625},
            {0.1171875,0.25,0.38671875,0.27734375,0.15625},
            {0.12890625,0.3828125,0.25,0.0234375,-0.04296875}
        }
    }
    ,
    {
        {
            {-0.48046875,-0.6328125,-0.40234375,-0.328125,-0.12890625},
            {0.15625,-0.33984375,-0.55859375,-0.38671875,-0.4140625},
            {0.40625,0.3828125,0.109375,-0.1171875,-0.46875},
            {0.3515625,0.31640625,0.32421875,0.296875,-0.09765625},
            {0.1640625,0.265625,0.36328125,0.3515625,0.11328125}
        }
    }
    ,
    {
        {
            {-0.12890625,0.18359375,0.15625,-0.1640625,-0.14453125},
            {0.0625,0.35546875,-0.109375,-0.4375,-0.09765625},
            {0.10546875,0.2578125,-0.2265625,-0.296875,0.12890625},
            {0.0234375,0.0078125,0.0390625,-0.01171875,0.0546875},
            {-0.1640625,0.12890625,0.0859375,0.26171875,0.10546875}
        }
    }
    ,
    {
        {
            {0.15234375,0.4921875,0.2265625,0.1953125,0.2421875},
            {-0.1953125,0.33203125,0.44921875,0.1171875,0.0546875},
            {-0.57421875,-0.125,0.15234375,0.296875,-0.00390625},
            {-0.65234375,-0.39453125,-0.234375,-0.04296875,-0.02734375},
            {-0.25390625,-0.328125,-0.0234375,0.04296875,0.12890625}
        }
    }
    ,
    {
        {
            {0.36328125,0.1171875,0.0859375,-0.26171875,-0.3984375},
            {0.35546875,0.078125,0.14453125,-0.2734375,-0.42578125},
            {0.27734375,0.1953125,0.0234375,-0.43359375,-0.2734375},
            {0.35546875,0.05859375,-0.24609375,-0.33203125,-0.2421875},
            {0.1328125,-0.1171875,-0.19140625,-0.03125,0.05078125}
        }
    }
    ,
    {
        {
            {-0.08203125,0.171875,0.3984375,0.1796875,-0.1953125},
            {0.1953125,0.22265625,0.23828125,-0.27734375,-0.30078125},
            {0.58203125,0.234375,-0.1015625,-0.2890625,-0.2734375},
            {-0.125,-0.30859375,-0.453125,-0.359375,0.08203125},
            {-0.51171875,-0.59375,-0.33984375,0.06640625,-0.01171875}
        }
    }
    ,
    {
        {
            {-0.0546875,-0.01953125,0.25,0.0,-0.30859375},
            {0.1015625,0.140625,0.18359375,-0.29296875,-0.35546875},
            {0.09375,0.12890625,0.234375,-0.12890625,-0.21875},
            {0.015625,0.19140625,0.265625,-0.11328125,0.0546875},
            {-0.1640625,0.19921875,0.25,-0.0234375,-0.00390625}
        }
    }
    ,
    {
        {
            {-0.45703125,-0.07421875,0.07421875,0.21484375,0.015625},
            {-0.4140625,-0.015625,0.19921875,0.1484375,0.08203125},
            {-0.26171875,-0.01953125,0.15625,0.24609375,-0.0859375},
            {-0.265625,0.03125,0.328125,0.015625,0.015625},
            {0.00390625,0.109375,0.23046875,-0.046875,-0.171875}
        }
    }
    ,
    {
        {
            {0.08984375,-0.03125,0.11328125,0.203125,0.140625},
            {0.390625,0.21484375,0.203125,0.2734375,0.19921875},
            {0.33203125,0.37109375,0.37109375,0.109375,0.17578125},
            {-0.51171875,-0.29296875,-0.3203125,-0.19921875,-0.21875},
            {-0.6171875,-0.6171875,-0.5625,-0.390625,-0.27734375}
        }
    }
    ,
    {
        {
            {0.125,0.171875,0.19140625,-0.171875,-0.20703125},
            {-0.0078125,0.2265625,0.125,-0.0234375,-0.37109375},
            {-0.2265625,-0.0546875,0.3359375,0.20703125,-0.08203125},
            {-0.140625,-0.1875,0.26171875,0.1953125,0.125},
            {-0.02734375,-0.26953125,-0.1171875,0.015625,0.0625}
        }
    }
};

  1. 2018年05月31日 05:01 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

TensorFlow + Kerasを使ってみた8(全結合層の統計情報)

TensorFlow + Kerasを使ってみた7(畳み込み層の統計情報)”の続き。

前回は、畳み込み層の最大値、最小値、絶対値の最大値、最小値、標準偏差などの統計情報を取得した。今回は、全結合層の統計情報を取得しよう。
なお、使用するのは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。

全結合層1層目
畳み込み層同様に、model.summary() で取得した各層の情報を元に全結合層1層目の中間出力を取り出す。

# 1番目のDence layer1の中間出力を取り出す 
from keras.models import Model

dence_layer1_name = 'dense_5'

dence_layer1 = model.get_layer(dence_layer1_name)
dence_layer1_wb = dence_layer1.get_weights()

dence_layer1_model = Model(inputs=model.input,
                                 outputs=model.get_layer(dence_layer1_name).output)
dence_layer1_output = dence_layer1_model.predict(x_test, verbose=1)


表示を示す。

10000/10000 [==============================] - 2s 174us/step


重みとバイアスの配列の形状を取得した。

print(dence_layer1_weight.shape)
print(dence_layer1_bias.shape)

(1440, 100)
(100,)


全結合層1層目の重みとバイアスの最大値、最小値、絶対値の最大値、最小値を取得しよう。

print("np.max(dence_layer1_weight) = {0}".format(np.max(dence_layer1_weight)))
print("np.min(dence_layer1_weight) = {0}".format(np.min(dence_layer1_weight)))
abs_dence_layer1_weight = np.absolute(dence_layer1_weight)
print("np.max(abs_dence_layer1_weight) = {0}".format(np.max(abs_dence_layer1_weight)))
print("np.min(abs_dence_layer1_weight) = {0}".format(np.min(abs_dence_layer1_weight)))
print("np.max(dence_layer1_bias) = {0}".format(np.max(dence_layer1_bias)))
print("np.min(dence_layer1_bias) = {0}".format(np.min(dence_layer1_bias)))
abs_dence_layer1_bias = np.absolute(dence_layer1_bias)
print("np.max(abs_dence_layer1_bias) = {0}".format(np.max(abs_dence_layer1_bias)))
print("np.min(abs_dence_layer1_bias) = {0}".format(np.min(abs_dence_layer1_bias)))

np.max(dence_layer1_weight) = 0.287210673094
np.min(dence_layer1_weight) = -0.320384502411
np.max(abs_dence_layer1_weight) = 0.320384502411
np.min(abs_dence_layer1_weight) = 1.92374045582e-07
np.max(dence_layer1_bias) = 0.105059452355
np.min(dence_layer1_bias) = -0.0615252479911
np.max(abs_dence_layer1_bias) = 0.105059452355
np.min(abs_dence_layer1_bias) = 0.000534977589268


全結合層1層目の出力の標準偏差、最大値、最小値、絶対値の最大値、最小値を取得しよう。

print("dence_layer1_output = {0}".format(dence_layer1_output.shape))
print("np.std(dence_layer1_output) = {0}".format(np.std(dence_layer1_output)))
print("np.max(dence_layer1_output) = {0}".format(np.max(dence_layer1_output)))
print("np.min(dence_layer1_output) = {0}".format(np.min(dence_layer1_output)))
abs_dence_layer1_output = np.absolute(dence_layer1_output)
print("np.max(abs_dence_layer1_output) = {0}".format(np.max(abs_dence_layer1_output)))
print("np.min(abs_dence_layer1_output) = {0}".format(np.min(abs_dence_layer1_output)))

dence_layer1_output = (10000, 100)
np.std(dence_layer1_output) = 3.02382802963
np.max(dence_layer1_output) = 14.2637271881
np.min(dence_layer1_output) = -13.8859920502
np.max(abs_dence_layer1_output) = 14.2637271881
np.min(abs_dence_layer1_output) = 4.04380261898e-06


全結合層1層目の重みのグラフを示す。

# Dence layer1のweightのグラフ
dence_layer1_weight_f = dence_layer1_weight.flatten()
plt.plot(dence_layer1_weight_f)
plt.title('dence_layer1_weight')
plt.show()


tensorflow_keras_47_180530.png

全結合層1層目のバイアスのグラフを示す。

# Dence layer1のbiasのグラフ
dence_layer1_bias_f = dence_layer1_bias.flatten()
plt.plot(dence_layer1_bias_f)
plt.title('dence_layer1_bias')
plt.show()


tensorflow_keras_48_180530.png


全結合層2層目
model.summary() で取得した各層の情報を元に全結合層2層目の中間出力を取り出す。

# 2番目のDence layer2の中間出力を取り出す 
from keras.models import Model

dence_layer2_name = 'dense_6'

dence_layer2 = model.get_layer(dence_layer2_name)
dence_layer2_wb = dence_layer2.get_weights()

dence_layer2_model = Model(inputs=model.input,
                                 outputs=model.get_layer(dence_layer2_name).output)
dence_layer2_output = dence_layer2_model.predict(x_test, verbose=1)


表示を示す。

10000/10000 [==============================] - 2s 167us/step


重みとバイアスの配列の形状を取得した。

print(dence_layer2_weight.shape)
print(dence_layer2_bias.shape)

(100, 10)
(10,)


全結合層2層目の重みとバイアスの最大値、最小値、絶対値の最大値、最小値を取得しよう。

print("np.max(dence_layer2_weight) = {0}".format(np.max(dence_layer2_weight)))
print("np.min(dence_layer2_weight) = {0}".format(np.min(dence_layer2_weight)))
abs_dence_layer2_weight = np.absolute(dence_layer2_weight)
print("np.max(abs_dence_layer2_weight) = {0}".format(np.max(abs_dence_layer2_weight)))
print("np.min(abs_dence_layer2_weight) = {0}".format(np.min(abs_dence_layer2_weight)))
print("np.max(dence_layer2_bias) = {0}".format(np.max(dence_layer2_bias)))
print("np.min(dence_layer2_bias) = {0}".format(np.min(dence_layer2_bias)))
abs_dence_layer2_bias = np.absolute(dence_layer2_bias)
print("np.max(abs_dence_layer2_bias) = {0}".format(np.max(abs_dence_layer2_bias)))
print("np.min(abs_dence_layer2_bias) = {0}".format(np.min(abs_dence_layer2_bias)))

np.max(dence_layer2_weight) = 0.420090407133
np.min(dence_layer2_weight) = -0.625470399857
np.max(abs_dence_layer2_weight) = 0.625470399857
np.min(abs_dence_layer2_weight) = 0.000126185041154
np.max(dence_layer2_bias) = 0.0749695450068
np.min(dence_layer2_bias) = -0.0558836981654
np.max(abs_dence_layer2_bias) = 0.0749695450068
np.min(abs_dence_layer2_bias) = 0.00171886803582


全結合層2層目の出力の標準偏差、最大値、最小値、絶対値の最大値、最小値を取得しよう。

print("dence_layer2_output = {0}".format(dence_layer2_output.shape))
print("np.std(dence_layer2_output) = {0}".format(np.std(dence_layer2_output)))
print("np.max(dence_layer2_output) = {0}".format(np.max(dence_layer2_output)))
print("np.min(dence_layer2_output) = {0}".format(np.min(dence_layer2_output)))
abs_dence_layer2_output = np.absolute(dence_layer2_output)
print("np.max(abs_dence_layer2_output) = {0}".format(np.max(abs_dence_layer2_output)))
print("np.min(abs_dence_layer2_output) = {0}".format(np.min(abs_dence_layer2_output)))



dence_layer2_output = (10000, 10)
np.std(dence_layer2_output) = 9.34499263763
np.max(dence_layer2_output) = 30.0013465881
np.min(dence_layer2_output) = -35.2990074158
np.max(abs_dence_layer2_output) = 35.2990074158
np.min(abs_dence_layer2_output) = 0.000138353556395

全結合層2層目の重みのグラフを示す。

# Dence layer2のweightのグラフ
dence_layer2_weight_f = dence_layer2_weight.flatten()
plt.plot(dence_layer2_weight_f)
plt.title('dence_layer2_weight')
plt.show()


tensorflow_keras_49_180530.png

全結合層2層目のバイアスのグラフを示す。

# Dence layer2のbiasのグラフ
dence_layer2_bias_f = dence_layer2_bias.flatten()
plt.plot(dence_layer2_bias_f)
plt.title('dence_layer2_bias')
plt.show()


tensorflow_keras_50_180530.png
  1. 2018年05月30日 04:26 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

TensorFlow + Kerasを使ってみた7(畳み込み層の統計情報)

TensorFlow + Kerasを使ってみた6(層構成の変更、畳み込み層の統計情報)”の続き。

前回は、層の構成を変更して、学習を行った。今回は、畳み込み層の統計情報を取得してみよう。
なお、使用するのは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。

前回、model.summary() で取得した各層の情報を元に畳み込み層の中間出力を取り出そう。

# Convolution layerの中間出力を取り出す 
from keras.models import Model

conv_layer_name = 'conv2d_4'

conv_layer = model.get_layer(conv_layer_name)
conv_layer_wb = conv_layer.get_weights()

conv_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(conv_layer_name).output)
conv_output = conv_layer_model.predict(x_test, verbose=1)


表示を示す。

10000/10000 [==============================] - 1s 150us/step


最初に重みやバイアスの配列の構成やその値を見てみよう。

conv_layer_weight = conv_layer_wb[0]
conv_layer_bias = conv_layer_wb[1]

print(conv_layer_weight.shape)
print(conv_layer_weight.T.shape)
print(conv_layer_bias.shape)


結果を示す。

(5, 5, 1, 10)
(10, 1, 5, 5)
(10,)


conv_layer_weight は (5, 5, 1, 10) なので、いつもあつかている配列の構成ではない。そして、conv_layer_weight.T で転置してみたところ、いつも使っている構成の (10, 1, 5, 5) つまり、カーネル数、チャネル数、縦の幅、横の幅の配列になった。

print("conv_layer_weight.T = {0}".format(conv_layer_weight.T))

で転置した重みの配列を示す。

conv_layer_weight.T = [[[[ 0.20261094 -0.3398506  -0.5767307   0.11835691  0.13021287]
   [-0.07934965 -0.33518496 -0.4275438   0.25123549  0.38388866]
   [-0.22467291 -0.39792794 -0.07211141  0.38731813  0.24981308]
   [-0.43532223 -0.08618319  0.3187846   0.27912328  0.02272184]
   [-0.23157348  0.16632372  0.2654636   0.15583257 -0.04710154]]]


 [[[-0.48611653  0.15439186  0.4068115   0.3514016   0.16548221]
   [-0.6372757  -0.34480083  0.3836496   0.3169199   0.2640638 ]
   [-0.40548003 -0.56099683  0.10779987  0.32510042  0.3619229 ]
   [-0.33244497 -0.3915109  -0.1230321   0.2981098   0.35238296]
   [-0.13435255 -0.41839477 -0.4722871  -0.10132303  0.11304493]]]


 [[[-0.13130069  0.06223634  0.10510171  0.02183475 -0.16628554]
   [ 0.18190795  0.35684425  0.25642243  0.00863578  0.12985978]
   [ 0.15537558 -0.11242905 -0.2288756   0.04026176  0.08550146]
   [-0.1676253  -0.44136783 -0.29937005 -0.0171281   0.2620432 ]
   [-0.14785497 -0.10125857  0.12721944  0.05586093  0.10579447]]]


 [[[ 0.15156339 -0.20048767 -0.5791418  -0.65549827 -0.25779864]
   [ 0.4940948   0.3314954  -0.1274401  -0.3982863  -0.3313806 ]
   [ 0.22510909  0.45060343  0.15244117 -0.23712645 -0.02554286]
   [ 0.19534814  0.11640821  0.2987521  -0.04862794  0.04132852]
   [ 0.24242142  0.0540004  -0.00865097 -0.0300091   0.12885101]]]


 [[[ 0.36471996  0.35694337  0.27650365  0.35590482  0.13169082]
   [ 0.11910628  0.07778469  0.19447733  0.06036808 -0.12147922]
   [ 0.0868587   0.1454417   0.02258768 -0.2499182  -0.19614659]
   [-0.26476386 -0.27914035 -0.4387378  -0.33735904 -0.03323634]
   [-0.40310845 -0.43084973 -0.27778476 -0.2462857   0.04993651]]]


 [[[-0.08484216  0.19511358  0.58113253 -0.12703945 -0.516542  ]
   [ 0.17010233  0.2240115   0.23622094 -0.31102535 -0.59745365]
   [ 0.397805    0.23805015 -0.1035163  -0.45656392 -0.34286296]
   [ 0.18052064 -0.28208354 -0.29351595 -0.36484626  0.06465741]
   [-0.20084426 -0.30468363 -0.2777929   0.08292956 -0.01636941]]]


 [[[-0.05747546  0.10129268  0.0927546   0.01556351 -0.16821466]
   [-0.0250085   0.140934    0.12933072  0.19052765  0.20077062]
   [ 0.2489682   0.18465307  0.23520534  0.26735055  0.24849436]
   [ 0.00098434 -0.29655868 -0.13283624 -0.11904856 -0.02703394]
   [-0.31173185 -0.3589846  -0.2216169   0.05286852 -0.00669706]]]


 [[[-0.46006405 -0.41662437 -0.26404095 -0.27005908  0.00341533]
   [-0.07625411 -0.01859824 -0.0235228   0.0303653   0.10755768]
   [ 0.07276727  0.20107509  0.15815544  0.3283318   0.23039222]
   [ 0.21414295  0.14830865  0.24796312  0.01516124 -0.05039264]
   [ 0.01465091  0.08253051 -0.08803863  0.01456806 -0.17668988]]]


 [[[ 0.09082198  0.38919494  0.33294797 -0.5168951  -0.62100536]
   [-0.03360464  0.21474971  0.37199846 -0.29824486 -0.6191712 ]
   [ 0.11340497  0.20264329  0.37084493 -0.32331055 -0.5669018 ]
   [ 0.20493641  0.2751836   0.10829608 -0.20219678 -0.39315876]
   [ 0.14139216  0.20002662  0.17661056 -0.22110288 -0.28045934]]]


 [[[ 0.12587526 -0.01364575 -0.2322505  -0.14462651 -0.03129309]
   [ 0.171594    0.22744659 -0.05975187 -0.18951881 -0.2751198 ]
   [ 0.19060391  0.12572204  0.3344037   0.26089588 -0.12050828]
   [-0.17589498 -0.02884873  0.20712087  0.19588387  0.0149854 ]
   [-0.2094244  -0.37416157 -0.08472645  0.12522626  0.06411268]]]]


print("conv_layer_bias = {0}".format(conv_layer_bias))

で表示したバイアス値を示す。

conv_layer_bias = [-0.00722218 0.00386539 -0.10034832 -0.10226133 -0.00783706 -0.00266487
-0.15441592 -0.17244887 0.00067333 -0.17412803]


次に、取得した畳み込み層の中間出力を解析して重みやバイアスの最大値、最小値、絶対値の最大値、最小値、出力の標準偏差、最大値、最小値、絶対値の最大値、最小値を見てみよう。
Python コードを示す。

print("np.max(conv_layer_weight) = {0}".format(np.max(conv_layer_weight)))
print("np.min(conv_layer_weight) = {0}".format(np.min(conv_layer_weight)))
abs_conv_layer_weight = np.absolute(conv_layer_weight)
print("np.max(abs_conv_layer_weight) = {0}".format(np.max(abs_conv_layer_weight)))
print("np.min(abs_conv_layer_weight) = {0}".format(np.min(abs_conv_layer_weight)))

print("np.max(conv_layer_bias) = {0}".format(np.max(conv_layer_bias)))
print("np.min(conv_layer_bias) = {0}".format(np.min(conv_layer_bias)))
abs_conv_layer_bias = np.absolute(conv_layer_bias)
print("np.max(abs_conv_layer_bias) = {0}".format(np.max(abs_conv_layer_bias)))
print("np.min(abs_conv_layer_bias) = {0}".format(np.min(abs_conv_layer_bias)))

print("conv_output = {0}".format(conv_output.shape))
print("np.std(conv_output) = {0}".format(np.std(conv_output)))
print("np.max(conv_output) = {0}".format(np.max(conv_output)))
print("np.min(conv_output) = {0}".format(np.min(conv_output)))

abs_conv_output = np.absolute(conv_output)
print("np.max(abs_conv) = {0}".format(np.max(abs_conv_output)))
print("np.min(abs_conv) = {0}".format(np.min(abs_conv_output)))


出力を示す。

np.max(conv_layer_weight) = 0.581132531166
np.min(conv_layer_weight) = -0.65549826622
np.max(abs_conv_layer_weight) = 0.65549826622
np.min(abs_conv_layer_weight) = 0.000984335667454
np.max(conv_layer_bias) = 0.0038653917145
np.min(conv_layer_bias) = -0.17412802577
np.max(abs_conv_layer_bias) = 0.17412802577
np.min(abs_conv_layer_bias) = 0.000673334288877
conv_output = (10000, 24, 24, 10)
np.std(conv_output) = 0.691880404949
np.max(conv_output) = 3.46592283249
np.min(conv_output) = -4.23804473877
np.max(abs_conv) = 4.23804473877
np.min(abs_conv) = 7.68341124058e-09


畳み込み層の重みのグラフを書いてみた。

# Convolution layerのweightのグラフ
conv_layer_weight_f = conv_layer_weight.flatten()
plt.plot(conv_layer_weight_f)
plt.title('conv_layer_weight')
plt.show()


tensorflow_keras_45_180529.png

畳み込み層のバイアスのグラフを書いてみた。

# Convolution layerのbiasのグラフ
conv_layer_bias_f = conv_layer_bias.flatten()
plt.plot(conv_layer_bias_f)
plt.title('conv_layer_bias')
plt.show()


tensorflow_keras_46_180529.png
  1. 2018年05月29日 04:39 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

TensorFlow + Kerasを使ってみた6(層構成の変更、学習)

TensorFlow + Kerasを使ってみた5(モデルの可視化、サーマリ)”の続き。

前回は、モデルの可視化で層の構成情報のPNGファイルを出力し、レイヤのサーマリを出力した。今回は、層の構成を変更して、畳み込み層の学習を行った。
なお、使用するのは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。

なぜ、層構成を変更するか?というと、今のままでは、例えば畳み込み層に activation として relu が組み込まれていたが、そうすると層の出力を取り出しても 0 以下が取り除かれている状態になっているからだ。飽和演算をすれば問題ないのだが、量子化ビット幅のマイナス側が設定できないので、回ってしまってマイナスがプラスになってしまう可能性がある。
そこで、畳み込み層は activation を削除して、ReLU は新たに Activation 層を追加することにした。これは 全結合層(dence)も同様だ。
新しいネットワークの定義を示す。
なお、Jupyter Notebook のノートの名前は keras_mnist_cnn10 だ。

# My Mnist CNN (Convolution layerの特徴マップは5個)
# Conv2D - ReLU - MaxPooling - Dence - ReLU - Dence
# 2018/05/25 by marsee
# Keras / Tensorflowで始めるディープラーニング入門 https://qiita.com/yampy/items/706d44417c433e68db0d
# のPythonコードを再利用させて頂いている

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D, Activation
from keras import backend as K

batch_size = 128
num_classes = 10
epochs = 12

img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

#Kerasのバックエンドで動くTensorFlowとTheanoでは入力チャンネルの順番が違うので場合分けして書いています
if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

y_train = y_train.astype('int32')
y_test = y_test.astype('int32')
y_train = keras.utils.np_utils.to_categorical(y_train, num_classes)
y_test =  keras.utils.np_utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Conv2D(10, kernel_size=(5, 5),
                 input_shape=input_shape))
model.add(Activation(activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(100))
model.add(Activation(activation='relu'))
model.add(Dense(num_classes))
model.add(Activation(activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,
          verbose=1, validation_data=(x_test, y_test))


上のPython コードを実行した結果を示す。

('x_train shape:', (60000, 28, 28, 1))
(60000, 'train samples')
(10000, 'test samples')
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 12s 201us/step - loss: 0.2579 - acc: 0.9231 - val_loss: 0.0840 - val_acc: 0.9733
Epoch 2/12
60000/60000 [==============================] - 12s 201us/step - loss: 0.0785 - acc: 0.9762 - val_loss: 0.0564 - val_acc: 0.9819
Epoch 3/12
60000/60000 [==============================] - 12s 192us/step - loss: 0.0545 - acc: 0.9834 - val_loss: 0.0492 - val_acc: 0.9838
Epoch 4/12
60000/60000 [==============================] - 13s 210us/step - loss: 0.0425 - acc: 0.9869 - val_loss: 0.0442 - val_acc: 0.9862
Epoch 5/12
60000/60000 [==============================] - 12s 196us/step - loss: 0.0340 - acc: 0.9898 - val_loss: 0.0396 - val_acc: 0.9875
Epoch 6/12
60000/60000 [==============================] - 12s 198us/step - loss: 0.0284 - acc: 0.9915 - val_loss: 0.0382 - val_acc: 0.9874
Epoch 7/12
60000/60000 [==============================] - 11s 191us/step - loss: 0.0243 - acc: 0.9928 - val_loss: 0.0340 - val_acc: 0.9886
Epoch 8/12
60000/60000 [==============================] - 11s 189us/step - loss: 0.0206 - acc: 0.9937 - val_loss: 0.0371 - val_acc: 0.9878
Epoch 9/12
60000/60000 [==============================] - 12s 199us/step - loss: 0.0167 - acc: 0.9949 - val_loss: 0.0312 - val_acc: 0.9897
Epoch 10/12
60000/60000 [==============================] - 12s 195us/step - loss: 0.0146 - acc: 0.9954 - val_loss: 0.0317 - val_acc: 0.9896
Epoch 11/12
60000/60000 [==============================] - 11s 188us/step - loss: 0.0121 - acc: 0.9963 - val_loss: 0.0344 - val_acc: 0.9892
Epoch 12/12
60000/60000 [==============================] - 12s 205us/step - loss: 0.0103 - acc: 0.9970 - val_loss: 0.0320 - val_acc: 0.9898


精度と損失のグラフを示す。
tensorflow_keras_43_180528.png

model.summary() の結果を示す。
tensorflow_keras_44_180528.png

畳み込み層の conv2d_4 の統計情報、つまり、重みの最大値、最小値、バイアスの最大値、最小値、畳み込み層の最大値、最小値を見ていこう。
次回に続く。。。
  1. 2018年05月28日 04:56 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0