이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

sequenceInputLayer

시퀀스 입력 계층

설명

시퀀스 입력 계층은 네트워크에 시퀀스 데이터를 입력합니다.

생성

설명

layer = sequenceInputLayer(inputSize)는 시퀀스 입력 계층을 만들고 InputSize 속성을 설정합니다.

예제

layer = sequenceInputLayer(inputSize,Name,Value)는 이름-값 쌍을 사용하여 선택 사항인 Normalization, Mean, Name 속성을 설정합니다. 여러 개의 이름-값 쌍을 지정할 수 있습니다. 각 속성 이름을 작은따옴표로 묶습니다.

속성

모두 확장

이미지 입력

입력값의 크기로, 양의 정수 또는 양의 정수로 구성된 벡터로 지정됩니다.

  • 벡터 시퀀스 입력값에 대해, InputSize는 특징 개수에 대응되는 스칼라입니다.

  • 2차원 이미지 시퀀스 입력값에 대해, InputSize는 요소를 3개 가진 벡터 [h w c]입니다. 여기서 h는 이미지 높이이고, w는 이미지 너비이고, c는 이미지의 채널 개수입니다.

  • 3차원 이미지 시퀀스 입력값에 대해, InputSize는 요소를 4개 가진 벡터 [h w d c]입니다. 여기서 h는 이미지 높이이고, w는 이미지 너비이고, d는 이미지 깊이이고, c는 이미지의 채널 개수입니다.

예: 100

데이터가 입력 계층을 통과하여 순방향으로 전파될 때마다 적용할 데이터 변환으로, 다음 중 하나로 지정됩니다.

  • 'none' — 입력 데이터를 변환하지 않습니다.

  • 'zerocenter'Mean 속성으로 지정된 평균값을 뺍니다. trainNetwork 함수는 훈련 시점에 자동으로 평균값을 계산합니다.

0이 중심이 되는 정규화에 사용할 평균으로, 숫자형 배열 또는 빈 값으로 지정됩니다.

  • 벡터 시퀀스 입력값에 대해, Mean은 채널당 평균으로 구성된 InputSizex1 벡터여야 합니다.

  • 2차원 시퀀스 입력값에 대해, MeanInputSize와 크기가 같거나 채널당 평균으로 구성된 1x1xC 배열이어야 합니다. 여기서 C는 입력값의 채널 개수입니다. 이 경우 입력값의 채널 개수는 InputSize(3)입니다.

  • 3차원 시퀀스 입력값에 대해, MeanInputSize와 크기가 같거나 채널당 평균으로 구성된 1x1x1xC 배열이어야 합니다. 여기서 C는 입력값의 채널 개수입니다. 이 경우 입력값의 채널 개수는 InputSize(4)입니다.

이 속성은 훈련 없이 네트워크를 만들 때(예를 들어, assembleNetwork를 사용하여 네트워크를 조합할 때) 설정할 수 있습니다. 설정하지 않은 경우, trainNetwork 함수는 훈련 시점에 평균을 다시 계산합니다. 평균을 지정한 경우에는 Normalization 속성을 'zerocenter'로 설정해야 합니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

계층

계층 이름으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. 계층 그래프에 계층을 포함하려면 비어 있지 않은 고유한 계층 이름을 지정해야 합니다. 이 계층을 사용하여 시리즈 네트워크를 훈련시킬 때 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'
             Mean: []

Layer 배열에 LSTM 계층을 포함시킵니다.

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

이름이 'seq1'이고 224x224 RGB 이미지로 구성된 시퀀스를 위한 시퀀스 입력 계층을 만듭니다.

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

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

   Hyperparameters
    Normalization: 'none'
             Mean: []

Sequence-to-label 분류를 위해 심층 학습 LSTM 네트워크를 훈련시킵니다.

[1]과 [2]에서 설명한 Japanese Vowels 데이터 세트를 불러옵니다. XTrain은 특징 차원이 12이고 다양한 길이의 시퀀스 270개로 구성된 셀형 배열입니다. Y는 레이블 1,2,...,9로 구성된 categorical형 벡터입니다. 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(입력 데이터의 특징 개수)로 지정합니다. 은닉 유닛 100개를 포함하고 시퀀스의 마지막 요소를 출력하는 LSTM 계층을 지정합니다. 마지막으로, 크기가 9인 완전 연결 계층을 포함하여 9개의 클래스를 지정하고, 이어서 소프트맥스 계층과 분류 계층을 지정합니다.

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

