【发布时间】:2019-11-14 17:48:13
【问题描述】:
我正在关注 keras 团队的 github 代码,了解如何使用预训练的词嵌入。我能够理解其中的大部分内容,但我对矢量大小有疑问。我希望有人可以帮助我。
首先我们定义Tokenizer(num_words=MAX_NUM_WORDS)
根据 keras docs forTokenizer() num_words 参数只考虑 MAX_NUM_WORDS - 1 所以如果 MAX_NUM_WORDS=20000 我会有大约 19999 字。
num_words:要保留的最大单词数,基于单词 频率。只会保留最常见的 num_words-1 个单词。
接下来在代码中,我们准备一个基于手套向量的Embedding Matrix。这样做时,我们正在考虑一个大小为 (20001, 100)np.zeros((MAX_NUM_WORDS+1, 100)) 的矩阵。如果我们的词汇表中只有 19999 单词,我不明白为什么要考虑使用 20001 的矩阵。
然后我们将num_words 传递给嵌入层。根据 input_dim 参数的嵌入层文档,它说,
input_dim: int > 0. 词汇的大小,即最大整数索引 + 1。
embedding_layer = Embedding(input_dim=num_words,
output_dim=EMBEDDING_DIM,
embeddings_initializer=Constant(embedding_matrix),
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
根据Tokenizer()函数,这里我们的词汇量将是19999,对吧?那么为什么我们将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)
【问题讨论】:
标签: python python-3.x tensorflow keras