Merkmalsextraktion für ein vorab trainiertes Modell in Keras

7

Keras bietet eine Möglichkeit, die Funktionen eines vorab trainierten Modells zu extrahieren, die hier beschrieben werden. 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)

Ich habe dies mit einigen Beispielbildern versucht. Mein Vektor x hat die Form (100, 3, 224, 224) für 100 Beobachtungen, 3 für RGB und eine Pixelgröße von 224 x 224. das preprocess_inputformt dies für das VGG-Modell um (es erwartet eine andere Reihenfolge).

Die Ausgabeform von featuresist jedoch (100, 512, 7, 7). Was ist das für eine Form? Ich möchte die Funktionen als Eingabe für eine logistische Regression verwenden. Ich brauche also eine Form wie (100, n): eine Zeile für jede Beobachtung und die Merkmale in den Spalten. Wie kann ich die Ausgabe in diese Dimension umformen?

Angenommen, ich möchte jetzt mein eigenes einfaches Convnet erstellen:

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)))

Dieses Modell erwartet Graustufenbilder als Eingabe, daher die Form.

Welche Art von Ebene muss ich hinzufügen, um Funktionen dieses Modells zu erhalten (etwas, das ich in eine logistische Regression oder eine zufällige Gesamtstruktur eingeben kann).

Vielen Dank

spore234
quelle

Antworten:

7

Die featuresVariable enthält die Ausgaben der letzten Faltungsschichten Ihres Netzwerks. Die letzte Faltungsschicht von VGG16 gibt 512 7x7-Feature-Maps aus. Alles, was Sie tun müssen, um diese Funktionen in einem logistischen Regressionsmodell (oder einem anderen Modell) zu verwenden, ist, wie Sie sagen, eine Umformung in einen 2D-Tensor vorzunehmen.

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

Dadurch werden die Feature-Maps für jede Instanz auf einen langen eindimensionalen Vektor reduziert.

Tipp: Wenn Sie nicht die tatsächlichen Abmessungen für Ihre reshape Ausarbeiten gestört werden, können Sie ersetzen 512*7*7mit -1und numpywerden herausfinden , wie groß die endgültige Dimension sein sollte.

Timleathart
quelle
Was ist mit dem Extrahieren von Features aus der vorletzten Ebene oder anderen Ebenen?
Raghuram
2
@ Raghuram Verwenden Sie VGG19 keras.io/applications/#vgg19
christopherlovell