将层列表添加到 keras 模型计算图中(功能 API)

Adding a list of layers to a keras model computation graph (functional API)

编辑:更多说明 -

我有一个预训练模型文件,我可以从中加载和提取 model.layersmodel.weights。此模型可能具有一组复杂的互连层。

我希望能够直接使用 model.layersmodel() 文件将其附加到另一个神经网络中的层。

#Dummy model - this function is not available to me; only the model file
def model1():
    inp = layers.Input((3,))
    x = layers.Dense(4, activation='relu')(inp)
    out = layers.Dense(2, activation='softmax')(x)    
    model = Model(inp, out)
    return model

pretrained_model = model1() #I have THIS only!

L = pretrained_model.layers
print(L)
[<tensorflow.python.keras.engine.input_layer.InputLayer at 0x7f915d6778b0>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f915d643790>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f915e124e50>]

我想采用密集层 L[1:] 并将它们添加到另一个架构(不是权重,只是层)。 @Anton 在他的解决方案中描述的类似下面的内容。

inp = layers.Input((3,))
x = Dense(3, activation='relu')(inp)
m0 = get_layers(pretrained_model)(x) #<---
out = layers.Dense(2)(m0)

这应该给我一个有 5 层的 model.summary() - inp, x, L[1], L[2], out

但是我无法直接使用图层列表。

我可以想出一个基于这些层重新创建部分计算图的函数,但我正在寻找更简单的东西。

我已经尝试修改 model1() 函数来为我工作,如下所示,这符合我的目的,但假设我只得到一个模型文件并且有大量层,这是不可能的。

def model1(layer):
    #inp = layers.Input((3,))
    x = layers.Dense(4, activation='relu')(layer)
    out = layers.Dense(2, activation='softmax')(x)    
    model = Model(inp, out)
    return model.output

如何在另一个模型中使用模型生成器

我们可以使用生成model1()和替换

inp = layers.Input((3,))
x = Dense(3, activation='relu')(inp)
m0 = get_layers(pretrained_model)(x) # <---
out = layers.Dense(2)(m0)

inp = layers.Input((3,))
x = layers.Dense(3, activation='relu')(inp)
m0 = pretrained_model(x) # <---
out = layers.Dense(2)(m0)

如果我们想要一个新的模型生成器 model2() 将其作为函数

def model2(pretrained_model):
    inp = layers.Input((3,), name='model2_input')
    x = layers.Dense(3, activation='relu', name='model2_x')(inp)
    m0 = pretrained_model(x)
    out = layers.Dense(2, name='model2_out')(m0)
    model = Model(inp, out, name='model2')
    return model

second_model = model2()

如果我们查看 second_model 的图表,我们可以看到它确实包含模型 1

的层

我们可以使用

生成上面的图像
tf.keras.utils.plot_model(second_model, show_shapes=True, expand_nested=True)