我正在关注来自 keras 团队的关于如何使用预训练词嵌入的 github
代码。我能够理解其中的大部分内容,但我对矢量大小有疑问。我希望有人可以帮助我。
首先我们定义 Tokenizer(num_words=MAX_NUM_WORDS)
根据 keras docs for Tokenizer()
num_words 参数只考虑 MAX_NUM_WORDS - 1
所以如果 MAX_NUM_WORDS=20000
我会有 19999
字。
接下来在代码中,我们准备了一个基于手套向量的 Embedding Matrix
。这样做时,我们正在考虑一个大小为 (20001, 100) np.zeros((MAX_NUM_WORDS+1, 100))
的矩阵。如果我们的词汇表中只有 20001
单词,我不明白为什么要考虑 19999
矩阵。
然后我们将 num_words
传递给嵌入层。根据 input_dim 参数的嵌入层文档,它说,
embedding_layer = Embedding(input_dim=num_words,
output_dim=EMBEDDING_DIM,
embeddings_initializer=Constant(embedding_matrix),
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
根据
19999
函数,这里我们的词汇量大小将是 Tokenizer()
对吗?那么为什么我们将 20001
作为 input_dim
传递这是取自该 github 链接的一小段代码。
MAX_NUM_WORDS = 20000
MAX_SEQUENCE_LENGTH = 1000
EMBEDDING_DIR = 100
tokenizer = Tokenizer(num_words=MAX_NUM_WORDS)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
# prepare embedding matrix
num_words = MAX_NUM_WORDS + 1
embedding_matrix = np.zeros((num_words, EMBEDDING_DIM))
for word, i in word_index.items():
if i > MAX_NUM_WORDS:
continue
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
embedding_layer = Embedding(num_words,
EMBEDDING_DIM,
embeddings_initializer=Constant(embedding_matrix),
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
最佳答案
我认为你的怀疑是有道理的。更改是在代码的 this commit 中进行的,以将单词保留为 index = MAX_NUM_WORDS
。在此之前,Tokenizer
上有一个 commit 以使其保留 num_words
字而不是 num_words - 1
字。但是Tokenizer
的这个变化是reverted之后的。所以我猜想更新示例的作者可能假设 Tokenizer
在提交更新时保留了 num_words
字。
关于python - 在 keras 模型中使用预训练的词嵌入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56880252/