trainNetwork

Обучите глубокую нейронную сеть

Описание

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

Для примера можно обучить:

  • сверточная нейронная сеть (ConvNet, CNN) для данных изображений

  • рекуррентная нейронная сеть (RNN), такая как длительная краткосрочная память (LSTM) или стробированная сеть рекуррентного модуля (GRU) для данных последовательности и timeseries

  • многослойная сеть перцептрона (MLP) для числовых данных о функциях

Можно обучаться либо на центральном процессоре, либо на графическом процессоре. Для классификации изображений и регрессии изображений можно обучить одну сеть параллельно с помощью нескольких графических процессоров или локального или удаленного параллельного пула. Для обучения на графическом процессоре или параллельно требуется Parallel Computing Toolbox™. Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Чтобы задать опции обучения, включая опции окружения выполнения, используйте trainingOptions функция.

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

пример

net = trainNetwork(images,layers,options) обучает нейронную сеть, заданную layers для задач классификации и регрессии изображений с использованием изображений и откликов, заданных images и опции обучения, определяемые options.

пример

net = trainNetwork(images,responses,layers,options) обучает с использованием изображений, заданных images и ответы, заданные responses.

net = trainNetwork(sequences,layers,options) обучает нейронную сеть для задач классификации и регрессии последовательностей или timeseries (для примера, сети LSTM или GRU), используя последовательности и отклики, заданные sequences.

пример

net = trainNetwork(sequences,responses,layers,options) обучает с использованием последовательностей, заданных sequences и ответы, заданные responses.

пример

net = trainNetwork(features,layers,options) обучает нейронную сеть для задач классификации или регрессии функции (для примера, сеть многослойного перцептрона (MLP)), используя функцию данные и отклики, заданные features.

net = trainNetwork(features,responses,layers,options) обучает, используя данные функции, заданные features и ответы, заданные responses.

[net,info] = trainNetwork(___) также возвращает информацию об обучении с использованием любого из предыдущих синтаксисов.

Примеры

свернуть все

Загрузите данные как ImageDatastore объект.

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

datastore содержит 10 000 синтетических изображений цифр от 0 до 9. Изображения генерируются путем применения случайных преобразований к цифровым изображениям, созданным различными шрифтами. Каждое цифровое изображение составляет 28 на 28 пикселей. datastore содержит равное количество изображений в категории.

Отобразите некоторые изображения в datastore.

figure
numImages = 10000;
perm = randperm(numImages,20);
for i = 1:20
    subplot(4,5,i);
    imshow(imds.Files{perm(i)});
    drawnow;
end

Разделите datastore так, чтобы каждая категория в набор обучающих данных имела 750 изображений, а проверка набор имела оставшиеся изображения от каждой метки.

numTrainingFiles = 750;
[imdsTrain,imdsTest] = splitEachLabel(imds,numTrainingFiles,'randomize');

splitEachLabel разделяет файлы изображений на digitData в два новых хранилища данных, imdsTrain и imdsTest.

Определите архитектуру сверточной нейронной сети.

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    reluLayer
    maxPooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Установите опции по умолчанию для стохастического градиентного спуска с импульсом. Установите максимальное количество эпох в 20 и запустите обучение с начальной скоростью обучения 0,0001.

options = trainingOptions('sgdm', ...
    'MaxEpochs',20,...
    'InitialLearnRate',1e-4, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучите сеть.

net = trainNetwork(imdsTrain,layers,options);

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

YPred = classify(net,imdsTest);
YTest = imdsTest.Labels;

Вычислите точность. Точность является отношением количества истинных меток в тестовых данных, соответствующих классификациям из classify количеству изображений в тестовых данных.

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9420

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

Загрузите выборочные данные, который состоит из синтетических изображений рукописных цифр.

[XTrain,YTrain] = digitTrain4DArrayData;

digitTrain4DArrayData загружает набор обучающих данных цифр как 4-D данные массива. XTrain массив 28 на 28 на 1 на 5000, где:

  • 28 - высота и ширина изображений.

  • 1 - количество каналов.

  • 5000 - количество синтетических изображений рукописных цифр.

YTrain - категориальный вектор, содержащий метки для каждого наблюдения.

Выделите 1000 изображений для валидации сети.

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
YValidation = YTrain(idx);
YTrain(idx) = [];

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

imageAugmenter = imageDataAugmenter( ...
    'RandRotation',[-20,20], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3])
imageAugmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [-20 20]
           RandScale: [1 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [-3 3]
    RandYTranslation: [-3 3]

Создайте augmentedImageDatastore объект, используемый для сетевого обучения и задающий размер выхода изображения. Во время обучения datastore выполняет увеличение изображения и изменяет размер изображений. Datastore увеличивает изображения, не сохраняя никаких изображений в памяти. trainNetwork обновляет параметры сети, а затем отбрасывает дополненные изображения.

imageSize = [28 28 1];
augimds = augmentedImageDatastore(imageSize,XTrain,YTrain,'DataAugmentation',imageAugmenter);

Задайте архитектуру сверточной нейронной сети.

layers = [
    imageInputLayer(imageSize)
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Задайте опции обучения для стохастического градиентного спуска с импульсом.

opts = trainingOptions('sgdm', ...
    'MaxEpochs',15, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,YValidation});

Обучите сеть. Поскольку изображения валидации не увеличены, точность валидации выше, чем точность обучения.

net = trainNetwork(augimds,layers,opts);

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

Загрузите обучающие изображения в виде 4-D массивов, используя digitTrain4DArrayData. Область выхода XTrain массив 28 на 28 на 1 на 5000, где:

  • 28 - высота и ширина изображений.

  • 1 - количество каналов.

  • 5000 - количество синтетических изображений рукописных цифр.

YTrain содержит углы поворота в степенях.

[XTrain,~,YTrain] = digitTrain4DArrayData;

Отобразите 20 случайных обучающих изображений с помощью imshow.

figure
numTrainImages = numel(YTrain);
idx = randperm(numTrainImages,20);
for i = 1:numel(idx)
    subplot(4,5,i)    
    imshow(XTrain(:,:,:,idx(i)))
    drawnow;
end

Задайте архитектуру сверточной нейронной сети. Для регрессионных задач включите регрессионый слой в конец сети.

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(12,25)
    reluLayer
    fullyConnectedLayer(1)
    regressionLayer];

Укажите опции обучения. Установите начальный темп обучения равным 0,001.

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.001, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучите сеть.

net = trainNetwork(XTrain,YTrain,layers,options);

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

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);

Оцените эффективность модели путем вычисления среднеквадратичной ошибки (RMSE) предсказанного и фактического углов поворота.

rmse = sqrt(mean((YTest - YPred).^2))
rmse = single
    6.0356

Обучите сеть LSTM глубокого обучения для классификации «последовательность-метка».

Загрузите набор данных японских гласных, как описано в [1] и [2]. XTrain - массив ячеек, содержащий 270 последовательностей различной длины с 12 функциями, соответствующими коэффициентам cepstrum LPC. Y является категориальным вектором меток 1,2,..., 9. Записи в XTrain являются матрицами с 12 строками (по одной строке для каждой функции) и меняющимся количеством столбцов (по одному столбцу для каждого временного шага).

[XTrain,YTrain] = japaneseVowelsTrainData;

Визуализируйте первые временные ряды на графике. Каждая линия соответствует функции.

