重用一组 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 层的主要内容,如果未能解决你的问题,请参考以下文章