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

사용자 지정 미니 배치 데이터저장소를 사용하여 시퀀스 데이터에 대해 네트워크 훈련시키기

이 예제에서는 사용자 지정 미니 배치 데이터저장소를 사용하여 메모리에 다 담을 수 없을 정도로 큰 시퀀스 데이터를 대상으로 심층 학습 네트워크를 훈련시키는 방법을 보여줍니다.

미니 배치 데이터저장소란 배치 단위로 데이터를 읽을 수 있는 데이터저장소를 구현한 것입니다. 미니 배치 데이터저장소를 사용하여 메모리에 다 담을 수 없을 정도로 큰 데이터를 읽어 들이거나, 데이터를 배치 단위로 읽을 때 특정 전처리 연산을 수행할 수 있습니다. 미니 배치 데이터저장소는 심층 학습 응용 프로그램을 위한 훈련, 검증, 테스트 및 예측 데이터 세트의 소스로 사용할 수 있습니다.

이 예제에서는 사용자 지정 미니 배치 데이터저장소 sequenceDatastore.m을 사용합니다. 데이터저장소 함수를 사용자 지정하여 이 데이터저장소를 데이터에 맞게 수정할 수 있습니다. 고유한 사용자 지정 미니 배치 데이터저장소를 만드는 예제는 Develop Custom Mini-Batch Datastore 항목을 참조하십시오.

훈련 데이터 불러오기

[1]과 [2]에서 설명한 Japanese Vowels 데이터 세트를 불러옵니다. zip 파일 japaneseVowels.zip은 다양한 길이의 시퀀스를 포함합니다. 이 시퀀스는 각각 훈련 시퀀스와 테스트 시퀀스를 포함하는 TrainTest라는 두 폴더로 나뉘어 있습니다. 각 폴더에서 시퀀스는 1부터 9까지 번호가 지정된 하위 폴더로 나뉘어 있습니다. 하위 폴더의 이름은 레이블 이름입니다. 하나의 MAT 파일은 각 시퀀스를 나타냅니다. 각 시퀀스는 각 특징에 대해 하나의 행을 갖는 12개의 행과 각 시간 스텝에 대해 하나의 열을 갖는 가변 개수의 열로 이루어진 행렬입니다. 행 개수는 시퀀스 차원이고, 열 개수는 시퀀스 길이입니다.

시퀀스 데이터의 압축을 풉니다.

filename = "japaneseVowels.zip";
outputFolder = fullfile(tempdir,"japaneseVowels");
unzip(filename,outputFolder);

사용자 지정 미니 배치 데이터저장소 만들기

사용자 지정 미니 배치 데이터저장소를 만듭니다. 미니 배치 데이터저장소 sequenceDatastore는 폴더에서 데이터를 읽어 들이고 하위 폴더 이름에서 레이블을 가져옵니다. 이 데이터저장소를 사용하려면 먼저 파일 sequenceDatastore.m을 경로에 저장하십시오.

sequenceDatastore를 사용하여 시퀀스 데이터를 포함하는 데이터저장소를 만듭니다.

folderTrain = fullfile(outputFolder,"Train");
dsTrain = sequenceDatastore(folderTrain)
dsTrain = 
  sequenceDatastore with properties:

            Datastore: [1×1 matlab.io.datastore.FileDatastore]
               Labels: [270×1 categorical]
           NumClasses: 9
    SequenceDimension: 12
        MiniBatchSize: 128
      NumObservations: 270

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

LSTM 네트워크 아키텍처를 정의합니다. 입력 데이터의 시퀀스 차원을 입력 크기로 지정합니다. 은닉 유닛 100개를 갖는 LSTM 계층을 지정하고 시퀀스의 마지막 요소를 출력합니다. 마지막으로, 출력 크기가 클래스 개수와 같은 완전 연결 계층을 지정하고 그 뒤에 소프트맥스 계층과 분류 계층을 지정합니다.

inputSize = dsTrain.SequenceDimension;
numClasses = dsTrain.NumClasses;
numHiddenUnits = 100;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

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

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

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

지정된 훈련 옵션으로 LSTM 네트워크를 훈련시킵니다.

net = trainNetwork(dsTrain,layers,options);

네트워크 테스트하기

테스트 데이터에서 시퀀스 데이터저장소를 만듭니다.

folderTest = fullfile(outputFolder,"Test");
dsTest = sequenceDatastore(folderTest);

테스트 데이터를 분류합니다. 훈련 데이터와 같도록 미니 배치의 크기를 지정합니다.

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

예측의 분류 정확도를 계산합니다.

YTest = dsTest.Labels;
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.8892

참고 문헌

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

[2] Kudo, M., J. Toyama, and M. Shimbo. Japanese Vowels Data Set. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

참고 항목

| | |

관련 항목