Разрабатывайте пользовательский мини-пакет Datastore

Мини-пакетный datastore является реализацией datastore с поддержкой чтения данных пакетами. Можно использовать мини-пакетный datastore как источник обучения, валидации, тестирования и предсказания наборов данных для применений глубокого обучения, которые используют Deep Learning Toolbox™.

Чтобы предварительно обработать последовательность, временные ряды или текстовые данные, создайте свой собственный мини-пакетный datastore с помощью описанной здесь среды. Пример использования пользовательского мини-пакета datastore см. в разделе Train сети с использованием пользовательского мини-пакета Datastore для данных последовательности.

Обзор

Создайте пользовательский интерфейс datastore с помощью пользовательских классов datastore и объектов. Затем используйте пользовательский datastore, чтобы перенести ваши данные в MATLAB®.

Разработка пользовательского мини-пакетного datastore включает наследование от matlab.io.Datastore и matlab.io.datastore.MiniBatchable классы и реализация необходимых свойств и методов. Вы можете добавить поддержку тасования во время обучения.

Потребности в обработке

Классы

Мини-пакетный datastore для обучения, валидации, тестирования и предсказания наборов данных в Deep Learning Toolbox

matlab.io.Datastore и matlab.io.datastore.MiniBatchable

См. «Реализация MiniBatchable Datastore».

Мини-пакетный datastore с поддержкой тасования во время обучения

matlab.io.Datastore, matlab.io.datastore.MiniBatchable, и matlab.io.datastore.Shuffleable

См. Раздел «Добавление поддержки для тасования».

Реализуйте MiniBatchable Datastore

Для реализации пользовательского мини-пакетного datastore с именем MyDatastore, создайте скрипт MyDatastore.m. Скрипт должен находиться в пути MATLAB и содержать код, который наследует от соответствующего класса и определяет необходимые методы. Код для создания мини-пакетного datastore для обучения, валидации, тестирования и предсказания наборов данных в Deep Learning Toolbox должен:

В дополнение к этим шагам можно задать любые другие свойства или методы, которые необходимо обработать и проанализировать свои данные.

Примечание

Если вы обучаете сеть и trainingOptions задает 'Shuffle' как 'once' или 'every-epoch', тогда вы также должны унаследовать от matlab.io.datastore.Shuffleable класс. Для получения дополнительной информации см. раздел «Добавление поддержки для тасования».

Функция чтения datastore должна возвращать данные в таблице. Элементами таблицы должны быть скаляры, векторы-строки или массивы ячеек 1 на 1, содержащие числовой массив.

Для сетей с одним входным слоем первый и второй столбцы задают предикторы и отклики, соответственно.

Совет

Чтобы использовать datastore для сетей с несколькими входными слоями, используйте combine и transform функции для создания datastore, который выводит массив ячеек с (numInputs + 1) столбцы, где numInputs - количество входов сети. В этом случае первый numInputs столбцы задают предикторы для каждого входа, а последний столбец задает отклики. Порядок входов задается InputNames свойство графика слоев layers.

Формат предикторов зависит от типа данных.

ДанныеФормат предикторов
2-D изображение

h -by w -by c числовой массив, где h, w и c являются высотой, шириной и количеством каналов изображения, соответственно.

3-D изображение

h w d c числовым массивом, где h, w, d, и c высота, ширина, глубина и количество каналов изображения, соответственно.

Векторная последовательность

c -by - s матрица, где c - количество функций последовательности, а s - длина последовательности.

2-D последовательности изображений

h -by- w -by- c -by- s массив, где h, w и c соответствуют высоте, ширине и количеству каналов изображения, соответственно, и s является длиной последовательности.

Каждая последовательность в мини-пакете должна иметь одинаковую длину.

3-D последовательности изображений

h -by- w -by- d -by- c -by- s массив, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов изображения, соответственно, и s является длиной последовательности.

Каждая последовательность в мини-пакете должна иметь одинаковую длину.

Функции

c вектор-на-1, где c количество функций.

Элементы таблицы должны содержать числовой скаляр, числовой вектор-строку или массив ячеек 1 на 1, содержащий числовой массив.

trainNetwork функция не поддерживает сети с несколькими входными слоями последовательности.

Формат ответов зависит от типа задачи.

ЗадачаФормат ответов
КлассификацияКатегориальный скаляр
Регресс

  • Скаляр

  • Числовой вектор

  • 3-D числовой массив, представляющий изображение

Классификация последовательность-последовательность

1-by - s последовательность категориальных меток, где s - длина последовательности соответствующей последовательности предикторов.

Регрессия от последовательности к последовательности

R -by - s матрица, где R - количество откликов, а s - длина последовательности соответствующего предиктора.

Элементы таблицы должны содержать категориальный скаляр, числовой скаляр, числовой вектор-строку или массив ячеек 1 на 1, содержащий числовой массив.

В этом примере показано, как создать пользовательский мини-пакет datastore для обработки данных последовательности. Сохраните скрипт в файле с именем MySequenceDatastore.m.

ШагиРеализация

 

  1. Начните определять свой класс. Наследование от базового класса matlab.io.Datastore и matlab.io.datastore.MiniBatchable класс.

     

  2. Задайте свойства.

    • Переопределите MiniBatchSize и NumObservations свойства. Вы опционально можете назначить дополнительное свойство атрибуты любому свойству. Для получения дополнительной информации см. раздел «Атрибуты свойств».

    • Можно также задать свойства, уникальные для пользовательского мини-пакета datastore.

     

  3. Определите методы.

    • Реализуйте пользовательский мини-пакетный конструктор datastore.

    • Реализуйте hasdata способ.

    • Реализуйте read метод, который должен возвращать данные как таблицу с предикторами в первом столбце и откликами во втором столбце.

      Для данных последовательности последовательности должны быть матрицами размера c -by - s, где c количество функций и s является длиной последовательности. Значение s может варьироваться в зависимости от мини-пакетов.

    • Реализуйте reset способ.

    • Реализуйте progress способ.

    • Можно также задать методы, уникальные для пользовательского мини-пакета datastore.

     

  4. Завершите classdef раздел.

