Удаление слоев из предварительно подготовленной модели keras дает тот же результат, что и исходная модель.
Во время некоторых экспериментов по извлечению функций я заметил, что функциональность model.pop() работает не так, как ожидалось. Для предварительно обученной модели, такой как vgg16, после использования model.pop(), model.summary() показывает, что слой был удален (ожидается 4096 объектов), однако при передаче изображения через новую модель это приводит к тому же Количество функций (1000) в качестве оригинальной модели. Независимо от того, сколько слоев удалено, включая полностью пустую модель, она генерирует один и тот же результат. Ищете ваше руководство по тому, что может быть проблемой.
#Passing an image through the full vgg16 model
model = VGG16(weights = 'imagenet', include_top = True, input_shape = (224,224,3))
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img = np.expand_dims( img, axis=0 )
img = preprocess_input( img )
features = model.predict( img )
features = features.flatten()
print(len(features)) #Expected 1000 features corresponding to 1000 imagenet classes
1000
model.layers.pop()
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img = np.expand_dims( img, axis=0 )
img = preprocess_input( img )
features2 = model.predict( img )
features2 = features2.flatten()
print(len(features2)) #Expected 4096 features, but still getting 1000. Why?
#No matter how many layers are removed, the output is still 1000
1000
Спасибо!
Смотрите полный код здесь: https://github.com/keras-team/keras/files/1592641/bug-feature-extraction.pdf
1 ответ
Отработка @Koul ответ.
Я считаю, что вам не нужно использовать pop
метод. Вместо этого просто передайте слой перед выходным слоем в качестве аргумента дляModel
выходной параметр метода:
from keras.models import Model
model2 = Model(model.input, model.layers[-2].output)
model2.summary()
Нашел ответ здесь: https://github.com/keras-team/keras/issues/2371
from keras.models import Model
model.layers.pop() model2 = Model(model.input, model.layers[-1].output)
model2.summary()
модель2 ведет себя правильно.