figure
plot(XTrain{1}')
title("Training Observation 1")
numFeatures = size(XTrain{1},1);
legend("Feature " + string(1:numFeatures),'Location','northeastoutside')

Определите сетевую архитектуру LSTM. Задайте размер входа как 12 (количество функций входных данных). Задайте слой LSTM, который будет иметь 100 скрытые модули измерения и выводить последний элемент последовательности. Наконец, задайте девять классов, включив полностью соединенный слой размера 9, затем слой softmax и слой классификации.

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5×1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   LSTM                    LSTM with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

Задайте опции обучения. Задайте решатель следующим 'adam' и 'GradientThreshold' как 1. Установите размер мини-пакета равным 27 и установите максимальное количество эпох равным 70.

Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Задайте 'ExecutionEnvironment' на 'cpu'. Для обучения на графическом процессоре, при наличии, установите 'ExecutionEnvironment' на 'auto' (значение по умолчанию).

maxEpochs = 70;
miniBatchSize = 27;

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучите сеть LSTM с заданными опциями обучения.

net = trainNetwork(XTrain,YTrain,layers,options);

Загрузите тестовый набор и классифицируйте последовательности в динамики.

[XTest,YTest] = japaneseVowelsTestData;

Классификация тестовых данных. Укажите тот же размер мини-пакета, что и для обучения.

YPred = classify(net,XTest,'MiniBatchSize',miniBatchSize);

Вычислите классификационную точность предсказаний.

acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9514

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

Считайте данные обсадной колонны трансмиссии из файла CSV "transmissionCasingData.csv".

filename = "transmissionCasingData.csv";
tbl = readtable(filename,'TextType','String');

Преобразуйте метки для предсказания в категориальные с помощью convertvars функция.

labelName = "GearToothCondition";
tbl = convertvars(tbl,labelName,'categorical');

Чтобы обучить сеть с помощью категориальных признаков, необходимо сначала преобразовать категориальные функции в числа. Во-первых, преобразуйте категориальные предикторы в категориальные с помощью convertvars функция путем определения строковых массивов, содержащего имена всех категориальных входных переменных. В этом наборе данных существуют две категориальные функции с именами "SensorCondition" и "ShaftCondition".

categoricalInputNames = ["SensorCondition" "ShaftCondition"];
tbl = convertvars(tbl,categoricalInputNames,'categorical');

Цикл по категориальным входным переменным. Для каждой переменной:

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

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

  • Удалите соответствующий столбец, содержащий категориальные данные.

for i = 1:numel(categoricalInputNames)
    name = categoricalInputNames(i);
    oh = onehotencode(tbl(:,name));
    tbl = addvars(tbl,oh,'After',name);
    tbl(:,name) = [];
end

Разделите векторы на отдельные столбцы с помощью splitvars функция.

tbl = splitvars(tbl);

Просмотрите первые несколько строк таблицы. Заметьте, что категориальные предикторы были разделены на несколько столбцов с категориальными значениями в качестве имен переменных.

head(tbl)
ans=8×23 table
    SigMean     SigMedian    SigRMS    SigVar     SigPeak    SigPeak2Peak    SigSkewness    SigKurtosis    SigCrestFactor    SigMAD     SigRangeCumSum    SigCorrDimension    SigApproxEntropy    SigLyapExponent    PeakFreq    HighFreqPower    EnvPower    PeakSpecKurtosis    No Sensor Drift    Sensor Drift    No Shaft Wear    Shaft Wear    GearToothCondition
    ________    _________    ______    _______    _______    ____________    ___________    ___________    ______________    _______    ______________    ________________    ________________    _______________    ________    _____________    ________    ________________    _______________    ____________    _____________    __________    __________________

    -0.94876     -0.9722     1.3726    0.98387    0.81571       3.6314        -0.041525       2.2666           2.0514         0.8081        28562              1.1429             0.031581            79.931            0          6.75e-06       3.23e-07         162.13                0                1                1              0           No Tooth Fault  
    -0.97537    -0.98958     1.3937    0.99105    0.81571       3.6314        -0.023777       2.2598           2.0203        0.81017        29418              1.1362             0.037835            70.325            0          5.08e-08       9.16e-08         226.12                0                1                1              0           No Tooth Fault  
      1.0502      1.0267     1.4449    0.98491     2.8157       3.6314         -0.04162       2.2658           1.9487        0.80853        31710              1.1479             0.031565            125.19            0          6.74e-06       2.85e-07         162.13                0                1                0              1           No Tooth Fault  
      1.0227      1.0045     1.4288    0.99553     2.8157       3.6314        -0.016356       2.2483           1.9707        0.81324        30984              1.1472             0.032088             112.5            0          4.99e-06        2.4e-07         162.13                0                1                0              1           No Tooth Fault  
      1.0123      1.0024     1.4202    0.99233     2.8157       3.6314        -0.014701       2.2542           1.9826        0.81156        30661              1.1469              0.03287            108.86            0          3.62e-06       2.28e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0275      1.0102     1.4338     1.0001     2.8157       3.6314         -0.02659       2.2439           1.9638        0.81589        31102              1.0985             0.033427            64.576            0          2.55e-06       1.65e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0464      1.0275     1.4477     1.0011     2.8157       3.6314        -0.042849       2.2455           1.9449        0.81595        31665              1.1417             0.034159            98.838            0          1.73e-06       1.55e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0459      1.0257     1.4402    0.98047     2.8157       3.6314        -0.035405       2.2757            1.955        0.80583        31554              1.1345               0.0353            44.223            0          1.11e-06       1.39e-07         230.39                0                1                0              1           No Tooth Fault  

Просмотрите имена классов набора данных.

classNames = categories(tbl{:,labelName})
classNames = 2×1 cell
    {'No Tooth Fault'}
    {'Tooth Fault'   }

Затем разделите набор данных на обучающие и тестовые разделы. Выделите 15% данных для проверки.

Определите количество наблюдений для каждого раздела.

numObservations = size(tbl,1);
numObservationsTrain = floor(0.85*numObservations);
numObservationsTest = numObservations - numObservationsTrain;

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

idx = randperm(numObservations);
idxTrain = idx(1:numObservationsTrain);
idxTest = idx(numObservationsTrain+1:end);

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

tblTrain = tbl(idxTrain,:);
tblTest = tbl(idxTest,:);

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

numFeatures = size(tbl,2) - 1;
numClasses = numel(classNames);
 
layers = [
    featureInputLayer(numFeatures,'Normalization', 'zscore')
    fullyConnectedLayer(50)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Задайте опции обучения.

miniBatchSize = 16;

options = trainingOptions('adam', ...
    'MiniBatchSize',miniBatchSize, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Verbose',false);

Обучите сеть с помощью архитектуры, заданной layers, обучающих данных и опций обучения.

net = trainNetwork(tblTrain,layers,options);

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

YPred = classify(net,tblTest,'MiniBatchSize',miniBatchSize);
YTest = tblTest{:,labelName};

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9688

Входные параметры

свернуть все

Данные изображения, заданные как одно из следующего:

Тип данныхОписаниеИспользование примера
DatastoreImageDatastoreDatastore, который содержит изображения и метки.

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

Когда изображения имеют разные размеры, используйте AugmentedImageDatastore объект.

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

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

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

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

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

  • Обучите регрессионую нейронную сеть изображений.

  • Обучите сети с несколькими входами.

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

  • Применить пользовательские преобразования к выходным данным datastore.

CombinedDatastoreDatastore, который читается из двух или нескольких базовых хранилищ данных.

  • Обучите регрессионую нейронную сеть изображений.

  • Обучите сети с несколькими входами.

  • Объедините предикторы и ответы из различных источников данных.

PixelLabelImageDatastore (Computer Vision Toolbox)Datastore, который применяет идентичные аффинные геометрические преобразования к изображениям и соответствующим меткам пикселей.Обучите нейронную сеть для семантической сегментации.
RandomPatchExtractionDatastore(Набор Image Processing Toolbox)Datastore, который извлекает пары случайных закрашенных фигур из изображений или пиксельных изображений с меткой и опционально применяет идентичные случайные аффинные геометрические преобразования к парам.Обучите нейронную сеть для обнаружения объектов.
DenoisingImageDatastore(Набор Image Processing Toolbox)Datastore, который применяет случайным образом сгенерированный Гауссов шум.Обучите нейронную сеть для шумоподавления изображений.
Пользовательский мини-пакет datastoreПользовательский datastore, который возвращает мини-пакеты данных.

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

Для получения дополнительной информации смотрите Разработку Пользовательского Мини-Пакета Datastore.

Числовой массивИзображения, заданные как числовой массив. Если вы задаете изображения как числовой массив, то вы также должны задать responses аргумент.Обучите нейронную сеть с помощью данных, которые помещаются в памяти и не требуют дополнительной обработки, как увеличение.
ТаблицаИзображения, заданные как таблица. Если вы задаете изображения как таблицу, то можно также задать, какие столбцы содержат ответы, используя responses аргумент.Обучите нейронную сеть с помощью данных, хранящихся в таблице.

Для сетей с несколькими входами datastore должен быть TransformedDatastore или CombinedDatastore объект.

Совет

Для последовательностей изображений, для примера видео данных, используйте sequences входной параметр.

Datastore

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

В приведенном ниже списке перечислены хранилища данных, которые непосредственно совместимы с trainNetwork для данных изображений.

Для примера можно создать datastore изображения с помощью imageDatastore и используйте имена папок, содержащих изображения, в качестве меток путем установки 'LabelSource' опция для 'foldernames'. Также можно задать метки вручную с помощью Labels свойство image datastore.

Обратите внимание, что ImageDatastore объекты допускают пакетное чтение файлов изображений JPG или PNG с помощью предварительной выборки. Если вы используете пользовательскую функцию для чтения изображений, то ImageDatastore объекты не выполняют предварительную выборку.

Совет

Использовать augmentedImageDatastore для эффективной предварительной обработки изображений для глубокого обучения, включая изменение размера изображений.

Не используйте readFcn опция imageDatastore для предварительной обработки или изменения размера, поскольку эта опция обычно значительно медленнее.

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

Для сетей с несколькими входами datastore должен быть TransformedDatastore или CombinedDatastore объект.

Необходимый формат выхода 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 высота, ширина, глубина и количество каналов изображений, соответственно.

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

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

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

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

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

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

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

Для получения дополнительной информации смотрите Datastores для глубокого обучения.

Числовой массив

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

Размер и форма числового массива зависят от типа данных изображения.

ДанныеФормат
2-D изображения

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

3-D изображения<reservedrangesplaceholder9>-by-<reservedrangesplaceholder8>-by-<reservedrangesplaceholder7>-by-<reservedrangesplaceholder6>-by-<reservedrangesplaceholder5> числовой массив, где h, w, d, и c высота, ширина, глубина, и количество каналов изображений, соответственно, и N, является количеством изображений.

Таблица

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

При указании изображений и откликов в таблице каждая строка в таблице соответствует наблюдению.

Для входа изображений предикторы должны быть в первом столбце таблицы, заданные как один из следующих:

  • Абсолютный или относительный путь к файлу изображения, заданный как вектор символов

  • Массив ячеек 1 на 1, содержащий h -by- w -by- c числовой массив, представляющий 2-D изображение, где h, w и c соответствуют высоте, ширине и количеству каналов изображения, соответственно.

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

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

  • Два или более столбцов скалярных значений

  • Массив ячеек 1 на 1, содержащий h -by- w -by- c числовой массив, представляющий 2-D изображение

  • Массив ячеек 1 на 1, содержащий h -by- w -by- d -by- c числовой массив, представляющий 3-D изображение

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

Совет

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

Совет

Для регрессионных задач нормализация реакций часто помогает стабилизировать и ускорить обучение нейронных сетей для регрессии. Для получения дополнительной информации см. «Train сверточной нейронной сети для регрессии».

Последовательность или данные временных рядов, заданные как одно из следующего:

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

  • Преобразуйте выходы хранилищ данных, не поддерживаемых trainNetwork иметь необходимый формат.

  • Применить пользовательские преобразования к выходным данным datastore.

CombinedDatastoreDatastore, который читается из двух или нескольких базовых хранилищ данных.

Объедините предикторы и ответы из различных источников данных.

Пользовательский мини-пакет datastoreПользовательский datastore, который возвращает мини-пакеты данных.

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

Для получения дополнительной информации смотрите Разработку Пользовательского Мини-Пакета Datastore.

Числовой массив или массив ячеекОдна последовательность, заданная как числовой массив или набор данных, заданный как массив ячеек числовых массивов. Если вы задаете последовательности как число или массив ячеек, то вы также должны задать responses аргумент.Обучите нейронную сеть с помощью данных, которые помещаются в памяти и не требуют дополнительной обработки, подобной пользовательским преобразованиям.

Datastore

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

В приведенном ниже списке перечислены хранилища данных, которые непосредственно совместимы с trainNetwork для данных последовательности.

Можно использовать другие встроенные хранилища данных для обучения нейронных сетей для глубокого обучения при помощи transform и combine функций. Эти функции могут преобразовать данные, считанные из хранилищ данных, в формат таблицы или массива ячеек, требуемый trainNetwork. Для примера можно преобразовать и объединить данные, считанные из массивов в памяти, и файлы CSV с помощью ArrayDatastore и TabularTextDatastore объекты, соответственно.

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

Выход DatastoreПример выхода
Таблица
data = read(ds)
data =

  4×2 table

        Predictors        Response
    __________________    ________

    {12×50 double}           2    
    {12×50 double}           7    
    {12×50 double}           9    
    {12×50 double}           9  
Массив ячеек
data = read(ds)
data =

  4×2 cell array

    {12×50 double}        {[2]}
    {12×50 double}        {[7]}
    {12×50 double}        {[9]}
    {12×50 double}        {[9]}

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

ДанныеФормат предикторов
Векторная последовательность

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

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

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

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

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

Скаляр

Векторная регрессия

Числовой вектор-строка

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

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

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

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

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

Для получения дополнительной информации смотрите Datastores для глубокого обучения.

Числовой массив или массив ячеек

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

Для входа массива ячеек массив ячеек должен быть массивом ячеек N на 1 числовых массивов, где N количество наблюдений. Размер и форма числового массива, представляющего последовательность, зависят от типа данных последовательности:

ВходОписание
Векторные последовательностиc -by - s матрицы, где c - количество функций последовательностей, а s - длина последовательности.
2-D последовательности изображенийh -by- w -by- c -by- s массивы, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, и s является длиной последовательности.
3-D последовательности изображений<reservedrangesplaceholder9>-by-<reservedrangesplaceholder8>-by-<reservedrangesplaceholder7>-by-<reservedrangesplaceholder6>-by-<reservedrangesplaceholder5>, где h, w, d, и c соответствуют высоте, ширине, глубине, и количество каналов 3D изображений, соответственно, и s - длина последовательности.

Совет

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

Совет

Для регрессионных задач нормализация ответов часто помогает стабилизировать и ускорить обучение. Для получения дополнительной информации см. «Train сверточной нейронной сети для регрессии».

Данные о функциях, заданные как одно из следующих:

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

  • Обучите сети с несколькими входами.

  • Преобразуйте выходы хранилищ данных, не поддерживаемых trainNetwork иметь необходимый формат.

  • Применить пользовательские преобразования к выходным данным datastore.

CombinedDatastoreDatastore, который читается из двух или нескольких базовых хранилищ данных.

  • Обучите сети с несколькими входами.

  • Объедините предикторы и ответы из различных источников данных.

Пользовательский мини-пакет datastoreПользовательский datastore, который возвращает мини-пакеты данных.

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

Для получения дополнительной информации смотрите Разработку Пользовательского Мини-Пакета Datastore.

ТаблицаДанные о функциях, заданные как таблица. Если вы задаете функции как таблицу, то можно также задать, какие столбцы содержат отклики с помощью responses аргумент.Обучите нейронную сеть с помощью данных, хранящихся в таблице.
Числовой массивДанные функции заданы как числовой массив. Если вы задаете функции как числовой массив, то вы также должны задать responses аргумент.Обучите нейронную сеть с помощью данных, которые помещаются в памяти и не требуют дополнительной обработки, подобной пользовательским преобразованиям.

Datastore

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

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

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

Для сетей с несколькими входами datastore должен быть TransformedDatastore или CombinedDatastore объект.

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

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

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

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

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

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

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

data = read(ds)
data =

  4×2 table

        Predictors        Response
    __________________    ________

    {24×1 double}            2    
    {24×1 double}            7    
    {24×1 double}            9    
    {24×1 double}            9  

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

data = read(ds)
data =

  4×2 cell array

    {24×1 double}    {[2]}
    {24×1 double}    {[7]}
    {24×1 double}    {[9]}
    {24×1 double}    {[9]}

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

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

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

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

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

data = read(ds)
data =

  4×3 cell array

    {24×1 double}    {28×1 double}    {[2]}
    {24×1 double}    {28×1 double}    {[2]}
    {24×1 double}    {28×1 double}    {[9]}
    {24×1 double}    {28×1 double}    {[9]}

Предикторы должны быть c векторами-на-1, где c количество функций.

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

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

  • Скаляр

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

Для получения дополнительной информации смотрите Datastores для глубокого обучения.

Таблица

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

Каждая строка в таблице соответствует наблюдению. Расположение предикторов и откликов в столбцах таблицы зависит от типа задачи.

ЗадачаПредсказателиОтветы
Классификация функций

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

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

Категориальная метка

Регрессия функций

Один или несколько столбцов скалярных значений

Для сетей классификации с входом функции, если вы не задаете responses аргумент, затем функция, по умолчанию, использует первый (numColumns - 1) столбцы tbl для предикторов и последнего столбца для меток, где numFeatures - количество функций во входных данных.

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

Числовой массив

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

Числовой массив должен быть N -by- numFeatures числовой массив, где N - количество наблюдений и numFeatures - количество функций входных данных.

Совет

Нормализация реакций часто помогает стабилизировать и ускорить обучение нейронных сетей регрессии. Для получения дополнительной информации см. «Train сверточной нейронной сети для регрессии».

Совет

Ответы не должны содержать NaNs. Если данные предиктора содержат NaNs, затем они распространяются через обучение. Однако в большинстве случаев обучение не сходится.

Ответы.

Когда входные данные являются числовым массивом массива ячеек, задайте ответы как один из следующих.

  • категориальный вектор меток

  • числовой массив числовых откликов

  • категориальные или числовые последовательности массива ячеек

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

  • вектор символов

  • массив ячеек из векторов символов

  • Строковые массивы

Когда входные данные являются числовым массивом или массивом ячеек, то формат ответов зависит от типа задачи.

ЗадачаФормат
КлассификацияКлассификация изображенийN -by-1 категориальный вектор меток, где N - количество наблюдений.
Классификация функций
Классификация от последовательности до метки
Классификация последовательность-последовательность

N ячеек -by-1 категориальных последовательностей меток, где N количество наблюдений. Каждая последовательность должна иметь то же количество временных шагов, что и соответствующая последовательность предиктора.

Для задач классификации «последовательность-последовательность» с одним наблюдением, sequences может также быть вектором. В этом случае Y должна быть категориальной последовательностью меток.

Регресс2-D регрессию изображения
  • N -by - R матрица, где N - количество изображений, а R - количество откликов.

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

3-D регрессию изображения
  • N -by - R матрица, где N - количество изображений, а R - количество откликов.

  • <reservedrangesplaceholder9>-by-<reservedrangesplaceholder8>-by-<reservedrangesplaceholder7>-by-<reservedrangesplaceholder6>-by-<reservedrangesplaceholder5> числовой массив, где h, w, d, и c высота, ширина, глубина, и количество каналов изображений, соответственно, и N, является количеством изображений.

Регрессия функций

N -by - R матрица, где N - количество наблюдений, а R - количество откликов.

Регрессия от последовательности к единицеN -by - R матрица, где N - количество последовательностей, а R - количество откликов.
Регрессия от последовательности к последовательности

N ячеек -by-1 числовых последовательностей, где N количество последовательностей. Последовательности являются матрицами с R строками, где R количество откликов. Каждая последовательность должна иметь то же количество временных шагов, что и соответствующая последовательность предиктора.

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

Совет

Нормализация реакций часто помогает стабилизировать и ускорить обучение нейронных сетей регрессии. Для получения дополнительной информации см. «Train сверточной нейронной сети для регрессии».

Совет

Ответы не должны содержать NaNs. Если данные предиктора содержат NaNs, затем они распространяются через обучение. Однако в большинстве случаев обучение не сходится.

Слои сети, заданные как Layer массив или LayerGraph объект.

Чтобы создать сеть со всеми слоями, соединенными последовательно, можно использовать Layer массив как входной параметр. В этом случае возвращенная сеть является SeriesNetwork объект.

Ориентированная сеть ациклического графика (DAG) имеет сложную структуру, в которой слои могут иметь несколько входов и выходов. Чтобы создать сеть DAG, укажите сетевую архитектуру как LayerGraph объект, а затем используйте этот график слоев в качестве входного параметра для trainNetwork.

Список встроенных слоев см. в Списке слоев глубокого обучения.

Опции обучения, заданные как TrainingOptionsSGDM, TrainingOptionsRMSProp, или TrainingOptionsADAM объект, возвращенный trainingOptions функция.

Выходные аргументы

свернуть все

Обученная сеть, возвращается как SeriesNetwork объект или DAGNetwork объект.

Если вы обучаете сеть с помощью Layer массив, затем net является SeriesNetwork объект. Если вы обучаете сеть с помощью LayerGraph объект, затем net является DAGNetwork объект.

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

Для задач классификации, info содержит следующие поля:

  • TrainingLoss - Значения функции потерь

  • TrainingAccuracy - Точность обучения

  • ValidationLoss - Значения функции потерь

  • ValidationAccuracy - Точности валидации

  • BaseLearnRate - Скорости обучения

  • FinalValidationLoss - Окончательная потеря валидации

  • FinalValidationAccuracy - Окончательная точность валидации

Для задач регрессии, info содержит следующие поля:

  • TrainingLoss - Значения функции потерь

  • TrainingRMSE - Обучение значениям RMSE

  • ValidationLoss - Значения функции потерь

  • ValidationRMSE - Валидация значений RMSE

  • BaseLearnRate - Скорости обучения

  • FinalValidationLoss - Окончательная потеря валидации

  • FinalValidationRMSE - Окончательная валидация RMSE

Структура содержит только поля ValidationLoss, ValidationAccuracy, ValidationRMSE , FinalValidationLoss , FinalValidationAccuracy и FinalValidationRMSE когда options задает данные валидации. The 'ValidationFrequency' опция trainingOptions определяет, какие итерации вычисляет программное обеспечение метрики валидации. Конечные метрики валидации скаляра. Другие поля структуры являются векторами-строками, где каждый элемент соответствует итерации обучения. Для итераций, когда программное обеспечение не вычисляет метрики валидации, соответствующие значения в структуре NaN.

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

Подробнее о

свернуть все

Сохраните сети контрольных точек и возобновите обучение

Deep Learning Toolbox™ позволяет вам сохранять сети как .mat файлы после каждой эпохи во время обучения. Это периодическое сохранение особенно полезна, когда у вас большая сеть или большой набор данных, а обучение занимает много времени. Если обучение по какой-то причине прервано, можно возобновить обучение из последней сохраненной сети контрольных точек. Если хотите trainNetwork чтобы сохранить сети контрольных точек, необходимо задать имя пути при помощи 'CheckpointPath' Аргумент пары "имя-значение" из trainingOptions. Если заданный вами путь не существует, то trainingOptions возвращает ошибку.

trainNetwork автоматически присваивает уникальные имена сетевым файлам контрольных точек. В имени примера net_checkpoint__351__2018_04_12__18_09_52.mat, 351 - число итерации, 2018_04_12 является датой и 18_09_52 - время, в которое trainNetwork сохраняет сеть. Загрузить сетевой файл контрольной точки можно двойным щелчком по нему или с помощью команды load в командной строке. Для примера:

load net_checkpoint__351__2018_04_12__18_09_52.mat
Затем можно возобновить обучение, используя слои сети в качестве входного параметра для trainNetwork. Для примера:

trainNetwork(XTrain,YTrain,net.Layers,options)
Необходимо вручную задать опции обучения и входные данные, поскольку сеть контрольных точек не содержит этой информации. Для получения примера смотрите Возобновить обучение из сети контрольных точек.

Арифметика с плавающей точкой

Когда вы обучаете сеть, используя trainNetwork function, или когда вы используете функции предсказания или валидации с DAGNetwork и SeriesNetwork объекты, программное обеспечение выполняет эти расчеты с помощью арифметики с одной точностью и плавающей точкой. Функции для обучения, предсказания и валидации включают trainNetwork, predict, classify, и activations. Программа использует арифметику с одной точностью, когда вы обучаете сети, используя как центральные процессоры, так и графические процессоры.

Вопросы совместимости

расширить все

Предупреждает, начиная с R2021a

Ссылки

[1] Кудо, М., Дж. Тояма и М. Симбо. «Многомерная классификация кривых с использованием областей». Распознавание Букв. Том 20, № 11-13, стр. 1103-1111.

[2] Кудо, М., Дж. Тояма и М. Симбо. Японский набор данных гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

Расширенные возможности

Введенный в R2016a