LoginSignup
41
34

More than 5 years have passed since last update.

[keras]中間層の出力

Last updated at Posted at 2018-03-03

研究で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

参考

kerasで処理の途中の値を取り出す - ぱたヘネ

41
34
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
34