Modelo pré-treinado de ajuste fino em keras

Eu quero usar um modelo VGG16 imagenet pré-treinado em keras e adicionar minha própria pequena convnet na parte superior. Estou interessado apenas nos recursos, não nas previsões

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

carregar imagens do diretório (o dir contém 4 imagens)

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)

carregar o modelo base, pré-processar a entrada e obter os recursos

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

x = preprocess_input(aa)
features = base_model.predict(x)

isso funciona e recebo os recursos das minhas imagens no VGG pré-treinado.

Agora, quero ajustar o modelo e adicionar algumas camadas convolucionais. Eu lihttps://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html ehttps://keras.io/applications/ mas não consegue reuni-los.

adicionando meu modelo na parte superior:

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)

construindo o modelo completo

model_complete = Model(input=base_model.input, output=feat)

impedir que as camadas base sejam aprendidas

for layer in base_model.layers:
layer.trainable = False

novo modelo

model_complete.compile(optimizer='rmsprop', 
          loss='binary_crossentropy')

agora adequado ao novo modelo, o modelo possui 4 imagens e [1,0,1,0] são os rótulos das classes. Mas isso está obviamente errado:

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

Como isso é feito?

Como eu faria isso se quisesse apenas substituir o último bloco convolucional (conv block5 no VGG16) em vez de adicionar algo?

Como treinaria apenas os recursos de gargalo?

A saída de recursosfeatures tem forma (4, 512, 7, 7). Existem quatro imagens, mas o que há nas outras dimensões? Como eu reduziria isso para uma matriz (1, x)?

questionAnswers(2)

yourAnswerToTheQuestion