我正在尝试合并经过不同数据集和类数训练的两个模型,以获得具有唯一输入和唯一输出的最终模型。
最终结果应该是这样的:
实际上我的代码是这样的:
[...]
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])
[...]
我认为我做错了什么,但我不知道是什么:/
答案 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
一起使用。我认为它应该对您有用。