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

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

Выберите Datastore

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

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

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

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

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

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

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

Быть допустимым входом для обучения или валидации, read функция datastore (за исключением ImageDatastore) должен возвратить данные или как массив ячеек или как таблицу.

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

Для сетей с несколькими входными параметрами datastore должен быть объединенным или преобразованным datastore, который возвращает массив ячеек с (numInputs+1) столбцы, содержащие предикторы и ответы, где numInputs количество сетевых входных параметров и numResponses количество ответов. Для i меньше чем или равный numInputs, iэлемент th массива ячеек соответствует входу layers.InputNames(i), где layers график слоя, задающий сетевую архитектуру. Последний столбец массива ячеек соответствует ответам.

Таблица показывает демонстрационный выход вызова 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  
Несколько - вход(numInputs+1) - массив ячейки столбца
data = read(ds)
data =

  4×3 cell array

    {28×28 double}    {128×128 double}    {[7]}
    {28×28 double}    {128×128 double}    {[7]}
    {28×28 double}    {128×128 double}    {[9]}
    {28×28 double}    {128×128 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 полезны в подготовке данных, которые будут поданы в сеть.

Для сетей с несколькими входными параметрами используйте объединенный 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. Функциональные циклы посредством каждого чтения отображают, и выполняет рандомизированное вращение, затем возвращает преобразованное изображение и соответствующую метку как массив ячеек как ожидалось 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 функционируйте сопоставляет два хранилища данных той же длины, чтобы создать формат, ожидаемый данных об обучении и валидации. Объединение хранилищ данных обеспечивает четность между хранилищами данных. Каждый вызов read функция получившегося CombinedDatastore возвращает данные из соответствующих частей базовых хранилищ данных.

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

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

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

Если у вас есть Image Processing Toolbox, то randomPatchExtractionDatastore предоставляет альтернативное решение соединения основанных на изображении данных в ImageDatastores, PixelLabelDatastores, и TransformedDatastores с базовым типом любого из двух предыдущих хранилищ данных. randomPatchExtractionDatastore имеет несколько преимуществ перед соединением данных с помощью combine функция. А именно, случайный datastore экстракции закрашенной фигуры:

  • Обеспечивает простой способ извлечь закрашенные фигуры и из 2D и из 3-D данных, не требуя, чтобы вы реализовали пользовательскую операцию обрезки с помощью transform и combine

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

  • Поддерживает эффективное преобразование между категориальными и числовыми данными при применянии преобразований изображений к категориальным данным

  • Поддержки параллельны обучению

  • Улучшает производительность путем кэширования изображений

Используйте 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 и поэтому не поддерживают параллельное обучение, обучение мультиграфического процессора или фоновую диспетчеризацию.

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

| | | |

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

Больше о