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?

InformationsquelleAutor spore234 | 2017-01-20
Schreibe einen Kommentar