python-3.x - 如何将训练有素的网络用作另一个网络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 只是上采样+连续
解决方案
有你的输入张量:
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)
推荐阅读
- java - 通过 USB 电缆进行 PC 到 Android 通信
- c++ - 在 C++ 中的数据成员中存储带有变量参数的函数引用
- arrays - OCaml - 在类型中指定数组的大小
- python - Python ipykernel 未与 Errno 2 一起安装
- node.js - Firebase 云功能引发超时异常,但独立工作正常
- python - 屏幕旋转时如何调用函数?
- python - Python 3.8.6 标识符 splittext 中的无效字符
- google-api - 从命令行调用谷歌助手设备,而不是说“嘿谷歌”
- sas - 计算过去 x 年的平均值
- elixir - Elixir / Phoenix - 发送后从控制器操作中删除文件