我正在关注来自 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/

10-12 22:50