Я обучил две нейронные сети с Keras
: MLP
и Bidirectional LSTM
.
Моя задача - предсказать порядок слов в предложении, поэтому для каждого слова нейронная сеть имеет вывести реальное число. Когда предложение с N словами обрабатывается, N действительных чисел в выходных данных ранжируются для получения целых чисел, представляющих положение слов.
Я использую тот же набор данных и ту же предварительную обработку в наборе данных. Единственное отличие состоит в том, что в наборе данных LSTM
я добавил заполнение для получения последовательностей одинаковой длины.
На этапе прогнозирования с LSTM
я исключаю предсказания, созданные из векторов заполнения, поскольку Я замаскировал их на этапе обучения.
Архитектура MLP:
mlp = keras.models.Sequential()
# add input layer
mlp.add(
keras.layers.Dense(
units=training_dataset.shape[1],
input_shape = (training_dataset.shape[1],),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
activation='relu')
)
# add hidden layer
mlp.add(
keras.layers.Dense(
units=training_dataset.shape[1] + 10,
input_shape = (training_dataset.shape[1] + 10,),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
bias_initializer='zeros',
activation='relu')
)
# add output layer
mlp.add(
keras.layers.Dense(
units=1,
input_shape = (1, ),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
bias_initializer='zeros',
activation='linear')
)
Архитектура двунаправленного LSTM:
model = tf.keras.Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(Bidirectional(LSTM(units=20, return_sequences=True), input_shape=(timesteps, features)))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
Задача гораздо лучше решается с помощью LSTM, который должен хорошо фиксировать зависимости между словами.
Однако с MLP
я добиваюсь хороших результатов, но с LSTM
результаты очень плохие.
Поскольку я новичок, могу кто-то понимает, что не так с моей LSTM
архитектурой? Я выхожу из головы.
Заранее спасибо.