Neural network 迁移学习后,如何使用原始输出层并获得两个模型的预测?

Neural network 迁移学习后,如何使用原始输出层并获得两个模型的预测?,neural-network,transfer-learning,efficientnet,Neural Network,Transfer Learning,Efficientnet,我使用EfficientNet为目标检测训练了一个新的网络,而不是使用EfficientNet的原始输出层,我将其更改为5个输出密度(5个标签来自原始层)。 在训练过程中,我锁定了所有层,只训练我的自定义输出层 我设法在自定义输出层标签中获得了更好的结果 (在EfficientNet中,他们达到了84%,我设法获得了平均92%的准确率) 我想得到原来的1000标签,也是我自己的5输出层 TLDR 我试图实现的是: 假设我有两个神经网络:A,B它们都包含N-1个相同的层和不同的输出层 (输出层)

我使用EfficientNet为目标检测训练了一个新的网络,而不是使用EfficientNet的原始输出层,我将其更改为5个输出密度(5个标签来自原始层)。 在训练过程中,我锁定了所有层,只训练我的自定义输出层 我设法在自定义输出层标签中获得了更好的结果 (在EfficientNet中,他们达到了84%,我设法获得了平均92%的准确率) 我想得到原来的1000标签,也是我自己的5输出层

TLDR

我试图实现的是:

假设我有两个神经网络:A,B它们都包含N-1个相同的层和不同的输出层

  • (输出层)尺寸为5
  • B(输出层)尺寸为1000
因为它们在输出层之前都是相同的,所以它们在输出层之前都有相同的输出

我想运行模型B,然后获得退出层的输出,对模型A输出层运行这个输出,而不是再次运行两个模型 是可能的还是我正面临 ? 创建具有两个输出层的神经网络的正确方法是什么

我举例说明了这个问题:


我发现了如何做,只需要找到拆分点 复制第一层并将其输入定向到另一个模型,然后将所有层连接在一起

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