重用一组Keras图层

sib*_*iby 6 python autoencoder keras tensorflow

我知道您可以重用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')
Run Code Online (Sandbox Code Playgroud)

在第一个模型中使用:

decoded = decoder_layer_1(z)
decoded = decoder_layer_2(decoded)
Run Code Online (Sandbox Code Playgroud)

在第二个模型中使用:

_decoded = decoder_layer_1(decoder_input)
_decoded = decoder_layer_2(_decoded)
Run Code Online (Sandbox Code Playgroud)

如果我只需要重用几个层,则上述方法是可以的,如果我想重用大量的层(例如,具有10个层的解码器网络),则比较麻烦。除了显式声明每一层之外,还有其他更有效的方法吗?是否有实现它的方法,如下所示:

decoder_layers = group_of_layers() 
Run Code Online (Sandbox Code Playgroud)

在第一个模型中重复使用:

decoded = group_of_layers(z)
Run Code Online (Sandbox Code Playgroud)

在第二个模型中重复使用:

_decoded = group_of_layers(decoder_input)
Run Code Online (Sandbox Code Playgroud)

Luk*_*ský 6

我也在这个问题上挣扎。对我有用的是将共享部件包装在模型中,并使用其自己的输入定义:

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)
Run Code Online (Sandbox Code Playgroud)

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

group = group_of_layers(intermediate_dim)
result1 = group(previous_layer)
result2 = group(different_previous_layer)
Run Code Online (Sandbox Code Playgroud)

届时将共享权重。

这在文档中有很好的描述,请参阅共享视觉模型