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

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

Смотрите также

| | |

Похожие темы