После переноса обучения, как использовать исходный выходной слой и получить прогнозы обеих моделей?
Я обучил новую сеть, используя EfficientNet для обнаружения объектов, вместо того, чтобы использовать исходный выходной слой EfficientNet, я изменил его на 5 плотных выходов (5 меток из исходного слоя). в процедуре обучения я заблокировал все слои и обучил только свой настраиваемый выходной слой, мне удалось добиться лучшего результата в моих настраиваемых метках выходного слоя (в EfficientNet они достигают 84%, мне удалось получить в среднем 92% точности), я бы хотел бы получить оригинальную этикетку 1000, а также мой собственный 5 выходных слоев
TL; DR
я пытаюсь достичь этого:
скажем, у меня есть 2 нейронные сети: A, B, они обе содержат N-1 идентичных слоев и разные выходные слои
- A (выходной слой) dim равен 5
- B (выходной слой) dim - 1000
потому что они оба идентичны до выходного слоя, они оба будут иметь одинаковый выход до выходного слоя
Я хотел бы запустить модель B, а затем получить результат слоя исключения, запустить этот результат на уровне вывода модели A вместо повторного запуска обеих моделей, возможно ли это, или я столкнулся с проблемой XY? как правильно создать нейронную сеть с двумя выходными слоями?
Я проиллюстрировал проблему:
1 ответ
Я нашел, как это сделать, просто нужно найти точку разделения, скопировать первый слой и направить его ввод в другую модель, а затем объединить все слои вместе
efficientnet = efn.EfficientNetB0()
retrained_model = load_model(model_path, custom_objects=get_custom_objects())
top_conv = efficientnet.get_layer('top_conv')
top_conv._name = top_conv._name + str("ef0")
top_bn = efficientnet.get_layer("top_bn")
top_bn._name = top_bn._name + str("ef0")
top_activation = efficientnet.get_layer('top_activation')
top_activation._name = top_activation._name + str("ef0")
avg_pool = efficientnet.get_layer('avg_pool')
avg_pool._name = avg_pool._name + str("ef0")
top_dropout = efficientnet.get_layer('top_dropout')
top_dropout._name = top_dropout._name + str("ef0")
probs = efficientnet.get_layer('probs')
probs(top_dropout(
avg_pool(top_activation(top_bn(top_conv(retrained_model.get_layer('block7a_project_bn').output))))))
model = Model(inputs=retrained_model.input,
outputs=[retrained_model.output, probs.get_output_at(0)])
model.summary()
model.save("/home/naor/projects/efficientnetretrainedmodel/bin/model-2-pred.h5")
новая модель, созданная как вход модели A и как выход [A.output,B.output]