首页 > 解决方案 > 如何将训练有素的网络用作另一个网络keras中的分支?

问题描述

假设我有与此类似的网络: 网络

[ICNet_Keras] ( https://github.com/aitorzip/Keras-ICNet/blob/master/model.py )

这个 repo 中的 train 程序是错误的!

它有三个分支。分辨率 1/4 分支是一个预训练的网络,具有保存的权重。分辨率 1/2 分支是 1/4 网络的一部分,并且与 1/4 共享权重(我不知道如何)分辨率 1 分支是我的自定义。

火车程序是这样的:

1/4 在 Cityscapes 上进行训练(用于放松)保存并重新加载
1/4 分支的前几层用于提供分辨率 1/2 的图像
最后一个分支用于全分辨率图像。
这些分支与 CFF(级联特征融合模块)有关。

如何加载 1/4 的预训练权重并训练整个网络?
1/4 和 1/2 分支中的某些层之间的权重共享如何?

为简单起见,您可以假设

1/4 有 5 层单独训练并加载用于微调
1/2 有 2 个第一层 1/4
1 有 2 个独立层
,CFF 只是上采样+连续

标签: python-3.xtensorflowkerasdeep-learning

解决方案


有你的输入张量:

inputs = Input(size)

如果您自己训练模型,请确保使用可变图像大小(它是卷积的,对吗?)进行训练:输入形状 = (None, None, channels).

如果没有,您将需要重建具有可变图像大小的模型。确保你不使用Flatten,它不支持可变图像大小。如果您想使用展平后的内容,它将不支持重量转移。

1/4

加载你保存的模型(不需要编译,你不是直接训练它):

lowRes = load_model(filename, compile=False, custom_objects=if_needed)

通过它传递输入(也许先做一些重新调整)

lowOut = lowRes(inputs)

1/2

获取片段lowRes

midRes = Model(lowRes.input, lowRes.layers[1].output)

通过它传递输入(也许先做一些重新调整)

midOut = midRes(inputs)

1/1

构建它是什么:

....
....
hiRes = Model(....)

通过它传递输入:

hiOut = hiRes(inputs)

旧答案

图层和模型可以根据需要多次使用。

共享层:

创建图层:

layer = Conv2D(....)

使用图层:

out1 = layer(input1)
out2 = layer(input2)
out3 = layer(input3)

这是同一层,所以,相同的权重。

共享模型:

AModel a Layer,所以它的工作原理完全相同:

model = load_some_model()

branch1_out = model(input_branch1)    
branch2_out = model(input_branch2)

最终型号:

最后,只需创建一个定义输入张量和输出张量的模型:

final_model = Model(inputs = input_or_list_of_inputs, 
                    outputs= output_or_list_of_outputs)

推荐阅读