Для встраивания input dim (num_words в приведенном ниже коде) - это размер словаря. Например, если ваши данные целочисленно закодированы в значения от 0 до 10, тогда размер словаря будет 11 слов. Именно поэтому 1 добавляется к минимуму len (word_index) и MAX_NUM_WORDS.
Матрица вложения будет иметь размер словарного размера и длину вектора
embedding_layer = Embedding(num_words,
EMBEDDING_DIM,
embeddings_initializer=Constant(embedding_matrix),
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
num_words = min(MAX_NUM_WORDS, len(word_index)) + 1
Для объяснения этого создали простой токенизатор.
t = Tokenizer(num_words=5)
fit_text = ["The earth is an awesome place live"]
t.fit_on_texts(fit_text)
word_index = t.word_index
print('word_index : ',word_index)
print('len word_index : ',len(t.word_index))
word_index : {'the': 1, 'earth': 2, 'is': 3, 'an': 4, 'awesome': 5, 'place': 6, 'live': 7}
len word_index : 7
В приведенном ниже примере вы используете словарь размера 4 только потому, что индексирование токенизатора начинается с 1.
embedding_matrix = np.zeros((5, 10))
embedding_matrix
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
for word, i in word_index.items():
if i < 5:
embedding_matrix[i] = [0,1,0,0,0,0,0,0,0,0]
print (embedding_matrix)
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]
В приведенном ниже случае вам нужно добавить 1 (5 + 1), чтобы покрыть словарь размера 5, чтобы покрыть для индекса 0
embedding_matrix = np.zeros((6, 10))
for word, i in word_index.items():
if i < 6:
embedding_matrix[i] = [0,1,0,0,0,0,0,0,0,0]
print (embedding_matrix)
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]