重用一组 Keras 层

Posted

技术标签:

【中文标题】重用一组 Keras 层【英文标题】:Reusing a group of Keras layers 【发布时间】:2018-09-22 19:43:53 【问题描述】:

我知道您可以重复使用 Keras 层。例如,我为解码器网络声明了两层:

decoder_layer_1 = Dense(intermediate_dim,activation='relu',name='decoder_layer_1')
decoder_layer_2 = Dense(intermediate_dim,activation='relu',name='decoder_layer_2')

在第一个模型中使用:

decoded = decoder_layer_1(z)
decoded = decoder_layer_2(decoded)

在第二个模型中使用:

_decoded = decoder_layer_1(decoder_input)
_decoded = decoder_layer_2(_decoded)

如果我只需要重用几层,上面的方法是可以的,如果我想重用大量的层(例如,一个有 10 层的解码器网络),则很麻烦。除了明确声明每一层之外,是否有更有效的方法来做到这一点。有没有办法实现如下图:

decoder_layers = group_of_layers() 

在第一个模型中重用:

decoded = group_of_layers(z)

在第二个模型中重用:

_decoded = group_of_layers(decoder_input)

【问题讨论】:

【参考方案1】:

我也遇到过这个问题。对我有用的是用自己的输入定义将共享部分包装在模型中:

def group_of_layers(intermediate_dim):
    shared_model_input = keras.layers.Input(shape=...)
    shared_internal_layer = keras.layers.Dense(intermediate_dim, activation='relu', name='shared_internal_layer')(shared_model_input)
    shared_model_output = keras.layers.Dense(intermediate_dim, activation='relu', name='shared_model_output')(shared_internal_layer)
    return keras.models.Model(shared_model_input, shared_model_output)

在 Functional API 中,您可以以与单个层相同的方式使用共享模型,只要模型的输入层与您应用的层的形状相匹配:

group = group_of_layers(intermediate_dim)
result1 = group(previous_layer)
result2 = group(different_previous_layer)

然后将共享权重。

这在文档中有很好的描述,请参阅Shared vision model。

【讨论】:

以上是关于重用一组 Keras 层的主要内容,如果未能解决你的问题,请参考以下文章

如何重用keras功能模型的层级

如何在 Keras 中重用 VGG19 进行图像分类?

Keras:在新实验中重用训练过的权重

ruby 一组新的rails项目的基本可重用设置/配置。

代码质量第 2 层 - 可重用的代码

在 Tensorflow 中重用层权重