Python Keras使用共享层在训练模型后修剪层

Python Keras使用共享层在训练模型后修剪层,python,tensorflow,keras,Python,Tensorflow,Keras,我正在尝试训练一个搜索和项目编码器,这就是我的模型 input_search = Input(shape=(40,), dtype='int64', name='input_search') input_title = Input(shape=(40,), dtype='int64', name='input_title') input_desc = Input(shape=(40,), dtype='int64', name='input_desc') input_brand = Input(

我正在尝试训练一个搜索和项目编码器,这就是我的模型

input_search = Input(shape=(40,), dtype='int64', name='input_search')
input_title = Input(shape=(40,), dtype='int64', name='input_title')
input_desc = Input(shape=(40,), dtype='int64', name='input_desc')
input_brand = Input(shape=(40,), dtype='int64', name='input_brand')

embedding = Embedding(input_dim=20000, output_dim=50, input_length=40)
s_emb = embedding(input_search)
t_emb = embedding(input_title)
d_emb = embedding(input_desc)
b_emb = embedding(input_brand)

s = GlobalMaxPool1D()(s_emb)
t = GlobalMaxPool1D()(t_emb)
d = GlobalMaxPool1D()(d_emb)
b = GlobalMaxPool1D()(b_emb)

concat = concatenate([t, d, b])
concat = Dense(128)(concat)
s = Dense(128, name='vec')(s)
similarity = Lambda(cos_sim)([s, concat])

model = Model(inputs=[input_search, input_desc, input_brand, input_title], outputs=similarity)
项目有3个特征-标题、描述和品牌。我想在所有4个输入之间使用相同的嵌入层来生成相同向量空间中的嵌入。但是,对于预测时间,我想删除该项的3个输入,并将模型的输出作为名为“vec”的密集层的嵌入向量来存储特征向量。这就是我尝试过的:

search_model = Model(model.inputs[0], model.layers[-2].output)
item_model = Model(inputs=model.inputs[1:], outputs=model.layers[-1].output)
但是我得到了错误

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_brand_1:0", shape=(None, 40), dtype=int64) at layer "input_brand". The following previous layers were accessed without issue: []

是否有一种方法可以让我在搜索和项目功能之间共享嵌入层权重,从而允许我随时修剪某些层?或者创建两个独立的嵌入层,其中一个通过搜索运行,另一个通过项目的3个特征运行,但以某种方式保持两个层中的权重相同?

您可以创建搜索模型,但不能创建项目模型。搜索模型具有从输入到vec层的独立组件,可以提取这些组件。对于item_model no,因为它还涉及在相似性层中使用输入_搜索。如果你只想使用标题、描述和品牌组件,你可以提取浓缩物(就像你对搜索词所做的那样)。你可以创建搜索模型,但不能创建项目模型。搜索模型具有从输入到vec层的独立组件,可以提取这些组件。对于item_model no,因为它还涉及在相似性层中使用输入_搜索。如果您只想使用标题、描述和品牌组件,您可以提取concat dense(就像您对搜索词所做的那样)
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_brand_1:0", shape=(None, 40), dtype=int64) at layer "input_brand". The following previous layers were accessed without issue: []