【问题标题】:Replacing the embedding layer in a pretrained Keras model替换预训练 Keras 模型中的嵌入层
【发布时间】:2018-12-21 02:15:05
【问题描述】:

我正在尝试替换 Keras NLP 模型中的嵌入层。我已经为一种语言训练了模型,但我想将它转移到另一种我有类似嵌入的语言。我希望通过用目标语言的索引到嵌入映射替换源语言的索引到嵌入映射来实现这一点。

我试过这样做:

from keras.layers import Embedding
from keras.models import load_model

filename = "my_model.h5"
model = load_model(filename)

new_embedding_layer = Embedding(1000, 300, weights=[my_new_embedding_matrix], trainable=False)
new_embedding_layer.build((None, None))
model.layers[0] = new_embedding_layer

当我打印出模型摘要时,这似乎奏效了:新的嵌入层具有正确数量的参数 (1000*300=300,000):

_________________________________________________________________
None
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_85 (Embedding)     multiple                  300000    
_________________________________________________________________
lstm_1 (LSTM)                (None, 128)               219648    
_________________________________________________________________
dense_1 (Dense)              (None, 23)                2967      
=================================================================
Total params: 522,615
Trainable params: 222,615
Non-trainable params: 300,000

但是,当我使用新模型处理新示例时,似乎没有发生任何变化:它仍然接受值大于新词汇大小 1000 的输入序列,并返回与以前相同的预测。

seq = np.array([10000])
model.predict([seq])

我还注意到新嵌入层的输出形状是“多个”而不是 (None, None, 300)。也许这与问题有关?

谁能告诉我我错过了什么?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    如果您嵌入的图层具有相同的形状,那么您可以像以前一样简单地加载模型:

    from keras.models import load_model
    
    filename = "my_model.h5"
    model = load_model(filename)
    

    然后,您可以简单地设置旧嵌入层的权重,而不是构建新的嵌入层:

    model.layers[idx_of_your_embedding_layer].set_weights(my_new_embedding_matrix)
    

    【讨论】:

    • 作为快捷方式,也可以直接使用model.load_weights(fname, by_name=True),见the Keras FAQ
    猜你喜欢
    • 2021-05-20
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多