gpt4 book ai didi

python - 尝试合并两个模型的输入和输出时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:11 25 4
gpt4 key购买 nike

我正在尝试合并使用不同数据集和类数训练的 2 个模型,以获得具有唯一输入和唯一输出的最终模型。

最终结果应该是这样的:

diagram of the final model

其实我的代码是这样的:

[...]
stuffs with imports, tensorboard and imageDataGenerator
[...]

model_simple = load_model("model_simple.h5")
model_simple.name = 'model_simple'
for layer in model_simple.layers:
layer.trainable = False
layer.name = layer.name + str("_simple")

model_complexe = load_model("model_complexe.h5")
model_complexe.name = 'model_complexe'
for layer in model_complexe.layers:
layer.trainable = False
layer.name = layer.name + str("_complexe")


model_simple.layers.pop(0)
model_complexe.layers.pop(0)

input_common = Input(shape=(299, 299, 3), name="input_common")

model_simple_output = model_simple(input_common)
model_complexe_output = model_complexe(input_common)


x = concatenate([model_simple_output, model_complexe_output])
x = Dense((2 * NB_CLASSES), activation='relu')(x)
x = Dense((2 * NB_CLASSES)*2, activation='relu')(x)
x = Dense((2 * NB_CLASSES)*2, activation='relu')(x)
x = Dense(NB_CLASSES, activation='relu')(x)
output = Dense(NB_CLASSES, activation='sigmoid')(x)


model = Model(inputs=input_common, outputs=output)

model.compile(optimizer=Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-8, amsgrad=True), loss='categorical_crossentropy', metrics=['acc'])



model.fit_generator(
train_generator,
steps_per_epoch=NB_FIC_TRAIN // BATCH_SIZE,
epochs=1,
validation_data=validation_generator,
validation_steps=NB_FIC_VAL // BATCH_SIZE,
callbacks = [tensorboard]
)

model.save("modele_final.h5")

当我启动它时,它不会崩溃并且正在训练,但是当我仔细观察时,它似乎一团糟(当我尝试将其转换为 .pb 时,它会抛出错误,说模型有 0张量输入)。

最终文件的大小与 model_simple.h5 文件几乎相同,当我用 netron 查看该文件时,不同的部分(2 个模型和密集层)似乎没有连接:

The input don't seems to be connected to anything

(“简单”模型的层位于左侧,“复杂”模型的层位于右侧)

并且串联层将模型作为输入而不是模型输出:

Weird inputs for the concatenation layer

如果我像这样使用“.output”,效果是一样的:

[...]

model_simple_output = model_simple(input_common)
model_complexe_output = model_complexe(input_common)

new_model_simple = Model(input_common, model_simple_output)
new_model_complexe = Model(input_common, model_complexe_output)

x = concatenate([new_model_simple.output, new_model_complexe.output])

[...]

我认为我做错了什么,但我不知道是什么:/

最佳答案

我尝试使用 VGG16 和 VGG19 创建您的用例,如下所示:

from keras.layers import *
from keras.models import *
from keras.applications.vgg16 import VGG16
from keras.applications.vgg19 import VGG19

model_1 = VGG16(include_top=True, weights='imagenet')
model_2 = VGG19(include_top=True, weights='imagenet')

然后我使用了您的脚本的一部分来连接模型。

NB_CLASSES = 73

input_common = Input(shape=(224, 224, 3), name="input_common")

model_simple_output = model_1(input_common)
model_complexe_output = model_2(input_common)

x = concatenate([model_simple_output, model_complexe_output])
x = Dense((2 * NB_CLASSES), activation='relu')(x)
x = Dense((2 * NB_CLASSES)*2, activation='relu')(x)
x = Dense((2 * NB_CLASSES)*2, activation='relu')(x)
x = Dense(NB_CLASSES, activation='relu')(x)
output = Dense(NB_CLASSES, activation='sigmoid')(x)

model = Model(inputs=input_common, outputs=output)

保存模型。如果您只使用 model.save ,它也应该可以工作。但您也可以尝试使用 model.to_json() 将模型保存为 json这会将模型保存为字符串。它不会保存您的权重,如果您想单独保存权重,请使用 model.save_weights

model.summary()
model.save('model.h5')

model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)

我可能使用了您使用过的相同文件将 .h5 文件转换为 .pb

git clone https://github.com/amir-abdi/keras_to_tensorflow.git

python keras_to_tensorflow/keras_to_tensorflow.py --input_model=model.h5 \
--input_model_json=model.json \
--output_model=model.pb

keras_to_tensorflow.py 也可以在没有 --input_model_json=model.json 的情况下工作,因为 model.h5 包含模型和权重。但对于您的情况,我更愿意与 --input_model_json 一起使用。我认为它应该适合你。

关于python - 尝试合并两个模型的输入和输出时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590785/

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