Хранилища данных для глубокого обучения

Хранилища данных в MATLAB® являются удобным способом работать с и представлять наборы данных, которые являются слишком большими, чтобы уместиться в памяти когда-то. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.

Выберите Datastore

Для многих приложений самый легкий подход должен запуститься со встроенного datastore. Для получения дополнительной информации о доступных встроенных хранилищах данных, смотрите, Выбирают Datastore for File Format или Application (MATLAB). Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входа для сетевого обучения, валидации и вывода. Эти хранилища данных:

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

Для некоторых приложений не может быть встроенного типа хранилища данных, который соответствует вашим данным хорошо. Для этих проблем можно создать пользовательский datastore. Для получения дополнительной информации смотрите, Разрабатывают Пользовательский Datastore (MATLAB). Все пользовательские хранилища данных являются допустимыми входными параметрами к интерфейсам глубокого обучения, пока функция read пользовательского datastore возвращает данные в необходимой форме 2D столбца.

Введите Datastore для обучения, валидации и вывода

Хранилища данных являются допустимыми входными параметрами в Deep Learning Toolbox™ для обучения, валидации и вывода.

Обучение и валидация

Чтобы использовать datastore изображений в качестве источника данных тренировки, используйте аргумент imds trainNetwork. Чтобы использовать все другие типы datastore как источник данных тренировки, используйте ds аргумент trainNetwork. Чтобы использовать datastore для валидации, используйте аргумент пары "имя-значение" 'ValidationData' в trainingOptions.

Чтобы быть допустимым входом для обучения или валидации, функция read datastore (за исключением ImageDatastore) должна возвратить данные или как массив 2D ячейки столбца или как таблицу 2D столбца. Первый столбец данных представляет входные параметры сети, и второй столбец данных представляет ответы. Каждая строка данных представляет отдельное наблюдение. Для ImageDatastore только, trainNetwork и trainingOptions поддерживают данные, возвращенные как целочисленные массивы и массив ячеек отдельного столбца целочисленных массивов.

Таблица показывает демонстрационный вывод вызывания функции read для datastore ds.

Формат считанных данныхДемонстрационный Вывод
Массив 2D ячейки столбца
data = read(ds)
data =

  4×2 cell array

    {28×28 double}    {[7]}
    {28×28 double}    {[7]}
    {28×28 double}    {[9]}
    {28×28 double}    {[9]}
Таблица 2D столбца
data = read(ds)
data =

  4×2 table

        input         response
    ______________    ________

    {28×28 double}       7    
    {28×28 double}       7    
    {28×28 double}       9    
    {28×28 double}       9  

Вывод

Для вывода с помощью predict, classify и activations, datastore только требуется, чтобы приводить к одному столбцу. Функции вывода игнорируют дополнительные столбцы данных вне первого.

Задайте размер чтения и мини-обработайте размер в пакетном режиме

Datastore может возвратить любое количество строк (наблюдения) для каждого вызова read. Функционирует, такие как trainNetwork, predict, classify и activations, которые принимают хранилища данных и поддержку, задающую, 'MiniBatchSize' вызывают read так много раз, как необходимо, чтобы сформировать полные мини-пакеты данных. Когда эти функции формируют мини-пакеты, они используют внутренние очереди в памяти, чтобы хранить данные о чтении. Например, если datastore последовательно возвращает 64 строки на вызов read, и MiniBatchSize является 128, то сформироваться, каждый мини-пакет данных требует двух вызовов read.

Для лучшей производительности во время выполнения рекомендуется сконфигурировать хранилища данных, таким образом, что количество наблюдений, возвращенных read, равно 'MiniBatchSize'. Для хранилищ данных, которые имеют свойство 'ReadSize', установите 'ReadSize' изменять количество наблюдений, возвращенных datastore для каждого вызова read.

Преобразуйте и объедините хранилища данных

Глубокое обучение часто требует, чтобы данные были предварительно обработаны и увеличены, прежде чем данные будут в соответствующей форме, чтобы ввести к сети. transform и функции combine datastore полезны в подготовке данных, которые будут поданы в сеть.

Преобразуйте хранилища данных

Функция transform создает измененную форму datastore, названного underlying datastore, путем преобразования данных, считанных базовым datastore.

  • Для комплексных преобразований, включающих несколько операций предварительной обработки, задайте полный набор преобразований в вашей собственной функции. Затем задайте указатель на свою функцию в качестве аргумента @fcn transform. Для получения дополнительной информации смотрите, Создают Функции в Файлах (MATLAB).

  • Для простых преобразований, которые могут быть выражены в одной строке кода, можно задать указатель на анонимную функцию в качестве аргумента @fcn transform. Для получения дополнительной информации см. Анонимные функции (MATLAB).

