Обучите сеть, используя данные последовательности нехватки памяти

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

Преобразованный datastore преобразует или обрабатывает данные, считанные из базового datastore. Можно использовать преобразованный datastore как источник наборов данных для обучения, валидации, тестирования и предсказания для применений глубокого обучения. Используйте преобразованные хранилища данных для чтения данных , которых не помещаютсь в память, или для выполнения определенных операций предварительной обработки при считывании пакетов данных. Когда у вас есть отдельные хранилища данных, содержащие предикторы и метки, вы можете объединить их, чтобы можно было ввести данные в нейронную сеть для глубокого обучения.

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

Загрузка обучающих данных

Загрузите набор данных японских гласных, как описано в [1] и [2]. zip- файла japaneseVowels.zip содержит последовательности различной длины. Последовательности разделены на две папки, Train и Test, которые содержат обучающие последовательности и тестовые последовательности, соответственно. В каждой из этих папок последовательности делятся на подпапки, которые нумеруются из 1 на 9. Имена этих подпапок являются именами меток. A MAT файла представляет каждую последовательность. Каждая последовательность является матрицей с 12 строками, с одной строкой для каждой функции и меняющимся количеством столбцов с одним столбцом для каждого временного шага. Количество строк является размерностью последовательности, а количество столбцов - длиной последовательности.

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

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

Для предикторов обучения создайте файл datastore и укажите, что функция read будет load функция. The load function, загружает данные из 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 и укажите функцию read, которая будет readLabel function, заданная в конце примера. The 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. Задайте количество функций входных данных как размер входов. Задает слой 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 с функцией read readLabel и задайте, чтобы включать подпапки. Задайте, что выходы являются вертикально конкатенабельными, установив 'UniformRead' опция для true.

fdsLabelTest = fileDatastore(folderTest, ...
    'ReadFcn',@(filename) readLabel(filename,classNames), ...
    'IncludeSubfolders',true, ...
    'UniformRead',true);
YTest = readall(fdsLabelTest);
accuracy = mean(YPred == YTest)
accuracy = 0.9351

Функции

The readLabel функция извлекает метку из заданного имени файла по категориям в classNames.

function label = readLabel(filename,classNames)

filepath = fileparts(filename);
[~,label] = fileparts(filepath);

label = categorical(string(label),classNames);

end

The 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

См. также

| | | | |

Похожие темы