编辑:进一步澄清 –
我有一个预训练的模型文件,我可以加载并从中提取model.layers
和model.weights
。这个模型可能有一组复杂的互连层。
我想能够直接使用model.layers
或model()
文件,将其附加到另一个神经网络中的层上。
#虚拟模型 - 这个函数对我不可用;我只有模型文件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 modelpretrained_model = model1() #我只有这个!L = pretrained_model.layersprint(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>]
我想取出Dense层L[1:]
,并将它们添加到另一个架构中(不是权重,只是层)。就像@Anton在他的解决方案中描述的那样。
inp = layers.Input((3,))x = Dense(3, activation='relu')(inp)m0 = get_layers(pretrained_model)(x) #<---out = layers.Dense(2)(m0)
这应该会给我一个model.summary()
,显示5层 – 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 modelsecond_model = model2()
如果我们查看second_model
的图表,我们可以看到它确实包含了model1
的层
我们可以使用以下代码生成上述图像
tf.keras.utils.plot_model(second_model, show_shapes=True, expand_nested=True)