Ajuste fino del modelo entrenado en keras

Quiero usar un modelo imagenet VGG16 previamente entrenado en keras y agregar mi propio pequeño convenet en la parte superior. Solo me interesan las características, no las predicciones

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

cargar imágenes desde el directorio (el directorio contiene 4 imágenes)

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)

cargar el modelo base, preprocesar la entrada y obtener las características

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

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

esto funciona, y obtengo las características de mis imágenes en el VGG previamente entrenado.

Ahora quiero ajustar el modelo y agregar algunas capas convolucionales. Yo leohttps://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html yhttps://keras.io/applications/ pero no puede reunirlos del todo.

agregando mi modelo en la 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)

construyendo el modelo completo

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

detener el aprendizaje de las capas base

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

nuevo modelo

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

ahora se ajusta al nuevo modelo, el modelo tiene 4 imágenes y [1,0,1,0] son las etiquetas de clase. Pero esto obviamente está mal:

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

¿Cómo se hace esto?

¿Cómo lo haría si solo quisiera reemplazar el último bloque convolucional (conv block5 en VGG16) en lugar de agregar algo?

¿Cómo solo entrenaría las características del cuello de botella?

Las características de salidafeatures tiene forma (4, 512, 7, 7). Hay cuatro imágenes, pero ¿qué hay en las otras dimensiones? ¿Cómo reduciría eso a una matriz (1, x)?

Respuestas a la pregunta(2)

Su respuesta a la pregunta