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