迁移学习后如何使用原始输出层并获得两个模型的预测?
After transfer learning how to use original output layer and get both models predictions?
我使用 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 problem
?
创建具有 2 个输出层的神经网络的正确方法是什么?
我说明了问题:
我找到了方法,只需要找到分割点
复制第一层并将其输入定向到另一个模型,然后将所有层连接在一起
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]
我使用 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 problem ? 创建具有 2 个输出层的神经网络的正确方法是什么?
我说明了问题:
我找到了方法,只需要找到分割点 复制第一层并将其输入定向到另一个模型,然后将所有层连接在一起
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]