В этом примере показано, как классифицировать каждый временной шаг данных последовательности с использованием сети LSTM.
Для обучения глубокой нейронной сети классификации каждого временного шага данных последовательности можно использовать сеть последовательности к последовательности LSTM. Сеть последовательности к последовательности LSTM позволяет делать различные прогнозы для каждого отдельного временного шага данных последовательности.
В этом примере используются данные датчика, полученные от смартфона, надеваемого на корпус. Пример обучает сеть LSTM распознавать активность пользователя данных временных рядов, представляющих показания акселерометра в трех различных направлениях. Данные обучения содержат данные временных рядов для семи человек. Каждая последовательность имеет три признака и варьирует по длине. Набор данных содержит шесть учебных наблюдений и одно тестовое наблюдение.
Загрузка данных распознавания деятельности персонала. Данные содержат семь временных рядов данных датчиков, полученных от смартфона, надеваемого на корпус. Каждая последовательность имеет три признака и варьирует по длине. Три характеристики соответствуют показаниям акселерометра в трех различных направлениях.
load HumanActivityTrain
XTrainXTrain=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