ディープラーニングのモデルを作成したとき、中間層の出力が気になることがよくあります。
きちんと活性化しているかとか、相関が高すぎて意味がないユニットが多くないかとか、
どんな条件の時に活性するのかなど、確認したい内容は時により様々です。
kerasの場合、学習済みのモデルの層を取り出して新しいモデルを作成することで中間層の出力を確認できます。
試しに以前下記の記事で作ったモデルでやってみましょう。
CNNで手書き数字文字の分類
公式ドキュメントに紹介されていたのと少し違う方法ですが、普通にSequentialモデルに学習済みの層を一個追加したら動いたので、
その方法で行います。
一層目には16ユニットあるのですが、そのうち2このユニットについて、出力を可視化しました。
# 学習済みモデルの1層目だけ取得してモデルを作成する
model_2 = Sequential()
model_2.add(model.layers[0])
# 元画像と1層目の出力2個を可視化
fig = plt.figure(figsize=(18, 30))
for i in range(5):
# print(y_test[i].argmax())
ax = fig.add_subplot(6, 3, 3*i+1)
ax.imshow(X_test[i][:, :, 0], cmap='gray_r')
ax = fig.add_subplot(6, 3, 3*i+2)
ax.imshow(model_2.predict(X_test[i:i+1])[0][:, :, 0], cmap='gray_r')
ax = fig.add_subplot(6, 3, 3*i+3)
ax.imshow(model_2.predict(X_test[i:i+1])[0][:, :, 1], cmap='gray_r')
plt.show()
真ん中の列の出力は横線の下辺に反応していることや、右側の列の結果は中抜き文字のような形で反応しているのがわかりますね。
ちなみに、それぞれのユニットのウェイト(バイアスは除く)を可視化すると次のようになります
fig = plt.figure(figsize=(5,10))
for i in range(2):
w = model_2.get_weights()[0][:, :, 0, i].reshape(3, 3)
ax = fig.add_subplot(2, 1, i+1)
ax.imshow(w, cmap='gray_r')
plt.show()
イメージした通りのウェイトでした。