Я читал учебник по 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?