深層学習用ライブラリKeras CNN中間層を見てみよう

In [1]:
from sklearn.datasets        import fetch_lfw_people
from matplotlib import pyplot as plt

# Kerasからモデル作成用モジュール
from keras       import models, layers
from keras.utils import plot_model
Using TensorFlow backend.

予測データ準備

  • 前処理は省略します。
In [2]:
# データロード
lfw = fetch_lfw_people(data_home='./scikit_learn_data/', min_faces_per_person=100, resize=0.5)
X = lfw.data
v,h = lfw.images.shape[1:3] # 画像の垂直・水平サイズを保持する
n = X.shape[0]  # 学習データ数を保持する
X = X.reshape([n, v, h, 1])

保存したモデルHDF5ファイルをロードする

  • 前回自分で作成して保存した学習モデルをロードしてみます。
In [3]:
model = models.load_model('./model_cnn_adam.h5')
In [4]:
plot_model(model, show_shapes=True, to_file='model_cnn_adam.png')
Out[4]:
In [5]:
print(model.layers[6].name)
max_pooling2d_2
In [6]:
model_mid = models.Model(inputs=model.input, outputs=[model.layers[6].output])
In [7]:
plot_model(model_mid, show_shapes=True,to_file='model_cnn_adam_mid.png')
Out[7]:
In [8]:
X.shape
Out[8]:
(1140, 62, 47, 1)

こちらのBushさん画像をモデルに入力してみましょう

In [9]:
plt.imshow(X[0].transpose(2,0,1)[0], cmap='gray')
Out[9]:
<matplotlib.image.AxesImage at 0x2c8cace20f0>
In [10]:
model_output = model_mid.predict(X[0:1])

畳み込み層で各フィルタ処理が施された結果の出力を見てみましょう。

  • 出力は(outputs=[model.layers[6].output])で一つのレイヤしか指定していないので、出力は1つになります。
  • 出力は縦12x横8x層64となります。
In [11]:
model_output.shape
Out[11]:
(1, 12, 8, 64)
  • 0-64層を8x8で表示してみました。
  • 縦12x横8x層64を層64x縦12x横8にtransposeで変換しています。
In [12]:
plt.figure(figsize=(10, 10))
layer_out_tr = model_output[0].transpose(2,0,1)
for i in range(64):
    subplt = plt.subplot(8,8, i+1)
    subplt.imshow(layer_out_tr[i], cmap='gray')
    
plt.savefig('.\model_layer_64_max_pooling2d_2.jpg')
plt.show()
In [ ]: