#keras #deep-learning #lstm #embedding
#keras #глубокое обучение #lstm #внедрение
Вопрос:
У меня есть проблема с предсказанием последовательности, в которой, учитывая последние m
элементы (6) в последовательности, мне нужно предсказать следующий элемент. На данный момент существует N = 60 тыс. последовательностей, и для каждой последовательности n
у меня есть 6 событий, и я хочу предсказать следующее (7-е в данном случае) событие. Набор данных выглядит следующим образом
seq_inputs = [
["AA1", "BB3", "CC4","DD5","AA2", "CC8", "CC11"], #CC11 is target
["FF1", "DD3", "FF6","KK8","AA5", "CC8", "AA2"] #AA2 will be target
..
..
]
После разметки и разделения входных и целевых данных я изменил данные следующим образом (для многоступенчатого прогнозирования «один объект много к одному»)
seq = [[[ 1], [10], [200], [5], [3], [90], ],
[[ 95], [15], [4], [11], [78],[3],
],
...
...
... #60,000 of them
]
targets = [40,3, ... , ... ]
У меня есть около 60,000 sequences
и 940 unique events (vocabulary size)
независимо от того, какую архитектуру я использую, моя точность проверки достигает 19% (потеря проверки 3.5) и начинает снижаться, и я не получаю результат лучше 20% по тестовым данным.
Я пробовал dropout
, recurrent_dropout
(до 0,2) на уровне LSTM и упростил архитектуру LSTM до очень простой, как показано ниже, но по-прежнему точность валидации не превышает 19% (я полагаю, что она превосходит). Я также попытался уменьшить размер встраивания. это самая простая модель, которую я использовал без удачи
model = Sequential()
model.add(Embedding(vocabulary_size, 32, input_length=seq_len)) #seq_length
model.add(LSTM(40,return_sequences=True,input_shape=(6, 1),dropout=0.1, recurrent_dropout=0.1))
model.add(LSTM(20))
model.add(Dense(120,activation='relu'))
model.add(Dense(vocabulary_size, activation='softmax'))
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
До этого я использовал большую сеть с 3/4-мя уровнями lstm по 40-80 устройств в каждом, также пробовал встраивать размер до 500, но производительность при проверке и тестировании была одинаковой, достигала 20%, даже если обучение достигало 90%.
Что может быть причиной отсутствия улучшения в проверке и точности тестирования за ее пределами 19-20%
?
Комментарии:
1. можете ли вы поделиться набором данных?
2. @NazmulHasan К сожалению, данные конфиденциальны
3. Как вы кодируете строки? какие типы предварительной обработки вы использовали? Иногда предварительная обработка данных важнее.
4. используйте, я маркировал их с помощью keras tokenizer (например, одна последовательность выглядит следующим образом
[ 1], [10], [200], [5], [3], [90]
)5. Попробуйте отделить неверно предсказанные данные и изучить их. Вы можете использовать некоторые методы предварительной обработки. Модель кажется прекрасной. После предварительной обработки данных уменьшите скорость обучения до минимальной и тренируйте свою модель до тех пор, пока она не будет соответствовать.