将层列表添加到 keras 模型计算图中(功能 API)
Adding a list of layers to a keras model computation graph (functional API)
编辑:更多说明 -
我有一个预训练模型文件,我可以从中加载和提取 model.layers
和 model.weights
。此模型可能具有一组复杂的互连层。
我希望能够直接使用 model.layers
或 model()
文件将其附加到另一个神经网络中的层。
#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)
编辑:更多说明 -
我有一个预训练模型文件,我可以从中加载和提取 model.layers
和 model.weights
。此模型可能具有一组复杂的互连层。
我希望能够直接使用 model.layers
或 model()
文件将其附加到另一个神经网络中的层。
#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)