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

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

Чтобы предварительно обработать последовательность, временные ряды или текстовые данные, создают ваш собственный мини-пакетный datastore с помощью среды, описанной здесь. Для примера, показывающего, как использовать пользовательский мини-пакетный datastore, смотрите, Обучат сеть Используя Пользовательский Мини-пакетный 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

Смотрите добавляет поддержка перестановки.

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

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

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

Примечание

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

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

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

 

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

     

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

    • Переопределите свойства MiniBatchSize и NumObservations. Опционально можно присвоить атрибуты дополнительного свойства любому свойству. Для получения дополнительной информации см. Атрибуты свойств (MATLAB).

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

     

  3. Задайте методы.

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

    • Реализуйте метод hasdata.

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

      Для данных о последовательности последовательности должны быть матрицами размера D-by-S, где D является количеством функций, и 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
Реализация метода чтения вашего пользовательского 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 квалифицируйте его с помощью инструкций, представленных в Руководстве по тестированию для Пользовательских Хранилищ данных (MATLAB).

Смотрите также

Связанные примеры

Больше о

Для просмотра документации необходимо авторизоваться на сайте