В этом примере показано, как классифицировать данные о последовательности с помощью 1D сверточной нейронной сети.
Чтобы обучить глубокую нейронную сеть классифицировать данные о последовательности, можно использовать 1D сверточную нейронную сеть. 1D сверточный слой изучает функции путем применения скольжения сверточных фильтров к 1D входу. Используя 1D сверточные слои может быть быстрее, чем использование текущих слоев, потому что сверточные слои могут обработать вход с одной операцией. В отличие от этого, текущие слои должны выполнить итерации по временным шагам входа. Однако в зависимости от сетевой архитектуры и размеров фильтра, 1D сверточные слои не могут выполнить, а также текущие слои, которые могут изучить долгосрочные зависимости между временными шагами.
Этот пример использует японский набор данных Гласных, описанный в [1] и [2]. Этот пример обучает 1D сверточную нейронную сеть распознавать динамик, данный данные временных рядов, представляющие два японских гласные, на которых говорят по очереди. Обучающие данные содержат данные временных рядов для девяти динамиков. Каждая последовательность имеет 12 функций и варьируется по длине. Набор данных содержит 270 учебных наблюдений и 370 тестовых наблюдений.
Загрузите японские обучающие данные Гласных. Данные о предикторе являются массивом ячеек, содержащим последовательности различной длины с 12 функциями. Целевые данные являются категориальным вектором из меток "1", "2"..., "9", которые соответствуют этим девяти динамикам. Последовательности предиктора являются матрицами с 12 строками (одна строка для каждого признака) и различным количеством столбцов (один столбец для каждого временного шага).
[XTrain,TTrain] = japaneseVowelsTrainData; [XValidation,TValidation] = japaneseVowelsTestData;
Просмотрите первые несколько обучающих последовательностей.
XTrain(1:5)
ans=5×1 cell array
{12x20 double}
{12x26 double}
{12x22 double}
{12x20 double}
{12x21 double}
Визуализируйте первые временные ряды в графике. Каждая линия соответствует функции.
figure plot(XTrain{1}') xlabel("Time Step") title("Training Observation 1") numFeatures = size(XTrain{1},1); legend("Feature " + string(1:numFeatures),Location="northeastoutside")
Просмотрите количество классов в обучающих данных.
classes = categories(TTrain); numClasses = numel(classes)
numClasses = 9
Задайте 1D архитектуру сверточной нейронной сети.
Задайте входной размер как количество функций входных данных.
Задайте два блока 1D свертки, ReLU и слоев нормализации слоя, где сверточный слой имеет размер фильтра 3. Задайте 32 и 64 фильтра для первых и вторых сверточных слоев, соответственно. Для обоих сверточных слоев лево-заполните входные параметры, таким образом, что выходные параметры имеют ту же длину (причинное дополнение).
Чтобы сократить выход сверточных слоев к одному вектору, используйте 1D глобальный средний слой объединения.
Чтобы сопоставить выход с вектором из вероятностей, задайте полносвязный слой с выходным размером, совпадающим с количеством классов, сопровождаемых softmax слоем и слоем классификации.
filterSize = 3; numFilters = 32; layers = [ ... sequenceInputLayer(numFeatures) convolution1dLayer(filterSize,numFilters,Padding="causal") reluLayer layerNormalizationLayer convolution1dLayer(filterSize,2*numFilters,Padding="causal") reluLayer layerNormalizationLayer globalAveragePooling1dLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
Задайте опции обучения:
Обучите использование оптимизатора Адама.
Обучайтесь с мини-пакетным размером 27 в течение 15 эпох.
Лево-заполните последовательности.
Проверьте сеть с помощью данных о валидации.
Контролируйте процесс обучения в графике и подавите многословный выход.
miniBatchSize = 27; options = trainingOptions("adam", ... MiniBatchSize=miniBatchSize, ... MaxEpochs=15, ... SequencePaddingDirection="left", ... ValidationData={XValidation,TValidation}, ... Plots="training-progress", ... Verbose=0);
Обучите сеть с заданными опциями обучения с помощью trainNetwork
функция.
net = trainNetwork(XTrain,TTrain,layers,options);
Классифицируйте данные о валидации с помощью того же мини-пакетного размера и дополнительных опций последовательности, используемых для обучения.
YPred = classify(net,XValidation, ... MiniBatchSize=miniBatchSize, ... SequencePaddingDirection="left");
Вычислите точность классификации предсказаний.
acc = mean(YPred == TValidation)
acc = 0.9568
Визуализируйте предсказания в матрице беспорядка.
confusionchart(TValidation,YPred)
[1] Kudo, Mineichi, Юн Тояма и Масару Шимбо. “Многомерная Классификация Кривых Используя Прохождение через области”. Буквы Распознавания образов 20, № 11-13 (ноябрь 1999): 1103–11. https://doi.org/10.1016/S0167-8655 (99) 00077-X
[2] Kudo, Mineichi, Юн Тояма и Масару Шимбо. "Японский Набор данных Гласных". Распределенный Репозиторием Машинного обучения UCI. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
convolution1dLayer
| trainingOptions
| trainNetwork
| sequenceInputLayer
| maxPooling1dLayer
| averagePooling1dLayer
| globalMaxPooling1dLayer
| globalAveragePooling1dLayer