resnetLayers

Создайте 2D остаточную сеть

    Описание

    пример

    lgraph = resnetLayers(inputSize,numClasses) создает 2D остаточную сеть с входным размером изображений, заданным inputSize и много классов заданы numClasses. Остаточная сеть состоит из стеков блоков. Каждый блок содержит слои глубокого обучения. Сеть включает слой классификации изображений, подходящий для предсказания категориальной метки входного изображения.

    Чтобы создать 3-D остаточную сеть, использовать resnet3dLayers.

    пример

    lgraph = resnetLayers(___,Name=Value) создает остаточную сеть с помощью одних или нескольких аргументов name-value с помощью любого из входных параметров в предыдущем синтаксисе. Например, InitialNumFilters=32 задает 32, просачивается начальный сверточный слой.

    Примеры

    свернуть все

    Создайте остаточную сеть с архитектурой узкого места.

    imageSize = [224 224 3];
    numClasses = 10;
    
    lgraph = resnetLayers(imageSize,numClasses)
    lgraph = 
      LayerGraph with properties:
    
             Layers: [177x1 nnet.cnn.layer.Layer]
        Connections: [192x2 table]
         InputNames: {'input'}
        OutputNames: {'output'}
    
    

    Анализируйте сеть.

    analyzeNetwork(lgraph)

    Эта сеть эквивалентна остаточной сети ResNet-50.

    Создайте сеть ResNet-101 с помощью пользовательской глубины стека.

    imageSize = [224 224 3];
    numClasses = 10;
    
    stackDepth = [3 4 23 3];
    numFilters = [64 128 256 512];
    
    lgraph = resnetLayers(imageSize,numClasses, ...
        StackDepth=stackDepth, ...
        NumFilters=numFilters)
    lgraph = 
      LayerGraph with properties:
    
             Layers: [347x1 nnet.cnn.layer.Layer]
        Connections: [379x2 table]
         InputNames: {'input'}
        OutputNames: {'output'}
    
    

    Анализируйте сеть.

    analyzeNetwork(lgraph)

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

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

    [XTrain,YTrain] = digitTrain4DArrayData;
    [XTest,YTest] = digitTest4DArrayData;

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

    imageSize = [28 28 1];
    numClasses = 10;
    
    lgraph = resnetLayers(imageSize,numClasses, ...
        InitialStride=1, ...
        InitialFilterSize=3, ...
        InitialNumFilters=16, ...
        StackDepth=[4 3 2], ...
        NumFilters=[16 32 64]);

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

    options = trainingOptions("sgdm", ...
        MaxEpochs=5, ...
        InitialLearnRate=0.1, ...
        Verbose=false, ...
        Plots="training-progress");

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

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

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

    YPred = classify(net,XTest);

    Вычислите точность. Точность является частью меток, которые сеть предсказывает правильно.

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

    Чтобы обучить остаточную сеть с помощью пользовательского учебного цикла, сначала преобразуйте его в dlnetwork объект.

    Создайте остаточную сеть.

    lgraph = resnetLayers([224 224 3],5);

    Удалите слой классификации.

    lgraph = removeLayers(lgraph,"output");

    Замените входной слой на новый входной слой, который имеет Normalization установите на "none". Чтобы использовать входной слой с нулевым центром или нормализацией z-счета, необходимо задать imageInputLayer с непустым значением для Mean свойство. Например, Mean=sum(XTrain,4), где XTrain 4-D массив, содержащий ваши входные данные.

    newInputLayer = imageInputLayer([224 224 3],Normalization="none");
    lgraph = replaceLayer(lgraph,"input",newInputLayer);

    Преобразуйте в dlnetwork.

    dlnet = dlnetwork(lgraph)
    dlnet = 
      dlnetwork with properties:
    
             Layers: [176x1 nnet.cnn.layer.Layer]
        Connections: [191x2 table]
         Learnables: [214x3 table]
              State: [106x3 table]
         InputNames: {'imageinput'}
        OutputNames: {'softmax'}
        Initialized: 1
    
    

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

    свернуть все

    Сетевой входной размер изображения в виде одного из следующего:

    • Вектор с 2 элементами в форме [height, width].

    • Вектор с 3 элементами в форме [height, width, depth], где depth является количеством каналов. Установите depth на 3 для изображений RGB и к 1 для полутоновых изображений. Для многоспектральных и гиперспектральных изображений, набор depth к количеству каналов.

    height и значения width должны быть больше или быть равны initialStride * poolingStride * 2D, где D является количеством субдискретизации блоков. Установите начальный шаг с помощью InitialStride аргумент. Шагом объединения является 1 когда InitialPoolingLayer установлен в "none", и 2 в противном случае.

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Количество классов в сети классификации изображений в виде целого числа, больше, чем 1.

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Аргументы name-value

    Задайте дополнительные пары аргументов как Name1=Value1,...,NameN=ValueN, где Name имя аргумента и Value соответствующее значение. Аргументы name-value должны появиться после других аргументов, но порядок пар не имеет значения.

    Пример: InitialFilterSize=[5,5],InitialNumFilters=32,BottleneckType="none" задает начальный размер фильтра пикселей 5 на 5, 32 начальных фильтра и сетевую архитектуру без компонентов узкого места.
    Начальные слои

    свернуть все

    Отфильтруйте размер в первом сверточном слое в виде одного из следующего:

    • Положительное целое число. Фильтр имеет равную высоту и ширину. Например, определение 5 дает к фильтру высоты 5 и ширина 5.

    • Вектор с 2 элементами в форме [height, width]. Например, задавая начальный размер фильтра [1 5] дает к фильтру высоты 1 и ширина 5.

    Пример: InitialFilterSize=[5,5]

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

    Пример: InitialNumFilters=32

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Шагните в первом сверточном слое в виде a:

    • Положительное целое число. Шаг имеет равную высоту и ширину. Например, определение 3 дает к шагу высоты 3 и ширина 3.

    • Вектор с 2 элементами в форме [height, width]. Например, задавая начальный шаг [1 2] дает к шагу высоты 1 и ширина 2.

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

    Пример: InitialStride=[3,3]

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

    • "max" — Используйте макс. слой объединения перед начальным остаточным блоком. Для получения дополнительной информации смотрите maxPooling2dLayer.

    • "average" — Используйте средний слой объединения перед начальным остаточным блоком. Для получения дополнительной информации смотрите averagePooling2dLayer.

    • "none"— Не используйте слой объединения перед начальным остаточным блоком.

    Пример: InitialPoolingLayer="average"

    Типы данных: char | string

    Сетевая архитектура

    свернуть все

    Остаточный тип блока в виде одного из следующего:

    • "batchnorm-before-add" — Добавьте слой нормализации партии. перед слоем сложения в остаточных блоках [1].

    • "batchnorm-after-add" — Добавьте слой нормализации партии. после слоя сложения в остаточных блоках [2].

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

    Пример: ResidualBlockType="batchnorm-after-add"

    Типы данных: char | string

    Блокируйте тип узкого места в виде одного из следующего:

    • "downsample-first-conv" — Используйте блоки невязки узкого места, которые выполняют субдискретизацию в первом сверточном слое блоков невязки субдискретизации, с помощью шага 2. Блок невязки узкого места состоит из трех сверточных слоев: слой 1 на 1 для субдискретизации размерности канала, 3х3 сверточного слоя и слоя 1 на 1 для повышающей дискретизации размерности канала.

      Количество просачивается, итоговый сверточный слой - четыре раза это в первых двух сверточных слоях. Для получения дополнительной информации смотрите NumFilters.

    • "none" — Не используйте блоки невязки узкого места. Остаточные блоки состоят из двух 3х3 сверточных слоев.

    Блок узкого места выполняет свертку 1 на 1 перед 3х3 сверткой, чтобы сократить количество каналов на коэффициент четыре. Сети с и без блоков узкого места будут иметь подобный уровень вычислительной сложности, но общее количество распространения функций в остаточных связях в четыре раза больше, когда вы используете модули узкого места. Поэтому использование узкого места увеличивает КПД сети [1]. Для получения дополнительной информации о слоях в каждом остаточном блоке смотрите Больше О.

    Пример: BottleneckType="none"

    Типы данных: char | string

    Количество остаточных блоков в каждом стеке в виде вектора из положительных целых чисел. Например, если глубиной стека является [3 4 6 3], сеть имеет четыре стека, с тремя блоками, четырьмя блоками, шестью блоками и тремя блоками.

    Укажите, что количество просачивается сверточные слои каждого стека с помощью NumFilters аргумент. StackDepth значение должно иметь то же число элементов как NumFilters значение.

    Пример: StackDepth=[9 12 69 9]

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Количество просачивается сверточные слои каждого стека в виде вектора из положительных целых чисел.

    • Когда вы устанавливаете BottleneckType к "downsample-first-conv", первые два сверточных слоя в каждом блоке каждого стека имеют то же количество фильтров, установленных NumFilters значение. Итоговый сверточный слой имеет четыре раза количество, просачивается первые два сверточных слоя.

      Например, предположите, что вы устанавливаете NumFilters к [4 5] и BottleneckType к "downsample-first-conv". В первом стеке первые два сверточных слоя в каждом блоке имеют 4 фильтра, и итоговый сверточный слой в каждом блоке имеет 16 фильтров. Во втором стеке первые два сверточных слоя в каждом блоке имеют 5 фильтров, и итоговый сверточный слой имеет 20 фильтров.

    • Когда вы устанавливаете BottleneckType к "none", сверточные слои в каждом стеке имеют то же количество фильтров, установленных NumFilters значение.

    NumFilters значение должно иметь то же число элементов как StackDepth значение.

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

    • BottleneckType="downsample-first-conv"(значение по умолчанию) и InitialNumFilters не равно четыре раза первому элементу NumFilters.

    • BottleneckType="none" и InitialNumFilters не равно первому элементу NumFilters.

    Для получения дополнительной информации о слоях в каждом остаточном блоке, смотрите Больше О.

    Пример: NumFilters=[32 64 126 256]

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

    • "zerocenter" — Вычтите среднее значение. Среднее значение вычисляется в учебное время.

    • "zscore" — Вычтите среднее значение и разделитесь на стандартное отклонение. Среднее и стандартное отклонение вычисляется в учебное время.

    Пример: Normalization="zscore"

    Типы данных: char | string

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

    свернуть все

    Остаточная сеть, возвращенная как layerGraph объект.

    Больше о

    свернуть все

    Остаточная сеть

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

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

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

    • Стандартный остаточный блок — Этот блок происходит многократно в каждом стеке после первого блока невязки субдискретизации. Стандартный остаточный блок сохраняет размеры активации.

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

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

    Начальная буква, стандарт и субдискретизация остаточных блоков могут быть блоки неузкого места или узкое место. Блоки узкого места выполняют свертку 1 на 1 перед 3х3 сверткой, чтобы сократить количество каналов на коэффициент четыре. ​ Сети с и без блоков узкого места имеют подобный уровень вычислительной сложности, но общее количество распространения функций в остаточных связях в четыре раза больше, когда вы используете модули узкого места. Поэтому использование блоков узкого места увеличивает КПД сети.

    Слои в каждом блоке определяются типом блока и опций, которые вы устанавливаете.

    Блокируйте слои

    ИмяНачальные слоиНачальный остаточный блокСтандартный остаточный блок (BottleneckType="downsample-first-conv")Стандартный остаточный блок (BottleneckType="none")Субдискретизация остаточного блокаПоследние слои
    Описание

    Остаточная сеть запускается со следующих слоев в порядке:

    Установите дополнительный слой объединения с помощью InitialPoolingLayer аргумент.

    Основная ветвь начального остаточного блока имеет те же слои как стандартный остаточный блок.

    InitialNumFilters и NumFilters значения определяют слои на остаточной связи. Остаточная связь имеет сверточный слой с [1,1] фильтр и [1,1] шагните, если одному из следующих условий отвечают:

    • BottleneckType="downsample-first-conv"(значение по умолчанию) и InitialNumFilters не равно четыре раза первому элементу NumFilters.

    • BottleneckType="none" и InitialNumFilters не равно первому элементу NumFilters.

    Если ResidualBlockType установлен to"batchnorm-before-add", остаточная связь будет также иметь слой нормализации партии.

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

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

    Установите положение слоя сложения с помощью ResidualBlockType аргумент.

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

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

    Установите положение слоя сложения с помощью ResidualBlockType аргумент.

    Блок невязки субдискретизации совпадает со стандартным блоком (или с или без узкого места), но шагом [2,2] в первом сверточном слое и дополнительных слоях на остаточной связи.

    Слои на остаточной связи зависят от ResidualBlockType значение.

    • Когда ResidualBlockType установлен в "batchnorm-before-add", вторая ветвь содержит a convolution2dLayer с [1,1] фильтр и [2,2] шагните, и a batchNormalizationLayer.

    • Когда ResidualBlockType установлен в "batchnorm-after-add", вторая ветвь содержит a convolution2dLayer с [1,1] фильтр и [2,2] шаг.

    Половины блока субдискретизации высота и ширина входа, и увеличивают число каналов.

    Остаточная сеть заканчивается следующими слоями в порядке:

    Визуализация в качестве примера

    Initial layers of a residual network.

    Пример начального остаточного блока для сети без узкого места и со слоем нормализации партии. перед слоем сложения.

    Example of an initial residual block in a residual network.

    Пример стандартного остаточного блока для сети с узким местом и со слоем нормализации партии. перед слоем сложения.

    Example of a standard residual block in a residual network with bottleneck units.

    Пример стандартного остаточного блока для сети без узкого места и со слоем нормализации партии. перед слоем сложения.

    Example of a standard residual block in a residual network without bottleneck units.

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

    Example of a downsampling residual block in a residual network without bottleneck units.

    Final layers of a residual network.

    Свертка и веса полносвязного слоя инициализируются с помощью Него метод инициализации веса [3]. Для получения дополнительной информации смотрите convolution2dLayer.

    Советы

    • При работе с маленькими изображениями, набор InitialPoolingLayer опция к "none" удалить начальный слой объединения и уменьшать объем субдискретизации.

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

      depth = {1+2i=1Nsi+1       Если никакое узкое место1+3i=1Nsi+1            Если узкое место     ,

      где si является глубиной стека i.

      Сети с той же глубиной могут иметь различные сетевые архитектуры. Например, можно создать архитектуру ResNet-14 с или без узкого места:

      resnet14Bottleneck = resnetLayers([224 224 3],10, ...
      StackDepth=[2 2], ...
      NumFilters=[64 128]);
      
      resnet14NoBottleneck = resnetLayers([224 224 3],10, ...
      BottleneckType="none", ...
      StackDepth=[2 2 2], ...
      NumFilters=[64 128 256]);
      Отношение между узким местом и архитектурами неузкого места также означает, что сеть с узким местом будет иметь различную глубину, чем сеть без узкого места.
      resnet50Bottleneck = resnetLayers([224 224 3],10);
      
      resnet34NoBottleneck = resnetLayers([224 224 3],10, ... 
      BottleneckType="none");
      

    Ссылки

    [1] Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. “Глубокая Невязка, Учащаяся для Распознавания Изображений”. Предварительно распечатайте, представленный 10 декабря 2015. https://arxiv.org/abs/1512.03385.

    [2] Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. “Единичные Отображения в Глубоких Остаточных Сетях”. Предварительно распечатайте, представленный 25 июля 2016. https://arxiv.org/abs/1603.05027.

    [3] Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Копаясь Глубоко в Выпрямителях: Превышение Эффективности Человеческого Уровня на Классификации ImageNet". В Продолжениях 2 015 Международных конференций IEEE по вопросам Компьютерного зрения, 1026–1034. Вашингтон, округ Колумбия: Общество Компьютерного зрения IEEE, 2015.

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

    Введенный в R2021b