簡體   English   中英

在預訓練的Keras模型中替換嵌入層

[英]Replacing the embedding layer in a pretrained Keras model

我正在嘗試替換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])

我還注意到,新嵌入層的輸出形狀是“多個”,而不是(無,無,300)。 也許這與問題有關?

誰能告訴我我所缺少的嗎?

如果您嵌入的圖層具有相同的形狀,則可以像以前一樣簡單地加載模型:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM