python - 替换预训练 Keras 模型中的嵌入层
问题描述
我正在尝试替换 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)。也许这与问题有关?
谁能告诉我我错过了什么?
解决方案
如果您嵌入图层具有相同的形状,那么您可以像以前一样简单地加载模型:
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)
推荐阅读
- javascript - 在引导模式中显示输入的问题
- regex - 如何通过正则表达式匹配和黑名单 GMail 地址
- react-native - React-Native StatusBar 的隐藏属性在 React-Native Modal 组件中无法正常工作
- angular - 在 Angular 中为 Toolbar 或 TextEditor 创建单个配置文件
- c++ - 为什么动态转换仅适用于引用和指针
- ssis-2012 - 通过ssis执行sql任务执行Postgres调用函数时抛出错误
- mysql - MySQL Query to get all neighborhoods which a user did not join
- unicode - 如何在ubuntu18.04中安装尼泊尔语unicode繁体
- c - 递归阶乘返回语句
- android - 检查是否同时单击了两个按钮