exponenta event banner

sequenceInputLayer

Входной слой последовательности

Описание

Входной уровень последовательности вводит данные последовательности в сеть.

Создание

Описание

layer = sequenceInputLayer(inputSize) создает слой ввода последовательности и задает InputSize собственность.

пример

layer = sequenceInputLayer(inputSize,Name,Value) устанавливает необязательный Normalization, Mean, и Name с использованием пар имя-значение. Можно указать несколько пар имя-значение. Заключите каждое имя свойства в отдельные кавычки.

Свойства

развернуть все

Ввод изображения

Размер входного значения, определяемый как положительное целое число или вектор положительных целых чисел.

  • Для ввода векторной последовательности InputSize - скаляр, соответствующий количеству элементов.

  • Для ввода 2-D последовательности изображений: InputSize - вектор из трех элементов [h w c], где h - высота изображения, w - ширина изображения, и c - количество каналов изображения.

  • Для ввода 3-D последовательности изображений: InputSize - вектор из четырех элементов [h w d c], где h - высота изображения, w - ширина изображения, d - глубина изображения, и c - количество каналов изображения.

Пример: 100

Нормализация данных для применения при каждом прямом распространении данных через входной уровень, определяемая одним из следующих параметров:

  • 'zerocenter' - Вычитание среднего значения, указанного Mean.

  • 'zscore' - Вычитание среднего значения, указанного Mean и делить на StandardDeviation.

  • 'rescale-symmetric' - Масштабировать входные данные в диапазоне [-1, 1] с использованием минимального и максимального значений, указанных в Min и Maxсоответственно.

  • 'rescale-zero-one' - Масштабировать входные данные в диапазоне [0, 1] с использованием минимального и максимального значений, указанных в Min и Maxсоответственно.

  • 'none' - Не нормализуйте входные данные.

  • дескриптор функции - нормализация данных с помощью указанной функции. Функция должна иметь вид Y = func(X), где X - входные данные и выходные данные; Y - нормализованные данные.

Совет

По умолчанию программа автоматически вычисляет статистику нормализации во время обучения. Чтобы сэкономить время при обучении, укажите необходимые статистические данные для нормализации и установите 'ResetInputNormalization' опция в trainingOptions кому false.

Если входные данные содержат заполнение, то слой игнорирует значения заполнения при нормализации входных данных.

Размер нормализации, указанный как одно из следующих значений:

  • 'auto' - Если вариант обучения false и укажите любую из статистики нормализации (Mean, StandardDeviation, Min, или Max), затем нормализовать по измерениям, соответствующим статистике. В противном случае пересчитайте статистику во время обучения и примените нормализацию канала.

  • 'channel' - Канальная нормализация.

  • 'element' - Элементная нормализация.

  • 'all' - Нормализация всех значений с помощью скалярной статистики.

Среднее значение для нормализации с нулевым центром и z-score, указанное как числовой массив или пустое.

  • Для ввода векторной последовательности Mean должно быть InputSize-на-1 вектор средства на канал, числовой скаляр или [].

  • Для ввода 2-D последовательности изображений: Mean должен быть числовым массивом того же размера, что и InputSize, 1 на 1-by-InputSize(3) массив средств на канал, числовой скаляр или [].

  • Для ввода 3-D последовательности изображений: Mean должен быть числовым массивом того же размера, что и InputSize, 1-на-1-на-1-на-InputSize(4) массив средств на канал, числовой скаляр или [].

При указании Mean собственность, то Normalization должно быть 'zerocenter' или 'zscore'. Если Mean является []затем программное обеспечение вычисляет среднее значение во время обучения.

Это свойство можно задать при создании сетей без обучения (например, при сборке сетей с помощью assembleNetwork).

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Стандартное отклонение, используемое для нормализации z-показателя, задается как числовой массив, числовой скаляр или пустое значение.

  • Для ввода векторной последовательности StandardDeviation должно быть InputSize-на-1 вектор стандартных отклонений на канал, числовой скаляр или [].

  • Для ввода 2-D последовательности изображений: StandardDeviation должен быть числовым массивом того же размера, что и InputSize, 1 на 1-by-InputSize(3) массив стандартных отклонений на канал, числовой скаляр или [].

  • Для ввода 3-D последовательности изображений: StandardDeviation должен быть числовым массивом того же размера, что и InputSize, 1-на-1-на-1-на-InputSize(4) массив стандартных отклонений на канал или числовой скаляр.

При указании StandardDeviation собственность, то Normalization должно быть 'zscore'. Если StandardDeviation является []затем программное обеспечение вычисляет стандартное отклонение во время обучения.

