Keras您正在尝试将包含2层的权重文件加载到具有1层的模型中

kon*_*tin 7 python keras

我已经使用Keras训练了CNN模型并存储了权重。当我尝试将它们加载回相同的模型时,出现以下错误:

ValueError:您正在尝试将包含2层的权重文件加载到具有1层的模型中。

我发现这是一个常见错误。但是,建议的补救措施似乎对我没有用。我试图将当前的Keras版本降级2.2.42.1.6。我的模型如下:

def build_model(self):

    model = Sequential()
    #pdb.set_trace()
    model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, self.latent_dim)))
    model.add(Reshape((7, 7, 128)))
    model.add(UpSampling2D())
    model.add(Conv2D(128, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))
    model.add(UpSampling2D())
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(Conv2D(self.channels, kernel_size=4, padding="same"))
    model.add(Activation("tanh"))

    model.summary()

    noise = Input(shape=(self.latent_dim,))
    img = model(noise)

    return Model(noise, img)
Run Code Online (Sandbox Code Playgroud)

然后,为了加载权重,我正在执行以下操作:

self.my_model = self.build_model()

input = Input(shape=(self.latent_dim,))
img = self.my_model(input)
output = self.my_critic(img)

self.the_model = Model(input, output)
self.the_model.compile(loss= self.wasserstein_loss,optimizer=optimizer)    

self.the_model.compile(...) # the same options as in case of training
self.the_model.load_weights('models/stored_weights') 
Run Code Online (Sandbox Code Playgroud)

编辑:

我更仔细地检查了我的代码,发现我的问题与众不同且更加复杂。我的代码对应于Wasserstein GAN的实现。我正在训练的模型不是仅使用build_model直接构建的。但是,它是该模型和评论者的组合(因此这两个模型是组合的)。首先,我定义我的模型(是我的生成器)self.my_model = self.build_model(),然后有self.the_model = Model(输入,输出),其中输入是my_model的输入:input = Input(shape=(self.latent_dim,))而输出是评论者的输出:

img = self.my_model(input)
output = self.my_critic(img)
Run Code Online (Sandbox Code Playgroud)

因此,我不是在训练和存储my_model的权重,而是其中之一the_model(因为我想同时训练my_model和评论者)。

因此,我试图做:self.the_model.load_weights('models/gen_vv_face_feats__')代替my_model.load_weights

现在,我收到以下错误:

ValueError:轴与数组不匹配

Ove*_*gon 6

问题的一部分可能在于Model(noise, img),其中img是整个Sequential可能作为一个处理的模型单层时装载重量(见下文) -这取决于如何的权重被保存。

为了更好地理解该问题,这将有助于查看您的保存代码-因为您的代码按原样提供(添加了保存代码)对我有用。有关您可以尝试的解决方法,请参见下文。


可能的问题:

model = build_model()
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 12)                0         
_________________________________________________________________
sequential_1 (Sequential)    (None, 28, 112, 16)       623824    
=================================================================
Total params: 623,824
Trainable params: 623,184
Non-trainable params: 640
Run Code Online (Sandbox Code Playgroud)

对我有用的是

model_to_save = build_model()
model_to_save.compile()
model_to_save.save_weights(path)

model_to_load = build_model()
model_to_load.compile()
model_to_load.load_weights(path)
Run Code Online (Sandbox Code Playgroud)

解决方法和提示

要修复,不被丢弃noise =image =Model(...)线完全,并简单地做return model:你原来Input应该已经做你打算什么noise =

此外,如果您需要与多个输入/输出,采用了先进的功能Model,与工作轻松很多-不要混用Model瓦特/ Sequential除非非常特殊的原因。