Datastores для глубокого обучения

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

Выберите Datastore

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

DatastoreОписаниеТребуется дополнительный тулбокс
ImageDatastoreDatastore для данных изображенийничего
AugmentedImageDatastore

Datastore для изменения размера и увеличения обучающих изображений

Datastore недетерминирован

ничего
PixelLabelDatastore (Computer Vision Toolbox)

Datastore для данных о пиксельных метках

Computer Vision Toolbox™

PixelLabelImageDatastore (Computer Vision Toolbox)

Datastore для настройки сетей семантической сегментации

Datastore недетерминирован

Computer Vision Toolbox

boxLabelDatastore (Computer Vision Toolbox)

Datastore для данных метки ограничивающего прямоугольника

Computer Vision Toolbox

RandomPatchExtractionDatastore(Набор Image Processing Toolbox)

Datastore для извлечения случайных закрашенных фигур из основанных на изображениях данных

Datastore недетерминирован

Image Processing Toolbox™

blockedImageDatastore(Набор Image Processing Toolbox)Datastore для блочного чтения и обработки данных об изображениях, включая большие изображения, которые не помещаются в памятиImage Processing Toolbox
DenoisingImageDatastore(Набор Image Processing Toolbox)

Datastore, для обучения изображения, деноидирующего глубокую нейронную сеть

Datastore недетерминирован

Image Processing Toolbox

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

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

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

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

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

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

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

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

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

В следующей таблице показаны выходные выходы вызова read функция для ds datastore.

Сетевая архитектураВыход DatastoreПример выхода
Один входной слой

Таблица или массив ячеек с двумя столбцами.

Первый и второй столбцы задают предикторы и отклики, соответственно.

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

Пользовательские мини-пакетные хранилища данных должны выводить таблицы.

Таблица для сети с одним входом и одним выходом:

data = read(ds)
data =

  4×2 table

        Predictors        Response
    __________________    ________

    {224×224×3 double}       2    
    {224×224×3 double}       7    
    {224×224×3 double}       9    
    {224×224×3 double}       9  

Массив ячеек для сети с одним входом и одним выходом:

data = read(ds)
data =

  4×2 cell array

    {224×224×3 double}    {[2]}
    {224×224×3 double}    {[7]}
    {224×224×3 double}    {[9]}
    {224×224×3 double}    {[9]}

Несколько входных слоев

Массив ячеек с (numInputs + 1) столбцы, где numInputs - количество входов сети.

Первый numInputs столбцы задают предикторы для каждого входа, а последний столбец задает отклики.

Порядок входов задается InputNames свойство графика слоев layers.

Массив ячеек для сети с двумя входами и одним выходом.

data = read(ds)
data =

  4×3 cell array

    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[9]}
    {224×224×3 double}    {128×128×3 double}    {[9]}

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

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

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

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

h w d 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 -by- d -by- c -by- s массив, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов изображения, соответственно, и s является длиной последовательности.

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

Функции

c вектор-на-1, где c количество функций.

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

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

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

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

  • Скаляр

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

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

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

1-by - s последовательность категориальных меток, где s - длина последовательности соответствующей последовательности предикторов.

Регрессия от последовательности к последовательности

R -by - s матрица, где R - количество откликов, а s - длина последовательности соответствующего предиктора.

Для ответов, возвращенных в таблицах, элементы должны быть категориальным скаляром, числовым скаляром, числовым вектором-строкой или массивом ячеек 1 на 1, содержащим числовой массив.

Предсказание

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

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

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

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

Преобразование и объединение хранилищ данных

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

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

Преобразование хранилищ данных

Преобразованный datastore применяет конкретное преобразование данных к базовому хранилищу данных при чтении данных. Чтобы создать преобразованный datastore, используйте transform и задайте базовый datastore и преобразование.

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

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

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

Пример: Преобразуйте Image 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);

Определите функцию преобразования, preprocessForTraining. Вход функции является пакетом данных, 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 функция связывает несколько хранилищ данных. Работа с полученной CombinedDatastore, например, сброс datastore, выполняет ту же операцию во всех базовых хранилищах данных. Вызов read Функция комбинированного datastore считывает один пакет данных из всех N базовых хранилищ данных, который должен вернуть одинаковое количество наблюдений. Чтение из комбинированного datastore возвращает горизонтально конкатенированные результаты в массиве ячеек N -столбец, который подходит для обучения и валидации. Перемещение комбинированного datastore приводит к идентичному рандомизированному упорядоченному расположению файлов в базовых хранилищах данных.

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

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

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

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

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

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

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

  • Поддерживает параллельное обучение

  • Повышает эффективность за счет кэширования изображений

Используйте Datastore для параллельного обучения и диспетчеризации фона

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

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

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

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

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

См. также

| | | |

Похожие примеры

Подробнее о