我已经使用Keras训练了CNN模型并存储了权重。当我尝试将它们加载回相同的模型时,出现以下错误:
ValueError:您正在尝试将包含2层的权重文件加载到具有1层的模型中。
我发现这是一个常见错误。但是,建议的补救措施似乎对我没有用。我试图将当前的Keras版本降级2.2.4为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)
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:轴与数组不匹配
问题的一部分可能在于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除非非常特殊的原因。
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |