我知道您可以重复使用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)
答案 0 :(得分: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。
答案 1 :(得分:0)
您可以尝试:
def group_of_layers(x, intermediate_dim):
x = Dense(intermediate_dim,activation='relu',name='decoder_layer_1')(x)
x = Dense(intermediate_dim,activation='relu',name='decoder_layer_2')(x)
return x
然后:
decoded = group_of_layers(z, intermediate_dim)
_decoded = group_of_layers(decoder_input, intermediate_dim)
您必须事后声明模型的输入和输出,例如对于第二个模型:
model = Model(inputs = decoder_input, outputs = _decoded)
您还可以添加最终图层,如:
final_layer = Dense(...)(_decoded)
model = Model(inputs = decoder_input, outputs = final_layer)