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

时间:2019-10-01 08:43:43

标签: python keras

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

  

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

我发现这是一个常见错误。但是,建议的补救措施似乎对我没有用。我试图将当前的2.2.4的Keras版本降级为2.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)

然后,为了加载重量,我正在做类似的事情:

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') 

编辑:

我仔细检查了我的代码,发现我的问题与众不同且更加复杂。我的代码对应于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)

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

因此,我尝试做:self.the_model.load_weights('models/gen_vv_face_feats__')而不是my_model.load_weights

现在我收到以下错误:

  

ValueError:轴与数组不匹配

1 个答案:

答案 0 :(得分: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

对我有用的

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)

解决方法+提示

要按原样修复,请完全删除noise =image =Model(...)行,并简单地执行return model:原始Input应该已经用noise =完成您打算做的事情。

此外,如果您需要具有多个输入/输出的高级功能,请使用Model,使用起来更容易-除非特别说明,否则不要混用ModelSequential原因。