exponenta event banner

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

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

Выбор хранилища данных

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

Хранилище данныхОписаниеТребуется дополнительная панель инструментов
ImageDatastoreХранилище данных для данных изображенияничего
AugmentedImageDatastore

Хранилище данных для изменения размеров и увеличения количества обучающих изображений

Хранилище данных недетерминировано

ничего
PixelLabelDatastore(Панель инструментов компьютерного зрения)

Хранилище данных для данных пиксельной метки

Компьютерное зрение Toolbox™

PixelLabelImageDatastore(Панель инструментов компьютерного зрения)

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

Хранилище данных недетерминировано

Инструментарий компьютерного зрения

boxLabelDatastore(Панель инструментов компьютерного зрения)

Хранилище данных для данных метки ограничивающей рамки

Инструментарий компьютерного зрения

RandomPatchExtractionDatastore(Панель инструментов обработки изображений)

Хранилище данных для извлечения случайных исправлений из данных на основе изображений

Хранилище данных недетерминировано

Toolbox™ обработки изображений

blockedImageDatastore(Панель инструментов обработки изображений)Хранилище данных для блочного считывания и обработки данных изображения, включая большие изображения, которые не помещаются в памятьПанель инструментов обработки изображений
DenoisingImageDatastore(Панель инструментов обработки изображений)

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

Хранилище данных недетерминировано

Панель инструментов обработки изображений

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

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

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

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

Обучение и проверка

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

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

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

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

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

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

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

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

Элементы таблицы должны быть скалярами, векторами строк или массивами ячеек 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-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, содержащим числовой массив.

Прогноз

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

Укажите размер чтения и размер мини-пакета

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

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

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

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

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

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

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

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

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

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

Пример: Преобразовать хранилище данных изображения в сеть классификации цифр

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

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

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

Установите размер мини-партии равным ReadSize хранилища данных образа.

miniBatchSize = 128;
imds.ReadSize = miniBatchSize;

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

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

  TransformedDatastore with properties:

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

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

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

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

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

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

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

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

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

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

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

Использование хранилища данных для параллельного обучения и фонового планирования

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

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

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

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

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

См. также

| | | |

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

Подробнее