Этот пример показывает, как классифицировать каждый временной шаг данных последовательности с помощью сети долгой краткосрочной памяти (LSTM).
Чтобы обучить глубокую нейронную сеть классифицировать каждый временной шаг данных последовательности, можно использовать сеть LSTM от последовательности к последовательности. Сеть LSTM от последовательности к последовательности позволяет вам делать различные предсказания для каждого отдельного временного шага данных последовательности.
Этот пример использует данные о датчике, полученные от смартфона, надеваемого на корпус. Пример обучает сеть LSTM распознавать активность пользователя данных временных рядов, представляющих показания акселерометра в трех различных направлениях. Обучающие данные содержат данные временных рядов для семи человек. Каждая последовательность имеет три функции и изменяется в длине. Набор данных содержит шесть обучающих наблюдений и одно тестовое наблюдение.
Загрузите данные распознавания активности. Данные содержат семь временных рядов данных о датчике, полученных с носимого на корпусе смартфона. Каждая последовательность имеет три функции и изменяется в длине. Три функции соответствуют показаниям акселерометра в трех разных направлениях.
load HumanActivityTrain
XTrain
XTrain=6×1 cell array
{3×64480 double}
{3×53696 double}
{3×56416 double}
{3×50688 double}
{3×51888 double}
{3×54256 double}
Визуализируйте одну обучающую последовательность на графике. Постройте график первой функции первой обучающей последовательности и окрасите график согласно соответствующей деятельности.
X = XTrain{1}(1,:); classes = categories(YTrain{1}); figure for j = 1:numel(classes) label = classes(j); idx = find(YTrain{1} == label); hold on plot(idx,X(idx)) end hold off xlabel("Time Step") ylabel("Acceleration") title("Training Sequence 1, Feature 1") legend(classes,'Location','northwest')
Определите сетевую архитектуру LSTM. Укажите вход, который будет последовательностями размера 3 (количество функций входных данных). Задает слой LSTM с 200 скрытыми модулями измерения и выводит полную последовательность. Наконец, задайте пять классов, включив полностью соединенный слой размера 5, затем слой softmax и слой классификации.
numFeatures = 3; numHiddenUnits = 200; numClasses = 5; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','sequence') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
Задайте опции обучения. Установите решатель равным 'adam'
. Обучайте на 60 эпох. Чтобы предотвратить взрывание градиентов, установите порог градиента равным 2.
options = trainingOptions('adam', ... 'MaxEpochs',60, ... 'GradientThreshold',2, ... 'Verbose',0, ... 'Plots','training-progress');
Обучите сеть LSTM с заданными опциями обучения с помощью trainNetwork
. Каждый мини-пакет содержит весь набор обучающих данных, поэтому график обновляется один раз в эпоху. Последовательности очень длинные, поэтому может потребоваться некоторое время, чтобы обработать каждый мини-пакет и обновить график.
net = trainNetwork(XTrain,YTrain,layers,options);
Загрузите тестовые данные и классифицируйте активность на каждом временном шаге.
Загрузите тестовые данные активности человека. XTest
содержит одну последовательность размерности 3. YTest
содержит последовательность категориальных меток, соответствующих действию на каждом временном шаге.
load HumanActivityTest figure plot(XTest{1}') xlabel("Time Step") legend("Feature " + (1:numFeatures)) title("Test Data")
Классифицировать тестовые данные можно используя classify
.
YPred = classify(net,XTest{1});
Кроме того, вы можете делать предсказания один временной шаг за раз при помощи classifyAndUpdateState
. Это полезно при наличии значений временных шагов, поступающих в поток. Обычно быстрее делать предсказания на полных последовательностях по сравнению с тем, чтобы делать предсказания по одному временному шагу за раз. Для примера, показывающего, как предсказать будущие временные шаги путем обновления сети между однократными временными предсказаниями, смотрите Прогнозирование временных рядов с использованием глубокого обучения.
Вычислите точность предсказаний.
acc = sum(YPred == YTest{1})./numel(YTest{1})
acc = 0.9998
Сравните предсказания с тестовыми данными при помощи графика.
figure plot(YPred,'.-') hold on plot(YTest{1}) hold off xlabel("Time Step") ylabel("Activity") title("Predicted Activities") legend(["Predicted" "Test Data"])
lstmLayer
| sequenceInputLayer
| trainingOptions
| trainNetwork