keras.layers.Embedding及加载预训练word2vec

keras.layers.Embedding

主要参数:

input_dim:词汇表的大小,即len(vocab)

output_dim:嵌入向量的维度

input_length:输入样本的长度

输入尺寸:(batch_size, input_length)

输出尺寸:(batch_size, input_length, output_dim)

示例

from keras.models import Sequential
from keras.layers import Embedding
import numpy as np
 
model = Sequential()
# 词汇表大小为4,每个词被映射为10维向量,输入样本长度为5。
model.add(Embedding(4, 10, input_length=5))

# 随机生成2个长度为5的样本
data = np.random.randint(4, size=(2, 5))
 # data: [[3 0 2 1 3]
 # 		[0 0 2 3 2]]
model.compile('rmsprop', 'mse')
output = model.predict(data)
# print(output)
assert output.shape == (2, 5, 10)

当预先加载已经训练好的词嵌入模型(如Word2vec)时,Embedding层会使用训练好的模型初始化权重,否则会随机初始化权重(如上述代码)。
关于word2vec的原理可以参考这篇文章。

加载预训练模型

from keras.models import Sequential
from keras.layers import Embedding
import numpy as np
from gensim.models import word2vec

# 加载模型
model_name = 'Domain-Word2vec.model' 
# 嵌入向量维度
Embedding_dim = 100
embedding_model = word2vec.Word2Vec.load(model_name)

word2idx = {'PAD': 0}
# 所有词对应的嵌入向量 [(word, vector)]
vocab_list = [(k, embedding_model.wv[k]) for k, v in embedding_model.wv.vocab.items()]
# [len(vocab)+1, embedding_dim] '+1'是增加了一个'PAD'
embeddings_matrix = np.zeros((len(embedding_model.wv.vocab.items()) + 1,\
 								embedding_model.vector_size))
# word2idx 字典
for i in range(len(vocab_list)):
    word = vocab_list[i][0]
    word2idx[word] = i + 1
    embeddings_matrix[i + 1] = vocab_list[i][1]

# 初始化keras中的Embedding层权重
embedding = Embedding(input_dim=len(embeddings_matrix),
                  output_dim=Embedding_dim,
                  weights=[embeddings_matrix], # 预训练参数
                  trainable=False)

model = Sequential()
model.add(embedding)

你可能感兴趣的:(NLP,深度学习,自然语言处理,神经网络)