【问题标题】:How to use a trained network as a branch in another network keras?如何将训练有素的网络用作另一个网络keras中的分支?
【发布时间】:2019-07-28 11:52:20
【问题描述】:

假设我的网络与此类似:

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

此 repo 中的训练程序错误!

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

train 过程是这样的:

1/4 接受过保存和重新加载的 Cityscapes(用于放松)的训练
1/4 分支的前几层用于馈送分辨率为 1/2 的图像
最后一个分支用于全分辨率图像。
这些分支与 CFF(Cascade Feature Fusion module)相关。

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

为简单起见,您可以假设

1/4 有 5 层分别训练并加载以进行微调
1/2 有 2 个第一层 1/4
1 有 2 个独立层
而 CFF 只是 upsample+concat

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning


    【解决方案1】:

    输入张量:

    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)
    

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

    共享模型:

    ModelLayer,所以它的工作原理完全相同:

    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)
    

    【讨论】:

    • 谢谢,我明白了重量分享。但对于模型共享假设 1/4 被保存,然后加载到模型。 1/2 是平行通道中 1/4(例如前 5 层)的一部分。所以我需要重新定义它,从 1/4 中提取相应的权重并分配给它(有更好的解决方案吗?!)。然后添加我的自定义分支。这就是复杂的地方!
    • 你为什么不用你想要的网络的细节来编辑你的问题呢?解决方案不是很困难。
    • 你说模型是层。 model.compile() 中的配置怎么样,我是否要为新模型清除它们?
    • 我正在尝试弄清楚如何实现我的配置,这在大多数方面类似于 icnet。但是 keras 中的 icnet 实现是错误的。
    • 编译只添加损失函数和优化器。对于您不会调用fit 的模型,这是完全没有必要的。只有您调用 fit 的模型需要优化器和损失。
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2017-03-19
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多