Классификация от последовательности к последовательности Используя 1D свертки

В этом примере показано, как классифицировать каждый временной шаг данных о последовательности с помощью типовой временной сверточной сети (TCN).

В то время как задачи от последовательности к последовательности обычно решаются с архитектурами рекуррентной нейронной сети, Бай и др. [1] показывают, что сверточные нейронные сети могут совпадать с эффективностью текущих сетей на типичных задачах моделирования последовательности или даже превзойти их по характеристикам. Потенциальные выгоды использования сверточных сетей являются лучшим параллелизмом, лучше управляют по восприимчивому размеру поля, лучшему управлению объема потребляемой памяти сети во время обучения и другие устойчивые градиенты. Точно так же, как текущие сети сверточные сети могут работать с входными последовательностями переменной длины и могут использоваться к от последовательности к последовательности модели или sequence-one задачам.

В этом примере вы обучаете TCN распознавать действие человека, носящего смартфон на теле. Вы обучаете сеть с помощью данных временных рядов, представляющих показания акселерометра в трех направлениях.

Загрузите обучающие данные

Загрузите данные о Распознавании Деятельности человека. Данные содержат семь временных рядов данных о датчике, полученных из смартфона, который изнашивают на теле. Каждая последовательность имеет три функции и варьируется по длине. Три функции соответствуют показаниям акселерометра в трех направлениях.

s = load("HumanActivityTrain.mat");
XTrain = s.XTrain;
TTrain = s.YTrain;

Просмотрите количество наблюдений в обучающих данных.

numObservations = numel(XTrain)
numObservations = 6

Просмотрите количество классов в обучающих данных.

classes = categories(TTrain{1});
numClasses = numel(classes)
numClasses = 5

Просмотрите количество функций обучающих данных.

numFeatures = size(s.XTrain{1},1)
numFeatures = 3

Визуализируйте одну из обучающих последовательностей в графике. Постройте функции первой обучающей последовательности и соответствующего действия.

figure
for i = 1:3
    X = s.XTrain{1}(i,:);

    subplot(4,1,i)
    plot(X)
    ylabel("Feature " + i + newline + "Acceleration")
end

subplot(4,1,4)

hold on
plot(s.YTrain{1})
hold off

xlabel("Time Step")
ylabel("Activity")

subplot(4,1,1)
title("Training Sequence 1")

Задайте модель глубокого обучения

Основной базовый блок TCN является расширенным причинным слоем свертки, который действует по временным шагам каждой последовательности. В этом контексте, "причинном", означает, что активации, вычисленные для шага определенного времени, не могут зависеть от активаций от будущих временных шагов.

Чтобы создать контекст от предыдущих временных шагов, несколько сверточных слоев обычно складываются друг на друге. Чтобы достигнуть больших восприимчивых размеров поля, коэффициент расширения последующих слоев свертки увеличен экспоненциально, как показано в следующем изображении. Предположение, что коэффициент расширения k-ого сверточного слоя 2(k-1) и шаг равняется 1, затем восприимчивый размер поля такой сети может быть вычислен как R=(f-1)(2K-1)+1, где f размер фильтра и K количество сверточных слоев. Измените размер фильтра и количество слоев, чтобы легко настроить восприимчивый размер поля и количество настраиваемых параметров по мере необходимости для данных и задачи под рукой.

Один из недостатков TCNs по сравнению с текущими сетями - то, что у них есть больший объем потребляемой памяти во время вывода. Целая необработанная последовательность требуется, чтобы вычислять следующий временной шаг. Чтобы уменьшать время вывода и потребление памяти, особенно для неродной вперед предсказаний, обучаются с самым маленьким разумным восприимчивым размером поля R и выполните предсказание только с последним R временные шаги входной последовательности.

Общая архитектура TCN (как описано в [1]) состоит из нескольких остаточных блоков, каждый содержащий два набора расширенных причинных слоев свертки с тем же коэффициентом расширения, сопровождаемым нормализацией, активацией ReLU и пространственными слоями уволенного. Сеть добавляет вход каждого блока к выходу блока (включая свертку 1 на 1 на входе, когда количество каналов между вводом и выводом не соответствует), и применяет итоговую функцию активации.

Задайте сеть, содержащую четыре из этих остаточных блоков последовательно, каждого с дважды коэффициентом расширения предыдущего слоя, начиная с коэффициента расширения 1. Для остаточных блоков задайте 64 фильтра для 1D сверточных слоев с размером фильтра 5 и фактором уволенного 0,005 для пространственных слоев уволенного. Для пространственного уволенного используйте пользовательский слой spatialDropoutLayer, присоединенный к этому примеру как вспомогательный файл. Чтобы получить доступ к этому слою, откройте этот пример как live скрипт.