Это свойство можно задать при создании сетей без обучения (например, при сборке сетей с помощью assembleNetwork).

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Минимальное значение для масштабирования, указанное как числовой массив или пустое.

  • Для ввода векторной последовательности Min должно быть InputSize-на-1 вектор средства на канал или числовой скаляр.

  • Для ввода 2-D последовательности изображений: Min должен быть числовым массивом того же размера, что и InputSize, 1 на 1-by-InputSize(3) массив минимумов на канал или числовой скаляр.

  • Для ввода 3-D последовательности изображений: Min должен быть числовым массивом того же размера, что и InputSize, 1-на-1-на-1-на-InputSize(4) массив минимумов на канал или числовой скаляр.

При указании Min собственность, то Normalization должно быть 'rescale-symmetric' или 'rescale-zero-one'. Если Min является []затем программное обеспечение вычисляет минимумы во время обучения.

Это свойство можно задать при создании сетей без обучения (например, при сборке сетей с помощью assembleNetwork).

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Максимальное значение для масштабирования, указанное как числовой массив или пустое.

  • Для ввода векторной последовательности Max должно быть InputSize-на-1 вектор средства на канал или числовой скаляр.

  • Для ввода 2-D последовательности изображений: Max должен быть числовым массивом того же размера, что и InputSize, 1 на 1-by-InputSize(3) массив максимумов на канал, числовой скаляр или [].

  • Для ввода 3-D последовательности изображений: Max должен быть числовым массивом того же размера, что и InputSize, 1-на-1-на-1-на-InputSize(4) массив максимумов на канал, числовой скаляр или [].

При указании Max собственность, то Normalization должно быть 'rescale-symmetric' или 'rescale-zero-one'. Если Max является []затем программное обеспечение вычисляет максимумы во время тренировки.

Это свойство можно задать при создании сетей без обучения (например, при сборке сетей с помощью assembleNetwork).

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Слой

Имя слоя, указанное как символьный вектор или строковый скаляр. Чтобы включить слой в график слоев, необходимо указать непустое уникальное имя слоя. Если вы обучаете последовательную сеть с уровнем и Name имеет значение ''затем программа автоматически присваивает имя слою во время обучения.

Типы данных: char | string

Количество входов слоя. Слой не имеет входных данных.

Типы данных: double

Входные имена слоя. Слой не имеет входных данных.

Типы данных: cell

Количество выходов уровня. Этот уровень имеет только один выход.

Типы данных: double

Выходные имена слоя. Этот уровень имеет только один выход.

Типы данных: cell

Примеры

свернуть все

Создание входного слоя последовательности с именем 'seq1' и входной размер 12.

layer = sequenceInputLayer(12,'Name','seq1')
layer = 
  SequenceInputLayer with properties:

                      Name: 'seq1'
                 InputSize: 12

   Hyperparameters
             Normalization: 'none'
    NormalizationDimension: 'auto'

Включение входного слоя последовательности в Layer массив.

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5x1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   LSTM                    LSTM with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

Создание слоя ввода последовательности для последовательностей изображений 224-224 RGB с именем 'seq1'.

layer = sequenceInputLayer([224 224 3], 'Name', 'seq1')
layer = 
  SequenceInputLayer with properties:

                      Name: 'seq1'
                 InputSize: [224 224 3]

   Hyperparameters
             Normalization: 'none'
    NormalizationDimension: 'auto'

Обучение сети LSTM глубокому обучению классификации «последовательность-метка».

Загрузите набор данных японских гласных, как описано в [1] и [2]. XTrain - клеточный массив, содержащий 270 последовательностей различной длины с 12 признаками, соответствующими коэффициентам кепстра LPC. Y - категориальный вектор меток 1,2,..., 9. Записи вXTrain представляют собой матрицы с 12 строками (по одной строке для каждого признака) и различным количеством столбцов (по одному столбцу для каждого временного шага).

[XTrain,YTrain] = japaneseVowelsTrainData;

Визуализация первого временного ряда на графике. Каждая строка соответствует элементу.