classdef MySequenceDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable
    
    properties
        Datastore
        Labels
        NumClasses
        SequenceDimension
        MiniBatchSize
    end
    
    properties(SetAccess = protected)
        NumObservations
    end

    properties(Access = private)
        % This property is inherited from Datastore
        CurrentFileIndex
    end


    methods
        
        function ds = MySequenceDatastore(folder)
            % Construct a MySequenceDatastore object

            % Create a file datastore. The readSequence function is
            % defined following the class definition.
            fds = fileDatastore(folder, ...
                'ReadFcn',@readSequence, ...
                'IncludeSubfolders',true);
            ds.Datastore = fds;

            % Read labels from folder names
            numObservations = numel(fds.Files);
            for i = 1:numObservations
                file = fds.Files{i};
                filepath = fileparts(file);
                [~,label] = fileparts(filepath);
                labels{i,1} = label;
            end
            ds.Labels = categorical(labels);
            ds.NumClasses = numel(unique(labels));
            
            % Determine sequence dimension. When you define the LSTM
            % network architecture, you can use this property to
            % specify the input size of the sequenceInputLayer.
            X = preview(fds);
            ds.SequenceDimension = size(X,1);
            
            % Initialize datastore properties.
            ds.MiniBatchSize = 128;
            ds.NumObservations = numObservations;
            ds.CurrentFileIndex = 1;
        end

        function tf = hasdata(ds)
            % Return true if more data is available
            tf = ds.CurrentFileIndex + ds.MiniBatchSize - 1 ...
                <= ds.NumObservations;
        end

        function [data,info] = read(ds)            
            % Read one mini-batch batch of data
            miniBatchSize = ds.MiniBatchSize;
            info = struct;
            
            for i = 1:miniBatchSize
                predictors{i,1} = read(ds.Datastore);
                responses(i,1) = ds.Labels(ds.CurrentFileIndex);
                ds.CurrentFileIndex = ds.CurrentFileIndex + 1;
            end
            
            data = preprocessData(ds,predictors,responses);
        end

        function data = preprocessData(ds,predictors,responses)
            % data = preprocessData(ds,predictors,responses) preprocesses
            % the data in predictors and responses and returns the table
            % data
            
            miniBatchSize = ds.MiniBatchSize;
            
            % Pad data to length of longest sequence.
            sequenceLengths = cellfun(@(X) size(X,2),predictors);
            maxSequenceLength = max(sequenceLengths);
            for i = 1:miniBatchSize
                X = predictors{i};
                
                % Pad sequence with zeros.
                if size(X,2) < maxSequenceLength
                    X(:,maxSequenceLength) = 0;
                end
                
                predictors{i} = X;
            end
            
            % Return data as a table.
            data = table(predictors,responses);
        end

        function reset(ds)
            % Reset to the start of the data
            reset(ds.Datastore);
            ds.CurrentFileIndex = 1;
        end
        
    end 

    methods (Hidden = true)

        function frac = progress(ds)
            % Determine percentage of data read from datastore
            frac = (ds.CurrentFileIndex - 1) / ds.NumObservations;
        end

    end

end % end class definition
В реализации метода read вашего пользовательского datastore используется функция, называемая readSequence. Вы должны создать эту функцию, чтобы считать данные последовательности из MAT-файла.
function data = readSequence(filename)
% data = readSequence(filename) reads the sequence X from the MAT-file
% filename

S = load(filename);
data = S.X;
end

Добавьте поддержку для тасования

Чтобы добавить поддержку тасования, сначала следуйте инструкциям в реализации MiniBatchable Datastore, а затем обновляйте код реализации в MySequenceDatastore.m кому:

Этот пример кода добавляет поддержку тасования к MySequenceDatastore класс. Вертикальные эллипсы указывают, где следует скопировать код из MySequenceDatastore реализация.

ШагиРеализация

 

  1. Обновите определение класса, чтобы также наследовать от matlab.io.datastore.Shuffleable класс.

     

  2. Добавьте определение для shuffle к существующей methods раздел.

classdef MySequenceDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable & ...
                       matlab.io.datastore.Shuffleable
   
   % previously defined properties 
   .
   .
   . 


   methods

        % previously defined methods
        .
        .
        . 
   
        function dsNew = shuffle(ds)
            % dsNew = shuffle(ds) shuffles the files and the
            % corresponding labels in the datastore.
            
            % Create a copy of datastore
            dsNew = copy(ds);
            dsNew.Datastore = copy(ds.Datastore);
            fds = dsNew.Datastore;
            
            % Shuffle files and corresponding labels
            numObservations = dsNew.NumObservations;
            idx = randperm(numObservations);
            fds.Files = fds.Files(idx);
            dsNew.Labels = dsNew.Labels(idx);
        end

     end

end
  

Проверьте пользовательский мини-пакет Datastore

Если вы выполнили все инструкции, представленные здесь, то реализация вашего пользовательского мини-пакетного datastore завершена. Перед использованием этого datastore проверьте его с помощью руководящих принципов, представленных в Руководствах по тестированию для пользовательских хранилищ данных.

См. также

Похожие примеры

Подробнее о