Как удалить последний слой из предварительно обученной модели.Я пробовал model.layers.pop (), но он не работает - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь удалить последний слой, чтобы я мог использовать трансфер Leaning.

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()

for layer in vgg16_model.layers:
    model.add(layer)

model.layers.pop()


# Freeze the layers 
for layer in model.layers:
    layer.trainable = False


# Add 'softmax' instead of earlier 'prediction' layer.
model.add(Dense(2, activation='softmax'))


# Check the summary, and yes new layer has been added. 
model.summary()

Но вывод, который я получаю, не тот, который я ожидал.Он по-прежнему показывает последний слой модели vgg16.

Вот вывод

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928       

**THE HIDDEN LAYERS** 
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
predictions (Dense)          (None, 1000)              4097000   
_________________________________________________________________
dense_10 (Dense)             (None, 2)                 2002      
=================================================================
Total params: 138,359,546
Trainable params: 2,002
Non-trainable params: 138,357,544

Примечание - На выходе я непоказала всю модель, только что показала первые несколько слоев и последние слои.

Как мне удалить последний слой, чтобы выполнить передачу обучения ??

Версия PS Keras = 2.2.4

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Только не добавляйте последний слой к вашей модели. Таким образом, вам даже не понадобится pop

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()

for layer in vgg16_model.layers[:-1]: # this is where I changed your code
    model.add(layer)    

# Freeze the layers 
for layer in model.layers:
    layer.trainable = False

# Add 'softmax' instead of earlier 'prediction' layer.
model.add(Dense(2, activation='softmax'))
0 голосов
/ 25 марта 2019

В качестве альтернативы ответу markuscosinus вы можете взять вывод перед слоем прогнозирования и пропустить его через свой собственный слой прогнозирования.Вы можете сделать это следующим образом:

for layer in vgg16_model.layers: 
    layer.trainable = False
last_layer = vgg16_model.get_layer('fc2').output
out = Flatten()(last_layer)
out = Dense(128, activation='relu', name='fc3')(out)
out = Dropout(0.5)(out)
out = Dense(n_classes, activation='softmax', name='prediction')(out)
vgg16_custom_model = Model(input=vgg16_model.input, output=out)

Я предлагаю вам добавить слой Flatten и другой плотный слой перед вашим softmax, потому что последний "fc2" имеет 4096 узлов, и его трудно изменить на 2.

И, конечно, отсев до предсказания даст вам лучшие результаты.

...