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