resnet3dLayers

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

    Описание

    пример

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

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

    пример

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

    Примеры

    свернуть все

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

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

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

    analyzeNetwork(lgraph)

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

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

    imageSize = [224 224 64 3];
    numClasses = 10;
    
    stackDepth = [3 4 23 3];
    numFilters = [64 128 256 512];
    
    lgraph = resnet3dLayers(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)

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

    свернуть все

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

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

    • Вектор с 4 элементами в форме [height, width, depth, channel], где channel обозначает количество каналов изображений.

    height, width и значения depth должны быть больше или быть равны 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,5],InitialNumFilters=32,BottleneckType="none" задает начальный размер фильтра 5 пикселями 5 на 5, 32 начальными фильтрами и сетевой архитектурой без компонентов узкого места.
    Начальные слои

    свернуть все

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

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

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

    Пример: InitialFilterSize=[5,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, и глубина 3.

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

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

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

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

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

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

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

    • "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 на 1 для субдискретизации размерности канала, 3 3х3 сверточным слоем и 1 слоем 1 на 1 для повышающей дискретизации размерности канала.

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

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

    Блок узкого места выполняет 1 сверткой 1 на 1 перед 3 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

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

    свернуть все

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

    Больше о

    свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Когда ResidualBlockType установлен в "batchnorm-after-add", вторая ветвь содержит a convolution3dLayer с [1,1,1] фильтр и [2,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]. Для получения дополнительной информации смотрите convolution3dLayer.

    Советы

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

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

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

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

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

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