我使用EfficientNet训练了一个新的网络来进行对象检测,而不是使用EfficientNet的原始输出层,而是将其更改为5个输出密集层(原始层有5个标签)。 在训练过程中,我锁定了所有图层,只训练了我的自定义输出层 我设法在自定义输出层标签中获得了更好的结果 (在EfficientNet中,他们达到了84%,而我设法获得了92%的平均准确率) 我想获得原始的1000个标签以及我自己的5个输出层
TLDR
我要实现的目标是:
假设我有2个神经网络:A,B它们都包含N-1个相同的层和不同的输出层
因为它们直到输出层都是相同的,所以在输出层之前它们都具有相同的输出
我想运行模型B,然后获取辍学层的输出,针对模型A输出层运行此输出,而不是再次运行两个模型 有可能还是我正面临着XY problem ? 用2个输出层创建神经网络的正确方法是什么?
我说明了这个问题:
答案 0 :(得分: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]输出的新模型