figure
plot(XTrain{1}')
title("Training Observation 1")
numFeatures = size(XTrain{1},1);
legend("Feature " + string(1:numFeatures),'Location','northeastoutside')

Определите архитектуру сети LSTM. Укажите размер ввода как 12 (количество элементов входных данных). Укажите уровень LSTM, который должен иметь 100 скрытых единиц и выводить последний элемент последовательности. Наконец, укажите девять классов, включив полностью соединенный слой размера 9, за которым следуют слой softmax и слой классификации.

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5×1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   LSTM                    LSTM with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

Укажите параметры обучения. Укажите решатель как 'adam' и 'GradientThreshold' как 1. Установите размер мини-партии равным 27 и максимальное количество периодов равным 70.

Поскольку мини-пакеты малы с короткими последовательностями, ЦП лучше подходит для обучения. Набор 'ExecutionEnvironment' кому 'cpu'. Обучение на GPU, если доступно, установить 'ExecutionEnvironment' кому 'auto' (значение по умолчанию).

maxEpochs = 70;
miniBatchSize = 27;

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучение сети LSTM с указанными вариантами обучения.

net = trainNetwork(XTrain,YTrain,layers,options);

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

[XTest,YTest] = japaneseVowelsTestData;

Классифицируйте данные теста. Укажите размер мини-партии, используемый для обучения.

YPred = classify(net,XTest,'MiniBatchSize',miniBatchSize);

Вычислите точность классификации прогнозов.

acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9514

Чтобы создать сеть LSTM для классификации последовательности к метке, создайте массив уровней, содержащий входной уровень последовательности, уровень LSTM, полностью подключенный уровень, уровень softmax и выходной уровень классификации.

Установите размер входного слоя последовательности на количество элементов входных данных. Задайте для размера полностью подключенного слоя количество классов. Указывать длину последовательности не требуется.

Для уровня LSTM укажите количество скрытых единиц и режим вывода 'last'.

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Пример обучения сети LSTM классификации «последовательность-метка» и классификации новых данных см. в разделе Классификация последовательностей с использованием глубокого обучения.

Чтобы создать сеть LSTM для классификации последовательности к последовательности, используйте ту же архитектуру, что и для классификации последовательности к метке, но установите режим вывода уровня LSTM в значение 'sequence'.

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Чтобы создать сеть LSTM для регрессии «последовательность к одному», создайте массив уровней, содержащий входной уровень последовательности, уровень LSTM, полностью связанный уровень и выходной уровень регрессии.

Установите размер входного слоя последовательности на количество элементов входных данных. Задайте для размера полностью подключенного слоя количество откликов. Указывать длину последовательности не требуется.

Для уровня LSTM укажите количество скрытых единиц и режим вывода 'last'.

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numResponses)
    regressionLayer];

Чтобы создать сеть LSTM для регрессии последовательности к последовательности, используйте ту же архитектуру, что и для регрессии последовательности к одной, но установите режим вывода уровня LSTM равным 'sequence'.

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numResponses)
    regressionLayer];

Пример обучения сети LSTM регрессии последовательности к последовательности и прогнозирования новых данных см. в разделе Регрессия последовательности к последовательности с использованием глубокого обучения.

Можно сделать сети LSTM глубже, вставив дополнительные уровни LSTM с режимом вывода 'sequence' перед уровнем LSTM. Чтобы избежать переоборудования, можно вставить выпадающие слои после слоев LSTM.

Для сетей классификации «последовательность-метка» режим вывода последнего уровня LSTM должен быть 'last'.

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','last')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Для сетей классификации последовательности к последовательности режим вывода последнего уровня LSTM должен быть 'sequence'.

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

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

  • Для ввода последовательностей изображений в сеть используется уровень ввода последовательностей.

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

  • Чтобы восстановить структуру последовательности после выполнения этих операций, преобразуйте этот массив изображений обратно в последовательности изображений, используя слой развертки последовательности.

  • Чтобы преобразовать изображения в векторы элементов, используйте плоский слой.

Затем векторные последовательности можно вводить в уровни LSTM и BiLSTM.

Определение сетевой архитектуры

Создайте сеть LSTM классификации, которая классифицирует последовательности изображений оттенков серого 28 на 28 в 10 классов.

Определите следующую архитектуру сети:

  • Входной слой последовательности с входным размером [28 28 1].

  • Сверток, пакетная нормализация и блок уровня ReLU с 20 фильтрами 5 на 5.

  • Уровень LSTM с 200 скрытыми блоками, который выводит только последний временной шаг.

  • Полностью соединенный слой размера 10 (количество классов), за которым следуют слой softmax и слой классификации.

Чтобы выполнять сверточные операции на каждом временном шаге независимо, включают в себя слой складывания последовательности перед сверточными слоями. Уровни LSTM ожидают ввода векторной последовательности. Чтобы восстановить структуру последовательности и преобразовать выходные данные сверточных слоев в последовательности характерных векторов, вставьте развернутый слой последовательности и плоский слой между сверточными слоями и уровнем LSTM.

inputSize = [28 28 1];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;

layers = [ ...
    sequenceInputLayer(inputSize,'Name','input')
    
    sequenceFoldingLayer('Name','fold')
    
    convolution2dLayer(filterSize,numFilters,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    
    sequenceUnfoldingLayer('Name','unfold')
    flattenLayer('Name','flatten')
    
    lstmLayer(numHiddenUnits,'OutputMode','last','Name','lstm')
    
    fullyConnectedLayer(numClasses, 'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classification')];

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

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');

Просмотр окончательной сетевой архитектуры с помощью plot функция.

figure
plot(lgraph)

Figure contains an axes. The axes contains an object of type graphplot.

Вопросы совместимости

развернуть все

Изменение поведения в будущем выпуске

В R2020a изменилось поведение

Ссылки

[1] М. Кудо, Дж. Тояма и М. Симбо. «Многомерная классификация кривых с использованием сквозных областей». Буквы распознавания образов. т. 20, № 11-13, стр. 1103-1111.

[2] Хранилище машинного обучения UCI: набор данных японских гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

Расширенные возможности

..
Представлен в R2017b