Указатель на функцию, предоставленный transform, должен принять входные данные в том же формате, как возвращено функцией read базового datastore.

Пример: преобразуйте Datastore изображений, чтобы обучить сеть классификации цифр

Этот пример использует функцию transform, чтобы создать набор обучающих данных, в котором рандомизировал 90 вращений степени, добавляется к каждому изображению в datastore изображений. Передайте получившийся TransformedDatastore trainNetwork, чтобы обучить простую сеть классификации цифр.

Создайте datastore изображений, содержащий изображения цифры.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet', ...
    'nndemos','nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Установите мини-пакетный размер, равный ReadSize datastore изображений.

miniBatchSize = 128;
imds.ReadSize = miniBatchSize;

Преобразуйте изображения в datastore изображений путем добавления, рандомизировал 90 вращений степени. Функция преобразования, preprocessForTraining, задана в конце этого примера.

dsTrain = transform(imds,@preprocessForTraining,'IncludeInfo',true)
dsTrain = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1×1 matlab.io.datastore.ImageDatastore]
             Transforms: {@preprocessForTraining}
            IncludeInfo: 1

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

layers = [ ...
    imageInputLayer([28 28 1],'Normalization','none')
    convolution2dLayer(5,20)
    reluLayer()
    maxPooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10);
    softmaxLayer()
    classificationLayer()];
 
options = trainingOptions('adam', ...
    'Plots','training-progress', ...
    'MiniBatchSize',miniBatchSize);
 
net = trainNetwork(dsTrain,layers,options);

Задайте функцию, которая выполняет желаемые преобразования данных, data, считанного из базового datastore. Функциональные циклы посредством каждого чтения отображают, и выполняет рандомизированное вращение, затем возвращает преобразованное изображение и соответствующую метку как массив 2D ячейки столбца как ожидалось trainNetwork.

function [dataOut,info] = preprocessForTraining(data,info)
 
numRows = size(data,1);
dataOut = cell(numRows,2);
 
for idx = 1:numRows
    
    % Randomized 90 degree rotation
    imgOut = rot90(data{idx,1},randi(4)-1);
    
    % Return the label from info struct as the 
    % second column in dataOut.
    dataOut(idx,:) = {imgOut,info.Label(idx)};
    
end
end

Объедините хранилища данных

Функция combine сопоставляет два хранилища данных той же длины, чтобы создать 2D формат столбца, ожидаемый данных об обучении и валидации. Объединение хранилищ данных поддерживает четность между хранилищами данных. Каждый вызов функции read получившегося CombinedDatastore возвращает данные из соответствующих частей базовых хранилищ данных.

Например, если вы - обучение изображение в, отображаете сеть регрессии, затем можно создать обучающий набор данных путем объединения двух хранилищ данных изображений. Этот пример кода демонстрирует объединение двух хранилищ данных изображений под названием imdsX и imdsY. Хранилища данных изображений возвращают данные как массив ячеек, поэтому объединенный datastore, imdsTrain возвращает данные как массив 2D ячейки столбца.

imdsX = imageDatastore(___);
imdsY = imageDatastore(___);
imdsTrain = combine(imdsX,imdsY)
imdsTrain = 

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

Используйте Datastore для параллельного обучения и выберите оптимизацию чтения с упреждением

Хранилища данных, используемые для параллельного обучения или обучения мультиграфического процессора, должны быть partitionable. Задайте параллель или обучение мультиграфического процессора использование аргумента пары "имя-значение" 'ExecutionEnvironment' trainingOptions.

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

Если необходимо создать пользовательский datastore, который поддерживает параллель или обучение мультиграфического процессора, то datastore должен реализовать класс matlab.io.datastore.Partitionable.

Некоторая partitionable поддержка хранилищ данных, считывая данные тренировки с помощью асинхронного чтения упреждающей выборки, который данные очередей в памяти, в то время как графический процессор работает. Задайте чтение упреждающей выборки с помощью аргумента пары "имя-значение" 'DispatchInBackground' trainingOptions. Чтение упреждающей выборки требует Parallel Computing Toolbox™.

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

  • Хранилища данных не поддерживают определение аргумента пары "имя-значение" 'Shuffle' trainingOptions как 'none'.

  • Объединенные хранилища данных не partitionable и поэтому не поддерживают параллельное обучение, обучение мультиграфического процессора или чтение упреждающей выборки.

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

| | | |

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

Больше о