Keras 2.2: невозможно загрузить готовую модель с весами imagenet - PullRequest
0 голосов
/ 27 января 2019

У меня есть блок кода, который использовал для работы в более старых версиях Keras, но в Keras 2.2 я получаю сообщение об ошибке при загрузке модели с недостаточным количеством слоев в более крупную модель:

import keras
from keras.layers import MaxPooling2D, AveragePooling2D,  Conv2D
from keras.applications import Xception
from keras.layers.normalization import BatchNormalization
from keras.layers import Input, Concatenate, Add
from keras.layers.advanced_activations import LeakyReLU

kernel_size = (3, 3)  
pool_size = (2, 2)  
nfilters = 3
inputs = Input(shape=(331, 331, 1))
x = inputs
x = Conv2D(nfilters, kernel_size, strides=(1,1), padding='same', use_bias=False)(x)
x = BatchNormalization()(x)
x = LeakyReLU(alpha=0.1)(x)
x = MaxPooling2D(pool_size=pool_size)(x)
x =  Add()([x,AveragePooling2D(pool_size=pool_size)(inputs)])  # residual skip connection on shrunk image
base_model = Xception(weights='imagenet', include_top=False, input_tensor=x)

Ошибка, которую я получаю, связана с Xception:

ValueError: You are trying to load a weight file containing 80 layers into a model with 82 layers.

Вот ссылка на блокнот Google Colab, который воспроизводит этот .

Проблема возникает при загрузке весов imagenet;если я установлю веса на None, нет проблем.

Такого рода ошибки можно избежать при вызове load_model(), передав by_name=True, но эти готовые модели, такие как Xception, не допускают ключевое слово by_name.

Может кто-нибудь объяснить, как заставить мой код снова работать под Keras 2.2?

Полагаю, я мог бы определить Xception дважды, один раз с весами imagenet, а другой в моей полной модели с весами= Нет, а затем скопировать весовые коэффициенты с первого на второе ... но я бы предпочел не делать этого, если это возможно.

( «Почему вы помещаете эти слои перед Xception?» Это потому, что я уменьшаю увеличенное изображение до размера, требуемого Xception для его весов imagnet, и для преобразования моей шкалы серогоизображения к 3-канальным изображениям.)

1 Ответ

0 голосов
/ 27 января 2019

Не совсем понятно, как объяснить свою ошибку, но вы можете заставить ее работать, рассматривая модель Xception как слой, вызывая ее на предыдущих слоях и оборачивая весь стек в экземпляр модели.Я проверил следующее в вашей записной книжке Colab.

import keras
from keras.layers import MaxPooling2D, AveragePooling2D,  Conv2D
from keras.applications import Xception
from keras.layers.normalization import BatchNormalization
from keras.layers import Input, Concatenate, Add
from keras.layers.advanced_activations import LeakyReLU

kernel_size = (3, 3)  
pool_size = (2, 2)  
nfilters = 3
inputs = Input(shape=(331, 331, 1))
x = inputs
x = Conv2D(nfilters, kernel_size, strides=(1,1), padding='same', use_bias=False)(x)
x = BatchNormalization()(x)
x = LeakyReLU(alpha=0.1)(x)
x = MaxPooling2D(pool_size=pool_size)(x)
x =  Add()([x,AveragePooling2D(pool_size=pool_size)(inputs)])  # residual skip connection on shrunk image

# Xception architecture is just another layer
base_model = Xception(weights='imagenet', include_top=False)
output = base_model(x)
# Wrap everything into a model
combined_model = keras.models.Model(inputs=inputs, outputs=output)

Это даст вам модель, которая выглядит следующим образом:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            (None, 331, 331, 1)  0                                            
__________________________________________________________________________________________________
conv2d_6 (Conv2D)               (None, 331, 331, 3)  27          input_2[0][0]                    
__________________________________________________________________________________________________
batch_normalization_6 (BatchNor (None, 331, 331, 3)  12          conv2d_6[0][0]                   
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU)       (None, 331, 331, 3)  0           batch_normalization_6[0][0]      
__________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)  (None, 165, 165, 3)  0           leaky_re_lu_2[0][0]              
__________________________________________________________________________________________________
average_pooling2d_2 (AveragePoo (None, 165, 165, 1)  0           input_2[0][0]                    
__________________________________________________________________________________________________
add_14 (Add)                    (None, 165, 165, 3)  0           max_pooling2d_2[0][0]            
                                                                 average_pooling2d_2[0][0]        
__________________________________________________________________________________________________
xception (Model)                multiple             20861480    add_14[0][0]                     
==================================================================================================
Total params: 20,861,519
Trainable params: 20,806,985
Non-trainable params: 54,534
__________________________________________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...