Разработайте пользовательский мини-пакетный 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

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

Реализуйте 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.

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

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

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

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

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

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

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

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

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

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

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

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-by-1 вектор-столбец, где c является количеством функций.

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

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

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

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

  • Скаляр

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

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

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

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

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

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

Больше о