Fine-tuning pretrained Modell in keras
Ich möchte an einem pretrained imagenet VGG16 Modell in keras und meine eigenen kleinen convnet an der Spitze. Ich bin nur daran interessiert, die Funktionen, nicht die Vorhersagen
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
import os
from keras.models import Model
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
laden von Bildern aus dem Verzeichnis (dir enthält 4 Bilder)
IF = '/home/ubu/files/png/'
files = os.listdir(IF)
imgs = [img_to_array(load_img(IF + p, target_size=[224,224])) for p in files]
im = np.array(imgs)
laden Sie das Basis-Modell, input Vorverarbeiten und Funktionen
base_model = VGG16(weights='imagenet', include_top=False)
x = preprocess_input(aa)
features = base_model.predict(x)
dies funktioniert, und ich bekomme die Funktionen für meine Bilder auf der pretrained VGG.
Will ich jetzt Feinabstimmung des Modells und fügen Sie einige convolutional Layer.
Ich lese https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html und https://keras.io/applications/ aber nicht ganz bringen Sie zusammen.
hinzufügen mein Modell on top:
x = base_model.output
x = Convolution2D(32, 3, 3)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Convolution2D(32, 3, 3)(x)
x = Activation('relu')(x)
feat = MaxPooling2D(pool_size=(2, 2))(x)
Gebäude das komplette Modell
model_complete = Model(input=base_model.input, output=feat)
stop-base-Layer aus, die gelernt
for layer in base_model.layers:
layer.trainable = False
neues Modell
model_complete.compile(optimizer='rmsprop',
loss='binary_crossentropy')
nun passt das neue Modell, das Modell ist 4-Bilder und [1,0,1,0] sind die Klasse Etiketten.
Aber das ist natürlich falsch:
model_complete.fit_generator((x, [1,0,1,0]), samples_per_epoch=100, nb_epoch=2)
ValueError: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: None
Wie wird das gemacht?
Wie würde ich es tun, wenn ich nur ersetzen wollte den letzten block convolutional (conv block5 in VGG16), anstatt etwas hinzuzufügen?
Wie würde ich nur trainieren, der Engpass-Funktionen?
Funktionen Ausgabe features
Form (4, 512, 7, 7). Es gibt vier Bilder, aber was ist in den anderen Dimensionen? Wie würde ich reduzieren, die zu einer (1,x) array?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Passende Modell
Sich das problem mit dem generator-code ist, dass die fit_generator Methode erwartet eine generator-Funktion zum generieren der Daten für die Ausrüstung, die Sie nicht bieten.
Sie können entweder definieren Sie einen generator wie in der Anleitung, die Sie verlinkt haben, oder erstellen Sie die Daten und labels, die sich selbst und passen Sie Ihr Modell selbst:
dort wo die Bilder Ihre generierten Ausbildung Bilder-und Etiketten sind die entsprechenden Etiketten.
Entfernen der letzten Schicht
Vorausgesetzt, Sie haben ein Modell-Variablen und der "pop" - Methode, wie unten beschrieben, die Sie tun können
model = pop(model)
entfernen Sie die Letzte Schicht.Ausbildung nur bestimmte Ebenen
Als Sie getan haben in Ihrem code können Sie tun:
Dann können Sie "Auftauen" und die Ebene, die Sie wollen, indem Sie Ihre
trainable
EigenschaftTrue
.Abmessungen ändern
Ändern Sie die Ausgabe, um ein 1D-array, das Sie verwenden können, die Flatten layer
Die pop-Methode
Verwenden
model.fit(X, y)
zu trainieren, auf Ihrem dataset, wie hier beschrieben: https://keras.io/models/model/#fitZusätzlich sollten Sie einen Flatten-Schicht und eine Dichte Schicht mit einer Ausgabe der Form 1 zu bekommen das richtige Ergebnis in Form.