研究でCNNの中間層の出力を取得したいので,抽出する.
今回は学習済みモデルがあると仮定してCNNモデルのロードを行う.
- cnn_model.json : 学習モデルの構成
- cnn_model_weight : 学習モデルの重みデータ
過去記事 : KerasでCNNを簡単に構築
モデルのロード
from keras.models import model_from_json
json_string = open('./keras_data/cnn_model.json').read()
model = model_from_json(json_string)
model.load_weights('./keras_data/cnn_model_weight.hdf5')
モデルの確認
画像として保存
from keras.utils.vis_utils import plot_model
plot_model(model, show_shapes=True)
コンソールに出力
model
インスタンスからsummary
メソッドを呼び出す
model.summary()
中間層モデル
plot_model
, summary()
で確認した,レイヤ名を出力層にするモデルを再構築する.
from keras.models import Model
layer_name = 'activation_4'
hidden_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output)
出力層の確認
作成した,モデルが中間層の出力を行なっているか確認
import cv2
import numpy as np
img = cv2.imread('./keras_data/face.jpg')
img = cv2.resize(img, (100, 100))
target = np.reshape(img, (1, img.shape[0], img.shape[1], img.shape[2])).astype('float') / 255.0
hidden_output = hidden_layer_model.predict(target)
hidden_output.shape
# (1, 1024) ← 中間層のサイズ
Layerの更新を制限する
大体,中間層の出力をする場合は転移学習(fine-tuning)をすると思うので,追加でfitした場合に重みの更新をしないように制限する.
layer.trainable
でその層が学習可能か設定できる.
# 現在のモデル構成を確認
for i in range(len(new_model.layers)):
print(i, new_model.layers[i], new_model.layers[i].trainable)
for layer in model.layers[:12]
layer.trainable = False