Классификация последовательность-последовательность с использованием глубокого обучения

Этот пример показывает, как классифицировать каждый временной шаг данных последовательности с помощью сети долгой краткосрочной памяти (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

Определите сетевую архитектуру 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);

Тестируйте сеть LSTM

Загрузите тестовые данные и классифицируйте активность на каждом временном шаге.

Загрузите тестовые данные активности человека. 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"])

См. также

| | |

Похожие темы