Этот пример показывает, как обучить нейронную сеть для глубокого обучения на данных о последовательности из памяти с помощью пользовательского мини-пакетного datastore.
Мини-пакетный datastore является реализацией datastore с поддержкой чтения данных в пакетах. Используйте мини-пакетные хранилища данных, чтобы считать данные, которые не помещаются в память, или выполнить определенные операции предварительной обработки при чтении пакетов данных. Можно использовать мини-пакетный datastore в качестве источника обучения, валидации, теста и наборов данных прогноза для применения глубокого обучения.
Этот пример использует пользовательский мини-пакетный datastore sequenceDatastore.m
. Можно адаптировать этот datastore к данным путем настройки функций datastore. Для примера, показывающего, как создать ваш собственный мини-пакетный datastore, смотрите, Разрабатывают Пользовательский Мини-пакетный Datastore.
Загрузите японский набор данных Гласных, как описано в [1] и [2]. Zip-файл japaneseVowels.zip
содержит последовательности переменной длины. Последовательности разделены на две папки, Train
и Test
, которые содержат обучающие последовательности и тестируют последовательности, соответственно. В каждой из этих папок последовательности разделены на подпапки, которые пронумерованы от 1
до 9
. Имена этих подпапок являются именами метки. Файл MAT представляет каждую последовательность. Каждая последовательность является матрицей с 12 строками, с одной строкой для каждой функции и переменным количеством столбцов, с одним столбцом для каждого временного шага. Количество строк является размерностью последовательности, и количество столбцов является длиной последовательности.
Разархивируйте данные о последовательности.
filename = "japaneseVowels.zip"; outputFolder = fullfile(tempdir,"japaneseVowels"); unzip(filename,outputFolder);
Создайте пользовательский мини-пакетный datastore. Мини-пакетный datastore sequenceDatastore
считывает данные из папки и получает метки от подымен папок. Чтобы использовать этот datastore, сначала сохраните файл sequenceDatastore.m
к пути.
Создайте datastore, содержащий данные о последовательности с помощью 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 скрытыми модулями и выводить последний элемент последовательности. Наконец, задайте полносвязный слой с выходным размером, равным количеству классов, сопровождаемых softmax слоем и слоем классификации.
inputSize = dsTrain.SequenceDimension; numClasses = dsTrain.NumClasses; numHiddenUnits = 100; layers = [ ... sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
Задайте опции обучения. Задайте 'adam'
как решатель и 'GradientThreshold'
как 1. Установите мини-пакетный размер на 27 и определите максимальный номер эпох к 75.
Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Установите 'ExecutionEnvironment'
на 'cpu'
. Чтобы обучаться на графическом процессоре, при наличии, устанавливает '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);
Создайте datastore последовательности из тестовых данных.
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. Тояма, и М. Шимбо. "Многомерная Классификация Кривых Используя Прохождение через области". Буквы Распознавания образов. Издание 20, № 11-13, стр 1103–1111.
[2] Kudo, M. J. Тояма, и М. Шимбо. Японский набор данных гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
lstmLayer
| sequenceInputLayer
| trainNetwork
| trainingOptions