我已经使用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:轴与数组不匹配
答案 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
,使用起来更容易-除非特别说明,否则不要混用Model
和Sequential
原因。