훈련 옵션을 지정합니다. 솔버를 'adam'으로 지정하고 'GradientThreshold'를 1로 지정합니다. 미니 배치의 크기를 27로 설정하고 최대 Epoch 횟수를 100으로 설정합니다.

미니 배치는 짧은 시퀀스로 구성된 크기가 작은 배치이므로 훈련에는 CPU가 더 적절합니다. 'ExecutionEnvironment''cpu'로 설정합니다. GPU를 사용할 수 있는 경우 GPU에서 훈련시키려면 'ExecutionEnvironment''auto'(디폴트 값)로 설정하십시오.

maxEpochs = 100;
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.9351

sequence-to-label 분류를 위한 LSTM 네트워크를 만들려면 시퀀스 입력 계층, LSTM 계층, 완전 연결 계층, 소프트맥스 계층, 분류 출력 계층을 포함하는 계층 배열을 만듭니다.

시퀀스 입력 계층의 크기를 입력 데이터의 특징 개수로 설정합니다. 완전 연결 계층의 크기를 클래스 개수로 설정합니다. 시퀀스 길이는 지정할 필요가 없습니다.

LSTM 계층의 경우, 은닉 유닛의 개수와 출력 모드 'last'를 지정합니다.

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

sequence-to-label 분류를 위한 LSTM 네트워크를 훈련시키고 새 데이터를 분류하는 방법을 보여주는 예제는 심층 학습을 사용한 시퀀스 분류 항목을 참조하십시오.

sequence-to-sequence 분류를 위한 LSTM 네트워크를 만들려면 sequence-to-label 분류와 동일한 아키텍처를 사용하되 LSTM 계층의 출력 모드를 'sequence'로 설정합니다.

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

sequence-to-one 회귀를 위한 LSTM 네트워크를 만들려면 시퀀스 입력 계층, LSTM 계층, 완전 연결 계층, 회귀 출력 계층을 포함하는 계층 배열을 만듭니다.

시퀀스 입력 계층의 크기를 입력 데이터의 특징 개수로 설정합니다. 완전 연결 계층의 크기를 응답 변수의 개수로 설정합니다. 시퀀스 길이는 지정할 필요가 없습니다.

LSTM 계층의 경우, 은닉 유닛의 개수와 출력 모드 'last'를 지정합니다.

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

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

sequence-to-sequence 회귀를 위한 LSTM 네트워크를 만들려면 sequence-to-one 회귀와 동일한 아키텍처를 사용하되 LSTM 계층의 출력 모드를 'sequence'로 설정합니다.

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

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

sequence-to-sequence 회귀를 위한 LSTM 네트워크를 훈련시키고 새 데이터에 대해 예측하는 방법을 보여주는 예제는 심층 학습을 사용한 sequence-to-sequence 회귀 항목을 참조하십시오.

LSTM 계층 앞에 출력 모드가 'sequence'인 LSTM 계층을 추가로 삽입하여 LSTM 네트워크의 심도를 높일 수 있습니다. 과적합을 방지하기 위해 LSTM 계층 뒤에 드롭아웃 계층을 삽입할 수 있습니다.

sequence-to-label 분류 네트워크의 경우, 마지막 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];

sequence-to-sequence 분류 네트워크의 경우, 마지막 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 계층에 입력할 수 있습니다.

네트워크 아키텍처 정의하기

28x28 회색조 이미지로 구성된 시퀀스를 10개 클래스로 분류하는 분류 LSTM 네트워크를 만듭니다.

다음과 같은 네트워크 아키텍처를 정의합니다.

  • 입력 크기가 [28 28 1]인 시퀀스 입력 계층.

  • 5x5 필터 20개를 갖는 컨벌루션, 배치 정규화 및 ReLU 계층 블록.

  • 마지막 시간 스텝만 출력하는 은닉 유닛 200개를 갖는 LSTM 계층.

  • 크기가 10(클래스 개수)인 완전 연결 계층과 그 뒤에 오는 소프트맥스 계층 및 분류 계층.

각 시간 스텝에 대해 컨벌루션 연산을 독립적으로 수행하려면 컨벌루션 계층 앞에 시퀀스 접기 계층을 포함시키십시오. 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)

참고 문헌

[1] M. Kudo, J. Toyama, and M. Shimbo. "Multidimensional Curve Classification Using Passing-Through Regions." Pattern Recognition Letters. Vol. 20, No. 11–13, pages 1103–1111.

[2] UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

R2017b에 개발됨