Этот пример показывает, как классифицировать каждый временной шаг данных о последовательности с помощью сети долгой краткосрочной памяти (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') xlabel("Time Step") legend("Feature " + (1:numFeatures)) title("Test Data")
Классифицируйте тестовые данные с помощью classify
.
YPred = classify(net,XTest);
Также можно сделать прогнозы одним временным шагом за один раз при помощи classifyAndUpdateState
. Это полезно, когда у вас есть значения временных шагов, прибывающих в поток. Обычно, это быстрее, чтобы сделать прогнозы на полных последовательностях когда по сравнению с созданием прогнозов один временной шаг за один раз. Для примера, показывающего, как предсказать будущие временные шаги путем обновления сети между одним прогнозами временного шага, смотрите, что Временные ряды Предсказывают Используя Глубокое обучение.
Вычислите точность прогнозов.
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9997
Сравните прогнозы с тестовыми данными при помощи графика.
figure plot(YPred,'.-') hold on plot(YTest) hold off xlabel("Time Step") ylabel("Activity") title("Predicted Activities") legend(["Predicted" "Test Data"])
lstmLayer
| sequenceInputLayer
| trainNetwork
| trainingOptions