ケラスの事前学習済みモデルの特徴抽出


7

Kerasには、事前トレーニングされたモデルの機能を抽出する方法があります。ここで説明しますhttps://keras.io/applications/

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np

model = VGG16(weights='imagenet', include_top=False)

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

features = model.predict(x)

いくつかのサンプル画像でこれを試しました。私のベクトルxは、100回の観測で形状(100、3、224、224)、RGBで3、ピクセルサイズが224x224です。はpreprocess_inputVGGモデルのこれを再形成します(別の順序を想定しています)。

ただし、の出力形状featuresは(100、512、7、7)です。この形は何ですか?これらの機能をロジスティック回帰の入力として使用したい。したがって、(100、n)のような形状が必要です。観測ごとに1行と列の特徴です。出力をこの次元に再形成するにはどうすればよいですか?

今、自分のシンプルなConvnetを構築したいとします。

from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=(1, 299, 299)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

このモデルは、入力としてグレースケール画像、つまり形状を想定しています。

このモデルの機能(ロジスティック回帰またはランダムフォレストに入力できるもの)を取得するには、どのようなレイヤーを追加する必要がありますか?

ありがとう

回答:


7

features変数は、ネットワークの最終畳み込み層の出力が含まれています。VGG16の最後のたたみ込み層は、512の7x7機能マップを出力します。これらの機能をロジスティック回帰モデル(またはその他のモデル)で使用するために必要なことは、2Dテンソルに形状を変更することだけです。

reshaped_features = features.reshape(100, 512*7*7)

これにより、フィーチャマップが各インスタンスの長い1次元ベクトルにフラット化されます。

ヒント:あなたはリシェイプの実際の寸法をワークアウト気にすることはできません場合は、置き換えることができる512*7*7-1してnumpy、最終的な寸法はどうあるべきか、大きな把握します。


最後から2番目のレイヤーまたは他のレイヤーから特徴を抽出するのはどうですか?
Raghuram 2017年

2
@Raghuram VGG19を使用keras.io/applications/#vgg19
christopherlovell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.