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

时间:2019-04-09 10:34:29

标签: python tensorflow keras conv-neural-network

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

最终结果应该是这样的:

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个模型和Dense层):

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

[...]

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

1 个答案:

答案 0 :(得分:0)

我尝试使用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一起使用。我认为它应该对您有用。