После передачи обучения, как использовать оригинальный выходной слой и получить предсказания обеих моделей? - PullRequest
0 голосов
/ 09 ноября 2019

Я обучил новую сеть, используя EfficientNet для обнаружения объектов, вместо того, чтобы использовать исходный выходной слой EfficientNet, я изменил его на 5 плотных выходных данных ( 5 меток от исходного слоя ). в процессе обучения я заблокировал все слои и только обучил свой пользовательский выходной слой. Мне удалось добиться лучшего результата в моих пользовательских метках выходного слоя (в EfficientNet они достигли 84%, мне удалось получить в среднем точность 92%). хотел бы получить оригинальную метку 1000, а также мой собственный 5 выходной слой

TLDR

, что я пытаюсь достичь, это:

скажемУ меня есть 2 нейронные сети: A, B они оба содержат N-1 идентичных слоев и различный выходной слой

  • A (выходной слой) dim составляет 5
  • B (выходной слой) dim равен 1000

, поскольку они оба идентичны до тех пор, пока выходной слой не будет иметь одинаковый выходной сигнал до выходного слоя

Я хотел бы запустить модель Bзатем получите выходные данные выпадающего слоя, запустите эти выходные данные для выходного слоя модели A вместо того, чтобы снова запускать обе модели, возможно ли это, или я столкнулся с проблемой XY ? Как правильно создать нейронную сеть с 2 выходными слоями?

Я иллюстрировал проблему:

enter image description here

1 Ответ

0 голосов
/ 11 ноября 2019

Я нашел, как это сделать, просто нужно найти точку разделенной копии первого слоя и направить ее ввод в другую модель, а затем объединить все слои вместе

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.output, B.output]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...