Удаление слоев из предварительно подготовленной модели 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 ведет себя правильно.

Другие вопросы по тегам