Этот пример показывает, как обучить нейронную сеть для глубокого обучения на данных о последовательности из памяти путем преобразования и объединения хранилищ данных.
Преобразованный datastore преобразовывает или данные о процессах, считанные из базового datastore, можно использовать преобразованный datastore в качестве источника обучения, валидации, теста и наборов данных прогноза для применения глубокого обучения. Используйте преобразованные хранилища данных, чтобы считать данные, которые не помещаются в память, или выполнить определенные операции предварительной обработки при чтении пакетов данных. Когда у вас есть отдельные хранилища данных, содержащие предикторы и метки, можно объединить их так, можно ввести данные в нейронную сеть для глубокого обучения.
При обучении сети программное обеспечение создает мини-пакеты последовательностей той же длины путем дополнения, обрезая или разделяя входные данные. Для данных в оперативной памяти функция trainingOptions предоставляет возможности заполнять и обрезать входные последовательности, однако, для данных, которые не помещаются в память, необходимо заполнить и обрезать последовательности вручную.
Загрузите японский набор данных Гласных, как описано в [1] и [2]. Zip-файл japaneseVowels.zip содержит последовательности переменной длины. Последовательности разделены на две папки, Train и Test, которые содержат обучающие последовательности и тестируют последовательности, соответственно. В каждой из этих папок последовательности разделены на подпапки, которые пронумерованы от 1 до 9. Имена этих подпапок являются именами метки. Файл MAT представляет каждую последовательность. Каждая последовательность является матрицей с 12 строками, с одной строкой для каждой функции и переменным количеством столбцов, с одним столбцом для каждого временного шага. Количество строк является размерностью последовательности, и количество столбцов является длиной последовательности.
Разархивируйте данные о последовательности.
filename = "japaneseVowels.zip"; outputFolder = fullfile(tempdir,"japaneseVowels"); unzip(filename,outputFolder);
Для учебных предикторов создайте datastore файла и задайте функцию чтения, чтобы быть функцией load. Функция load, загружает данные из MAT-файла в массив структур. Чтобы считать файлы из подпапок в учебной папке, установите опцию 'IncludeSubfolders' на true.
folderTrain = fullfile(outputFolder,"Train"); fdsPredictorTrain = fileDatastore(folderTrain, ... 'ReadFcn',@load, ... 'IncludeSubfolders',true);
Предварительно просмотрите datastore. Возвращенный struct содержит одну последовательность из первого файла.
preview(fdsPredictorTrain)
ans = struct with fields:
X: [12×20 double]
Для меток создайте datastore файла и задайте функцию чтения, чтобы быть функцией readLabel, заданной в конце примера. Функция readLabel извлекает метку с подымени папки.
classNames = string(1:9); fdsLabelTrain = fileDatastore(folderTrain, ... 'ReadFcn',@(filename) readLabel(filename,classNames), ... 'IncludeSubfolders',true);
Предварительно просмотрите datastore. Вывод соответствует метке первого файла.
preview(fdsLabelTrain)
ans = categorical
1
Чтобы ввести данные о последовательности из datastore предикторов к нейронной сети для глубокого обучения, мини-пакеты последовательностей должны иметь ту же длину. Преобразуйте datastore с помощью функции padSequence, заданной в конце datastore, который заполняет или обрезает последовательности, чтобы иметь длину 20.
sequenceLength = 20; tdsTrain = transform(fdsPredictorTrain,@(data) padSequence(data,sequenceLength));
Предварительно просмотрите преобразованный datastore. Вывод соответствует заполненной последовательности из первого файла.
X = preview(tdsTrain)
X = 1×1 cell array
{12×20 double}
Чтобы ввести и предикторы и метки от обоих хранилищ данных в нейронную сеть для глубокого обучения, объедините их использующий функцию combine.
cdsTrain = combine(tdsTrain,fdsLabelTrain);
Предварительно просмотрите объединенный datastore. Datastore возвращает 1 2 массив ячеек. Первый элемент соответствует предикторам. Второй элемент соответствует метке.
preview(cdsTrain)
ans = 1×2 cell array
{12×20 double} {[1]}
Задайте архитектуру сети LSTM. Задайте количество функций входных данных как входной размер. Задайте слой LSTM с 100 скрытыми модулями и выводить последний элемент последовательности. Наконец, задайте полносвязный слой с выходным размером, равным количеству классов, сопровождаемых softmax слоем и слоем классификации.
numFeatures = 12; numClasses = numel(classNames); numHiddenUnits = 100; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
Задайте опции обучения. Установите решатель на 'adam' и 'GradientThreshold' к 2. Установите мини-пакетный размер на 27 и определите максимальный номер эпох к 75. Хранилища данных не поддерживают перестановку, таким образом, устанавливает 'Shuffle' на 'never'.
Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Установите 'ExecutionEnvironment' на 'cpu'. Чтобы обучаться на графическом процессоре, при наличии, устанавливает 'ExecutionEnvironment' на 'auto' (значение по умолчанию).
miniBatchSize = 27; options = trainingOptions('adam', ... 'ExecutionEnvironment','cpu', ... 'MaxEpochs',75, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThreshold',2, ... 'Shuffle','never',... 'Verbose',0, ... 'Plots','training-progress');
Обучите сеть LSTM с заданными опциями обучения.
net = trainNetwork(cdsTrain,layers,options);

Создайте преобразованный datastore, содержащий протянутые тестовые данные с помощью тех же шагов что касается данных тренировки.
folderTest = fullfile(outputFolder,"Test"); fdsPredictorTest = fileDatastore(folderTest, ... 'ReadFcn',@load, ... 'IncludeSubfolders',true); tdsTest = transform(fdsPredictorTest,@(data) padSequence(data,sequenceLength));
Сделайте прогнозы на тестовых данных с помощью обучившего сеть.
YPred = classify(net,tdsTest,'MiniBatchSize',miniBatchSize);Вычислите точность классификации на тестовые данные. Чтобы получить метки набора тестов, создайте datastore файла с функцией чтения readLabel и задайте, чтобы включать подпапки. Укажите, что выходные параметры вертикально concatenateable путем установки опции 'UniformRead' на true.
fdsLabelTest = fileDatastore(folderTest, ... 'ReadFcn',@(filename) readLabel(filename,classNames), ... 'IncludeSubfolders',true, ... 'UniformRead',true); YTest = readall(fdsLabelTest);
accuracy = mean(YPred == YTest)
accuracy = 0.9351
Функция readLabel извлекает метку от заданного имени файла по категориям в classNames.
function label = readLabel(filename,classNames) filepath = fileparts(filename); [~,label] = fileparts(filepath); label = categorical(string(label),classNames); end
Функция padSequence заполняет или обрезает последовательность в data.X, чтобы иметь заданную длину последовательности и возвращает результат в ячейке 1 на 1.
function sequence = padSequence(data,sequenceLength) sequence = data.X; [C,S] = size(sequence); if S < sequenceLength padding = zeros(C,sequenceLength-S); sequence = [sequence padding]; else sequence = sequence(:,1:sequenceLength); end sequence = {sequence}; end
combine | lstmLayer | sequenceInputLayer | trainNetwork | trainingOptions | transform