gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:02:43 25 4
gpt4 key购买 nike

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

ValueError: You are trying to load a weight file containing 2 layers into a model with 1 layers.



我发现这是一个常见的错误。但是,提议的补救措施似乎对我不起作用。我试图降级我当前的 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)

然后,为了加载权重,我正在做类似的事情:
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(input, output) 其中 input 是 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: axes don't match array

最佳答案

部分问题可能出在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除非出于非常具体的原因。

关于python - Keras 您正在尝试将包含 2 层的权重文件加载到具有 1 层的模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com