Keras model.pop() не работает

Я использую Keras 2.0.6 с Python 3.6.2 и Tensorflow-gpu 1.3.0.

Чтобы выполнить тонкую настройку модели Vgg16, я запускаю этот код после того, как вручную построил архитектуру vgg16 и загрузил весовые коэффициенты, но я еще не вызвал compile():

model = self.model
model.pop()
for layer in model.layers: layer.trainable=False
model.add(Dense(num, activation='softmax'))
self.compile()

И когда я проверяю график в Tensorboard, я вижу (проверьте в верхнем левом углу прикрепленной картинки) плотность_3, подключенную к dropout_2, но висящую сама по себе. И затем рядом с ним я вижу плотность_4, также связанный с dropout_2.

График модели тензорной доски

Я попытался заменить pop() приведенным ниже кодом pop_layer(), как предложено здесь joelthchao 6 мая 2016 года. К сожалению, график, отображаемый в Tensorboard, становится непонятным беспорядком.

def pop_layer(model):
    if not model.outputs:
        raise Exception('Sequential model cannot be popped: model is empty.')

    model.layers.pop()
    if not model.layers:
        model.outputs = []
        model.inbound_nodes = []
        model.outbound_nodes = []
    else:
        model.layers[-1].outbound_nodes = []
        model.outputs = [model.layers[-1].output]
    model.built = False

Я знаю, что что-то не работает должным образом, потому что я получаю низкую точность, когда выполняю это на соревнованиях "Кагл против кошек и собак", где я держу около 90%, в то время как другие, использующие этот код (он адаптирован из fast.ai) поверх Theanos, легко получают 97%. Возможно, моя проблема точности возникла откуда-то еще, но я все еще не думаю, что плотность_3 должна быть там, и мне интересно, может ли это быть источником моей проблемы точности.

Как я могу определенно отключить и удалить dens_3?


См. Ниже для model.summary() до и после запуска кода для подготовки к тонкой настройке. Мы больше не видим плотность_3, но видим его на графике тензорной доски.

Перед запуском


Layer (type)                 Output Shape              Param #   
=================================================================
lambda_1 (Lambda)            (None, 3, 224, 224)       0         
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 3, 226, 226)       0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 64, 224, 224)      1792      
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 64, 226, 226)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 64, 224, 224)      36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 64, 112, 112)      0         
_________________________________________________________________
zero_padding2d_3 (ZeroPaddin (None, 64, 114, 114)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 128, 112, 112)     73856     
_________________________________________________________________
zero_padding2d_4 (ZeroPaddin (None, 128, 114, 114)     0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 128, 112, 112)     147584    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 128, 56, 56)       0         
_________________________________________________________________
zero_padding2d_5 (ZeroPaddin (None, 128, 58, 58)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 256, 56, 56)       295168    
_________________________________________________________________
zero_padding2d_6 (ZeroPaddin (None, 256, 58, 58)       0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 256, 56, 56)       590080    
_________________________________________________________________
zero_padding2d_7 (ZeroPaddin (None, 256, 58, 58)       0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 256, 56, 56)       590080    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 256, 28, 28)       0         
_________________________________________________________________
zero_padding2d_8 (ZeroPaddin (None, 256, 30, 30)       0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 512, 28, 28)       1180160   
_________________________________________________________________
zero_padding2d_9 (ZeroPaddin (None, 512, 30, 30)       0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 512, 28, 28)       2359808   
_________________________________________________________________
zero_padding2d_10 (ZeroPaddi (None, 512, 30, 30)       0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 512, 28, 28)       2359808   
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 512, 14, 14)       0         
_________________________________________________________________
zero_padding2d_11 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
zero_padding2d_12 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
zero_padding2d_13 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 512, 7, 7)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              102764544 
_________________________________________________________________
dropout_1 (Dropout)          (None, 4096)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dropout_2 (Dropout)          (None, 4096)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 1000)              4097000   
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0

После запуска

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lambda_1 (Lambda)            (None, 3, 224, 224)       0         
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 3, 226, 226)       0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 64, 224, 224)      1792      
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 64, 226, 226)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 64, 224, 224)      36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 64, 112, 112)      0         
_________________________________________________________________
zero_padding2d_3 (ZeroPaddin (None, 64, 114, 114)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 128, 112, 112)     73856     
_________________________________________________________________
zero_padding2d_4 (ZeroPaddin (None, 128, 114, 114)     0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 128, 112, 112)     147584    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 128, 56, 56)       0         
_________________________________________________________________
zero_padding2d_5 (ZeroPaddin (None, 128, 58, 58)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 256, 56, 56)       295168    
_________________________________________________________________
zero_padding2d_6 (ZeroPaddin (None, 256, 58, 58)       0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 256, 56, 56)       590080    
_________________________________________________________________
zero_padding2d_7 (ZeroPaddin (None, 256, 58, 58)       0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 256, 56, 56)       590080    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 256, 28, 28)       0         
_________________________________________________________________
zero_padding2d_8 (ZeroPaddin (None, 256, 30, 30)       0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 512, 28, 28)       1180160   
_________________________________________________________________
zero_padding2d_9 (ZeroPaddin (None, 512, 30, 30)       0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 512, 28, 28)       2359808   
_________________________________________________________________
zero_padding2d_10 (ZeroPaddi (None, 512, 30, 30)       0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 512, 28, 28)       2359808   
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 512, 14, 14)       0         
_________________________________________________________________
zero_padding2d_11 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
zero_padding2d_12 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
zero_padding2d_13 (ZeroPaddi (None, 512, 16, 16)       0         
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 512, 14, 14)       2359808   
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 512, 7, 7)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              102764544 
_________________________________________________________________
dropout_1 (Dropout)          (None, 4096)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dropout_2 (Dropout)          (None, 4096)              0         
_________________________________________________________________
dense_4 (Dense)              (None, 2)                 8194      
=================================================================
Total params: 134,268,738
Trainable params: 8,194
Non-trainable params: 134,260,544

0 ответов

Я полагаю, что это проблема с имплементацией layer.pop() в Keras при использовании бэкэнда тензорного потока. А пока вот обходной путь удаления последнего слоя по имени:

name_last_layer = str(model1.layers[-1])

model2 = Sequential()
for layer in model1.layers:
    if str(layer) != name_last_layer:
        model2.add(layer)

Где model1 - ваша исходная модель, а model2 - та же модель без последнего слоя. В этом примере я сделал model2 последовательной моделью, но вы можете изменить это.

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