Вопросы относительно входной размерности вложений в Keras на основе официальной документации - PullRequest
1 голос
/ 13 июня 2019

Я читал учебник по Keras, опубликованный в блоге Джонатана Хуэя (https://jhui.github.io/2018/02/11/Keras-tutorial/), который, как он утверждает, взят непосредственно из официальной документации Keras.

Есть части кода, которые я не совсем понимаю, и они относятся к размерам слоев Embedded.

Давайте рассмотрим два примера:

Первый пример:

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM

import numpy as np

max_features = 10
x_train = np.random.random((1000, max_features))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, max_features))
y_test = np.random.randint(2, size=(100, 1))

model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)

Здесь X - матрица (1000 x 10), содержащая случайные числа, каждое из которых потенциально уникально. Однако слои Embedded получают в качестве аргумента входные измерения max_features (т.е. 10 в этом примере). Но когда мы передаем входные измерения слоям Embedded, разве мы не считаем уникальные возможные значения переменной, которую мы кодируем? Другими словами, не является ли число столбцов, которые возникли бы в результате дублирования переменной, исходя из предположения о размерности пространства, из которого происходят ее значения (например, словарь)?

Второй пример:

import keras
import numpy as np

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# The first input
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# This embedding layer will encode the input sequence
# into a sequence of dense 512-dimensional vectors.
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# A LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(32)(x)

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

# Second input
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# We stack a deep densely-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# And finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

headline_data = np.random.random((1000, 100))
additional_data = np.random.random((1000, 5))
labels = np.random.random((1000, 1))

model.fit([headline_data, additional_data], [labels, labels],
          epochs=50, batch_size=32)

Здесь входное измерение установлено равным 10000, но мы снова имеем дело с входным параметром (headline_data), который потенциально имеет 1000 x 100 = 100 000 уникальных значений. Как мы можем представить эти 100 000 значений, используя пространство ввода 10000?

1 Ответ

1 голос
/ 13 июня 2019

Кажется, вы неправильно поняли слой Embedding. Позвольте мне кратко описать это:

Вы можете посмотреть на слой Embedding в качестве справочной таблицы: он принимает integer в качестве входных данных и возвращает vector , соответствующий данному целому числу как вывод. Таким образом, в контексте НЛП обычно те целые числа соответствуют токенам или словам в словаре, который мы создали из обучающих данных. Например, этот словарь может выглядеть так:

hi:     1
you:    2
hello:  3
can:    4
are:    5
how:    6
...

Так, например, слову "hi" ему присвоено число "1". Теперь, если мы хотим представить предложение "hi how are you", оно будет эквивалентно [1, 6, 5, 2]. Этот целочисленный вектор является входом нашей модели, и он будет передан слою Embedded в качестве входных данных. Слой Embedded в свою очередь даст соответствующие векторы. Например, векторы внедрения в слое Embedded в определенный момент во время обучения могут выглядеть следующим образом:

1:  [0.43, 0.09, 0.13, 1.65]
2:  [0.43, 0.11, 0.23, -1.75]
3:  [-0.88, 0.19, 2.33, 0.55]
4:  [0.93, 0.79, -0.23, 2.05]
5:  [0.27, 0.61, 0.10, 0.85]
6:  [0.03, 1.09, -3.19, 2.25]
...

Таким образом, для "hi how are you" он возвращает следующие векторы:

[[0.43, 0.09, 0.13, 1.65],
 [0.03, 1.09, -3.19, 2.25],
 [0.27, 0.61, 0.10, 0.85],
 [0.43, 0.11, 0.23, -1.75]]

Теперь вы можете лучше понять, что соответствуют этим параметрам слоя Embedded: input_dim на самом деле является количеством записей в справочной таблице, которое эквивалентно количеству уникальных слов в наш словарь, а output_dim - это размерность (т. е. длина) векторов встраивания в слой Embedding (в приведенном выше примере длина каждого вектора равна 4, поэтому output_dim=4).

В качестве примечания, оба приведенных вами примера кода не будут работать. Это связано с тем, что входные данные вашей модели (т. Е. x_train и x_test) не состоят из целых чисел; скорее они являются массивами чисел с плавающей точкой (из-за использования np.random.random), что недопустимо, когда у вас есть слой Embedding в качестве первого слоя вашей модели.

...