Python Keras 2.2:can';t使用图像净重加载预先制作的模型

Python Keras 2.2:can';t使用图像净重加载预先制作的模型,python,tensorflow,keras,Python,Tensorflow,Keras,我有一段代码过去在旧版本的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.lay

我有一段代码过去在旧版本的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)
我得到的错误与异常有关:

ValueError:您试图将包含80层的权重文件加载到包含82层的模型中。

这里有一个链接到一个

问题发生在加载图像净重方面;如果我将权重设置为
None
,则没有问题

load\u model()
调用中,可以通过传递
by\u name=True
来避免这种错误,但是像Exception这样的预制模型不允许使用
by\u name
关键字

有人能解释一下如何让我的代码在Keras2.2下重新工作吗

我想我可以定义两次异常,一次是使用imagenet权重,另一次是在我的完整模型中使用weights=None,然后将权重从前者复制到后者……但如果可能的话,我宁愿不这样做


(“为什么要将这些层放在Exception之前?”这是因为我正在将较大的图像缩小到Exception为其imagnet权重所需的大小,并将灰度图像转换为3通道图像。)

不确定如何解释错误,但可以将Exception模型视为一个层,在以前的层上调用它,并在模型实例中包装整个堆栈。我在你的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
__________________________________________________________________________________________________

不完全确定如何解释错误,但可以将异常模型视为一个层,在以前的层上调用它,并将整个堆栈包装到模型实例中,从而使其工作。我在你的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
__________________________________________________________________________________________________

我无法重现你的错误(我得到了不同的错误)。你能把myXshape的值包括进去吗?@sdcbr当然可以。我添加了维度、导入和指向复制我错误的Colab笔记本的链接。我无法复制你的错误(我得到了不同的错误)。你能把myXshape的值包括进去吗?@sdcbr当然可以。我添加了尺寸和导入,以及一个复制我错误的Colab笔记本的链接。太棒了!你解决了我的问题!非常感谢你!杰出的你解决了我的问题!非常感谢你!