В этом примере показано, как классифицировать каждый временной шаг данных о последовательности с помощью сети долгой краткосрочной памяти (LSTM).
Чтобы обучить глубокую нейронную сеть классифицировать каждый временной шаг данных о последовательности, можно использовать сеть LSTM от последовательности к последовательности. Сеть LSTM от последовательности к последовательности позволяет вам сделать различные прогнозы для каждого отдельного временного шага данных о последовательности.
Этот пример использует данные о датчике, полученные из смартфона, который изнашивают на теле. Пример обучает сеть LSTM, чтобы распознать действие владельца, данного данные временных рядов, представляющие показания акселерометра в трех различных направлениях. Обучающие данные содержат данные временных рядов для семи человек. Каждая последовательность имеет три функции и варьируется по длине. Набор данных содержит шесть учебных наблюдений и одно тестовое наблюдение.
Загрузите данные о распознавании деятельности человека. Данные содержат семь временных рядов данных о датчике, полученных из смартфона, который изнашивают на теле. Каждая последовательность имеет три функции и варьируется по длине. Три функции соответствуют показаниям акселерометра в трех различных направлениях.
load HumanActivityTrain
XTrain
XTrain=6×1 cell
{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
| trainNetwork
| trainingOptions