keras-嵌入层,我可以改变模型管道中经过训练的嵌入层的值吗?

keras-嵌入层,我可以改变模型管道中经过训练的嵌入层的值吗?,keras,embedding,Keras,Embedding,我在本页列举了以下例子: 它使用嵌入层在数据上训练单词嵌入,如下所示: model = Sequential() model.add(Embedding(100, 8, input_length=max_length)) model.add(Flatten()) model.add(Dense(1, activation='sigmoid')) # compile the model model.compile(optimizer='adam', loss='binary_crossentrop

我在本页列举了以下例子:

它使用嵌入层在数据上训练单词嵌入,如下所示:

model = Sequential()
model.add(Embedding(100, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
# summarize the model
print(model.summary())
该模型从从数据中学习单词嵌入开始,为每个单词创建一个8维向量

我想做的是,在学习了这个嵌入之后,我想通过在每个向量的末尾增加两个维度来改变矩阵(或每个单词的向量)。我将有另一个过程来计算这两个维度的值

还有什么我可以做的吗


事先非常感谢

是的,这是可能的。请尝试使用以下步骤执行此操作:

  • 提取权重矩阵:

    weight_matrix = model.layers[0].get_weights()[0] # Matrix shape (100, 8).
    
  • 附加向量:

    new_weight_matrix = your_append(weight_matrix)
    # Be sure that new_weight_matrix has shape of (100, 10)
    
  • 生成模型的调整副本:

    new_model = Sequential()
    new_model.add(Embedding(100, 10, input_length=max_length)) # Notice a change
    new_model.add(Flatten())
    new_model.add(Dense(1, activation='sigmoid'))
    
  • (可选)冻结图层:如果要冻结嵌入集:

    new_model = Sequential()
    new_model.add(Embedding(100, 10, input_length=max_length
        trainable=False)) # Notice a change
    new_model.add(Flatten())
    new_model.add(Dense(1, activation='sigmoid'))
    
  • 编译一个新模型:

    new_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    

  • 非常感谢。这一切都必须在前一个模型被称为“编译”并在数据上进行拟合之后进行吗?您需要重新拟合您的模型-因为它的架构发生了变化。谢谢我理解重新拟合。。。我的意思是以前的模型,我想它必须进行拟合才能获得重量,对吗?然后我用你的代码在修改matrixRight后重新安装模型。你的方法似乎有道理。你们可以用冰冻层而不是冰冻层来测试它。嗨-我的答案有用吗-如果是的话,我希望你们接受并投票:)