numFilters = 64;
filterSize = 5;
dropoutFactor = 0.005;
numBlocks = 4;

layer = sequenceInputLayer(numFeatures,Normalization="rescale-symmetric",Name="input");
lgraph = layerGraph(layer);

outputName = layer.Name;

for i = 1:numBlocks
    dilationFactor = 2^(i-1);
    
    layers = [
        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal",Name="conv1_"+i)
        layerNormalizationLayer
        spatialDropoutLayer(dropoutFactor)
        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal")
        layerNormalizationLayer
        reluLayer
        spatialDropoutLayer(dropoutFactor)
        additionLayer(2,Name="add_"+i)];

    % Add and connect layers.
    lgraph = addLayers(lgraph,layers);
    lgraph = connectLayers(lgraph,outputName,"conv1_"+i);

    % Skip connection.
    if i == 1
        % Include convolution in first skip connection.
        layer = convolution1dLayer(1,numFilters,Name="convSkip");

        lgraph = addLayers(lgraph,layer);
        lgraph = connectLayers(lgraph,outputName,"convSkip");
        lgraph = connectLayers(lgraph,"convSkip","add_" + i + "/in2");
    else
        lgraph = connectLayers(lgraph,outputName,"add_" + i + "/in2");
    end
    
    % Update layer output name.
    outputName = "add_" + i;
end

layers = [
    fullyConnectedLayer(numClasses,Name="fc")
    softmaxLayer
    classificationLayer];
lgraph = addLayers(lgraph,layers);
lgraph = connectLayers(lgraph,outputName,"fc");

Просмотрите сеть в графике.

figure
plot(lgraph)
title("Temporal Convolutional Network")

Задайте опции обучения

Задайте набор опций, используемых для обучения.

  • Обучайтесь в течение 60 эпох с мини-пакетным размером 1.

  • Обучайтесь со скоростью обучения 0,001.

  • Отобразите прогресс обучения в графике и подавите многословный выход.

options = trainingOptions("adam", ...
    MaxEpochs=60, ...
    miniBatchSize=1, ...
    Plots="training-progress", ...
    Verbose=0);

Обучите модель

net = trainNetwork(XTrain,TTrain,lgraph,options);

Тестовая модель

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

Загрузите тестовые данные.

s = load("HumanActivityTest.mat");
XTest = s.XTest;
TTest = s.YTest;

Используйте обучивший сеть, чтобы сделать предсказания при помощи classify функция.

YPred = classify(net,XTest);

Сравните предсказания с соответствующими тестовыми данными в графике.

figure
plot(YPred{1},".-")
hold on
plot(TTest{1})
hold off

xlabel("Time Step")
ylabel("Activity")
legend(["Predicted" "Test Data"],Location="northeast")
title("Test Sequence Predictions")

Визуализируйте предсказания в матрице беспорядка.

figure
confusionchart(TTest{1},YPred{1})

Оцените точность классификации путем сравнения предсказаний с тестовыми метками.

accuracy = mean(YPred{1} == TTest{1})
accuracy = 0.9919

Ссылки

[1] Бай, Shaojie, Х. Зико Кольтер и Владлен Кольтун. “Эмпирическая Оценка Типовых Сверточных и Текущих Сетей для Моделирования Последовательности”. Предварительно распечатайте, представленный 19 апреля 2018. https://arxiv.org/abs/1803.01271.

[2] Oord, Аарон ван ден, Сандер Дилемен, Дзэн Heiga, Карен Симонян, Oriol Vinyals, Алекс Грэйвс, Nal Kalchbrenner, Старший Эндрю, и Koray Kavukcuoglu. “WaveNet: Порождающая Модель для Необработанного Аудио”. Предварительно распечатайте, представленный 12 сентября 2016. https://arxiv.org/abs/1609.03499.

[3] Томпсон, Джонатан, Росс Горошин, джайн Arjun, Янн Лекун и Кристоф Бреглер. “Эффективная Объектная Локализация Используя Сверточные Сети”. 2 015 Конференций по IEEE по Компьютерному зрению и Распознаванию образов (CVPR), 648–56. https://doi.org/10.1109/CVPR.2015.7298664.

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

| | | | | | |

Похожие темы

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

| | | | | | | | | | | |

Похожие темы