0

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

TLDR

我想要实现的是:

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

  • A(输出层)dim 为 5
  • B(输出层)dim 为 1000

因为它们在输出层之前都是相同的,所以它们在输出层之前都将具有相同的输出

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

我说明了问题:

在此处输入图像描述

4

1 回答 1

0

我发现怎么做只需要找到分割复制第一层的点并将其输入引导到另一个模型,然后将所有层连接在一起

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]

于 2019-11-11T15:15:02.707 回答