exponenta event banner

Разработка собственного мини-хранилища пакетных данных

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

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

Обзор

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

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

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

Классы

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

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

См. раздел Внедрение хранилища данных MiniBatchable.

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

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

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

Орудие MiniBatchable Хранилище данных

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

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

Примечание

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

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

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

Совет

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

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

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

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 - длина последовательности.

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

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

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

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

h-by-w-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, содержащий числовой массив.

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

ШагиВнедрение

 

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

     

  2. Определение свойств.

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

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

     

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

    • Реализация пользовательского конструктора мини-пакетного хранилища данных.

    • Реализация hasdata способ.

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

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

    • Реализация reset способ.

    • Реализация progress способ.

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

     

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

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

Для добавления поддержки тасования сначала следуйте инструкциям в Implement 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
  

Проверка настраиваемого мини-хранилища пакетных данных

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

См. также

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

Подробнее