Keras 词嵌入矩阵具有第一行零
Keras word embedding matrix has first row of zeros
我正在查看 Keras Glove 词嵌入示例,不清楚为什么嵌入矩阵的第一行填充了零。
首先,在单词与数组相关联的地方创建嵌入索引。
embeddings_index = {}
with open(os.path.join(GLOVE_DIR, 'glove.6B.100d.txt')) as f:
for line in f:
word, coefs = line.split(maxsplit=1)
coefs = np.fromstring(coefs, 'f', sep=' ')
embeddings_index[word] = coefs
然后通过查看分词器创建的索引中的单词来创建嵌入矩阵。
# prepare embedding matrix
num_words = min(MAX_NUM_WORDS, len(word_index) + 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:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
由于循环将从 i=1
开始,如果矩阵的初始化不同,第一行将仅包含零和随机数。是否有跳过第一行的原因?
整个过程是从 Tokenizer
的程序员出于某种原因保留索引 0
开始的,也许是为了某种兼容性(其他一些语言使用 1
的索引)或编码技术原因。
然而他们使用 numpy,他们想用简单的索引:
embedding_matrix[i] = embedding_vector
索引,所以 [0]
索引行保持全为零,并且没有像 "random numbers if the matrix is initialized differently" 所写的情况,因为这个数组已经用 zeros 初始化。
所以从这一行我们根本不需要第一行,但是你不能删除它,因为 numpy 数组会丢失其索引与分词器索引的对齐。
我正在查看 Keras Glove 词嵌入示例,不清楚为什么嵌入矩阵的第一行填充了零。
首先,在单词与数组相关联的地方创建嵌入索引。
embeddings_index = {}
with open(os.path.join(GLOVE_DIR, 'glove.6B.100d.txt')) as f:
for line in f:
word, coefs = line.split(maxsplit=1)
coefs = np.fromstring(coefs, 'f', sep=' ')
embeddings_index[word] = coefs
然后通过查看分词器创建的索引中的单词来创建嵌入矩阵。
# prepare embedding matrix
num_words = min(MAX_NUM_WORDS, len(word_index) + 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:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
由于循环将从 i=1
开始,如果矩阵的初始化不同,第一行将仅包含零和随机数。是否有跳过第一行的原因?
整个过程是从 Tokenizer
的程序员出于某种原因保留索引 0
开始的,也许是为了某种兼容性(其他一些语言使用 1
的索引)或编码技术原因。
然而他们使用 numpy,他们想用简单的索引:
embedding_matrix[i] = embedding_vector
索引,所以 [0]
索引行保持全为零,并且没有像 "random numbers if the matrix is initialized differently" 所写的情况,因为这个数组已经用 zeros 初始化。
所以从这一行我们根本不需要第一行,但是你不能删除它,因为 numpy 数组会丢失其索引与分词器索引的对齐。