gradCAM

Объясните сетевые предсказания с помощью CAM градиента

    Описание

    пример

    scoreMap = gradCAM(net,X,label) возвращает взвешенную градиентом активацию класса, сопоставляющую (CAM градиента) карта изменения в классификационной оценке изображения X, когда сеть net оценивает счет класса к классу, данному label. Используйте эту функцию, чтобы объяснить сетевые предсказания и проверять, что ваша сеть фокусируется на правильных частях изображения.

    CAM градиента interpretability метод использует градиенты классификационной оценки относительно итоговой сверточной карты функции. Части изображения с большим значением для карты CAM градиента - те который большая часть удара сетевой счет к тому классу.

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

    пример

    scoreMap = gradCAM(net,X,reductionFcn) возвращает карту важности CAM градиента с помощью функции сокращения. reductionFcn указатель на функцию, который уменьшает выходные активации слоя сокращения к скалярному значению. Этот скаляр выполняет роль счета класса к задачам классификации и обобщает метод CAM градиента к задачам неклассификации, таким как регрессия.

    gradCAM функция вычисляет карту CAM градиента путем дифференциации сокращенного выхода слоя сокращения относительно функций в слое функции. gradCAM автоматически выбирает сокращение и слои функции, чтобы использовать при вычислении карты. Чтобы задать эти слои, используйте 'ReductionLayer' и 'FeatureLayer' аргументы значения имени.

    Используйте этот синтаксис, чтобы вычислить карту CAM градиента для задач неклассификации.

    [scoreMap,featureLayer,reductionLayer] = gradCAM(___) также возвращает имена слоя функции, и слой сокращения использовался для расчета карты CAM градиента. Используйте этот синтаксис с любой из комбинаций входных аргументов в предыдущих синтаксисах.

    пример

    ___ = gradCAM(___,Name,Value) задает опции с помощью одного или нескольких аргументов значения имени в дополнение к входным параметрам в предыдущих синтаксисах. Например, 'ReductionLayer','prob' устанавливает слой сокращения на net слой под названием 'prob'.

    Примеры

    свернуть все

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

    Импортируйте предварительно обученную сеть SqueezeNet.

    net = squeezenet;

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

    X = imread("laika_grass.jpg");
    inputSize = net.Layers(1).InputSize(1:2);
    X = imresize(X,inputSize);

    Отобразите изображение.

    imshow(X)

    Классифицируйте изображение, чтобы получить метку класса.

    label = classify(net,X)
    label = categorical
         toy poodle 
    
    

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

    scoreMap = gradCAM(net,X,label);

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

    figure
    imshow(X)
    hold on
    imagesc(scoreMap,'AlphaData',0.5)
    colormap jet

    Сеть фокусируется преимущественно на спине у собаки, чтобы принять решение классификации.

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

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

    rng default
    [XTrain,~,YTrain] = digitTrain4DArrayData;
    [XTest,~,YTest] = digitTest4DArrayData;
    
    numTrainImages = numel(YTrain);
    idx = randperm(numTrainImages,20);

    Создайте сеть регрессии изображений, которая может предсказать вращение изображения.

    layers = [ ...
        imageInputLayer([28 28 1],'Name','input')
        convolution2dLayer(12,25,'Name','conv')
        reluLayer('Name','relu')
        fullyConnectedLayer(1,'Name','fc')
        regressionLayer('Name','output')];

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

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

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

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

    Оцените эффективность сети на тестовом изображении.

    testDigit = XTest(:,:,:,idx(4));

    Используйте predict предсказать угол вращения и сравнить предсказанное вращение с истинным вращением.

    predRotation = predict(net,testDigit)
    predRotation = single
        -47.5497
    
    trueRotation = YTest(idx(4))
    trueRotation = -40
    

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

    featureLayer = 'relu';
    reductionLayer = 'fc';

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

    reductionFcn = @(x)x;

    Вычислите карту CAM градиента.

    scoreMap = gradCAM(net,testDigit,reductionFcn, ...
        'ReductionLayer',reductionLayer, ...
        'FeatureLayer',featureLayer);

    Отобразите карту CAM градиента по тестовому изображению.

    ax(1) = subplot(1,2,1);
    imshow(testDigit)
    title("True Rotation = " + trueRotation + '\newline Pred Rotation = ' + round(predRotation,0))
    colormap(ax(1),'gray')
    
    ax(2) = subplot(1,2,2);
    imshow(testDigit)
    hold on
    imagesc(scoreMap)
    colormap(ax(2),'jet')
    title("GradCAM")
    hold off

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

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

    свернуть все

    Обучивший сеть в виде SeriesNetwork, DAGNetwork, или dlnetwork объект. Можно получить обучивший сеть путем импорта предварительно обученной сети или по образованию собственная сеть с помощью trainNetwork функционируйте или пользовательское обучение. Для получения дополнительной информации о предварительно обученных сетях, смотрите Предварительно обученные Глубокие нейронные сети.

    net должен содержать один входной слой и один выходной слой. Входной слой net должен быть imageInputLayer или image3dInputLayer.

    Входные данные в виде числового массива или пометили dlarray объект.

    X должен иметь размер, равный входному размеру сети.

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

    Метка Class, чтобы использовать для вычисления CAM градиента сопоставляет для классификации изображений и задач семантической сегментации в виде категориального, вектора символов, строкового скаляра, числового индекса или вектора из этих значений.

    Для dlnetwork объекты, необходимо задать label как категориальное или числовой индекс.

    Если вы задаете label как вектор, программное обеспечение вычисляет важность функции для каждой метки класса независимо. В этом случае, scoreMap(:,:,k) соответствует карте для label(k).

    gradCAM функционируйте суммирует пространственные размерности слоя сокращения для класса label. Поэтому можно задать label как представляющие интерес классы для задач семантической сегментации и gradCAM возвращает важность CAM градиента для каждого пикселя.

    Пример: ["cat" "dog"]

    Пример: [1 5]

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

    Функция сокращения в виде указателя на функцию. Функция сокращения уменьшает выходные активации слоя сокращения к одному значению и должна уменьшать dlarray возразите против dlarray скаляр. Этот скаляр выполняет роль label в задачах классификации, и обобщает метод CAM градиента к задачам неклассификации, таким как регрессия.

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

    Пример: @x(x)

    Типы данных: function_handle

    Аргументы в виде пар имя-значение

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

    Пример: 'FeatureLayer','conv10','ReductionLayer','prob','OutputUpsampling','bicubic','ExecutionEnvironment','gpu' вычисляет карту CAM градиента относительно слоев 'conv10' и 'prob', выполняет вычисление на графическом процессоре и сверхдискретизировал получившуюся карту к тому же размеру как входное изображение с помощью бикубической интерполяции.

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

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

    Пример: 'FeatureLayer','conv10'

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

    Имя слоя сокращения, чтобы извлечь выходные активации из при вычислении CAM градиента сопоставляет в виде строки или вектора символов. Для задач классификации этот слой является финалом softmax слой. Для других задач этот слой обычно является предпоследним слоем для DAG и серийных сетей и последнего слоя для dlnetwork объекты.

    Значением по умолчанию является предпоследний слой в DAG и серийных сетях и последнем слое в dlnetwork объекты. Используйте analyzeNetwork функция, чтобы исследовать вашу сеть и выбрать правильный слой.

    Пример: 'ReductionLayer','prob'

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

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

    • S — Пространственный

    • C — Канал

    • B — Пакет

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

    Пример: 'Format','SSC'

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

    Выведите метод повышающей дискретизации в виде разделенной запятой пары, состоящей of 'OutputUpsampling' и одно из следующих значений:

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

    • 'nearest' — Используйте интерполяцию ближайшего соседа, чтобы расширить карту до того же размера как входные данные.

    • 'none' — Не используйте повышающую дискретизацию. Карта может быть меньшей, чем входные данные.

    Если 'OutputUpsampling' 'nearest' или 'bicubic', вычисленная карта сверхдискретизирована к размеру входных данных с помощью imresize функция для 2D данных и imresize3 (Image Processing Toolbox) функция для 3-D данных. Для 3-D данных, опция 'bicubic' использование imresize3 с 'cubic' метод.

    Пример: 'OutputUpsampling','bicubic'

    Аппаратный ресурс для вычисления карты в виде разделенной запятой пары, состоящей из 'ExecutionEnvironment' и одно из следующих.

    • 'auto' — Используйте графический процессор, если вы доступны. В противном случае используйте центральный процессор.

    • 'cpu' — Используйте центральный процессор.

    • 'gpu' — Используйте графический процессор.

    Опция графического процессора требует Parallel Computing Toolbox™. Чтобы использовать графический процессор для глубокого обучения, у вас должно также быть поддерживаемое устройство графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Если вы выбираете 'gpu' опция и Parallel Computing Toolbox и подходящий графический процессор не доступны, затем программное обеспечение возвращает ошибку.

    Пример: 'ExecutionEnvironment','gpu'

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

    свернуть все

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

    • Для задач классификации, scoreMap градиент итоговой классификационной оценки для заданного класса, относительно каждой функции в слое функции.

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

    scoreMap(i,j) соответствует важности CAM градиента в пространственном местоположении (i,j). Если вы обеспечиваете label как вектор из categoricals, векторов символов или строк, затем scoreMap(:,:,k) соответствует карте для label(k).

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

    По умолчанию, gradCAM выбирает слой функции, чтобы использоваться для расчета карты CAM градиента. Этот слой является последним слоем с неодиночным элементом пространственные размерности. Можно задать который слой функции использовать использование 'FeatureLayer' аргумент значения имени. Когда вы задаете 'FeatureLayer' аргумент значения имени, featureLayer возвращает то же значение.

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

    По умолчанию, gradCAM выбирает слой сокращения, чтобы использоваться для расчета карты CAM градиента. Этот слой является предпоследним слоем в DAG и серийных сетях и последнем слое в dlnetwork объекты. Можно также задать который слой сокращения использовать использование 'ReductionLayer' аргумент значения имени. Когда вы задаете 'ReductionLayer' аргумент значения имени, reductionLayer возвращает то же значение.

    Больше о

    свернуть все

    CAM градиента

    Взвешенное градиентом отображение активации класса (CAM градиента) является explainability методом, который может использоваться, чтобы помочь изучить предсказания, сделанные глубокой нейронной сетью [1]. CAM градиента, обобщение метода CAM, определяет важность каждого нейрона в сетевом предсказании путем рассмотрения градиентов цели, текущей через глубокую сеть.

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

    Предположим, что вы имеете сеть классификации изображений с выходом yc, представляя счет к классу c, и хотите вычислить карту CAM градиента для сверточного слоя с картами функции k (каналы), Aki,j, где i,j индексирует пиксели. Вес важности нейрона

    αkc=1NijycAi,jkГрадиентычерезbackpropГлобальное среднее объединение,

    где N является общим количеством пикселей в карте функции. Карта CAM градиента является затем взвешенной комбинацией карт функции с прикладным ReLU:

    M=ReLU(kαkcAk).

    Активация ReLU гарантирует, что вы получаете только функции, которые имеют позитивный вклад к классу интереса. Выход является поэтому тепловой картой для заданного класса, который одного размера с картой функции. Карта CAM градиента затем сверхдискретизирована к размеру входных данных.

    Несмотря на то, что CAM градиента обычно используется для задач классификации изображений, можно вычислить карту CAM градиента для любой дифференцируемой активации. Например, для задач семантической сегментации, можно вычислить карту CAM градиента, заменив yc на (i,j)Syijc, где S является набором пикселей интереса, и yi,jc равняется 1, если пиксель (i,j) предсказан, чтобы быть классом c, и 0 в противном случае [2]. Можно использовать gradCAM функция для задач неклассификации путем определения подходящей функции сокращения, которая уменьшает выходные активации слоя сокращения к одному значению и занимает место yc в уравнении веса важности нейрона.

    Советы

    • reductionFcn функция получает выход от слоя сокращения как прослеженный dlarray объект. Функция должна сократить этот выход к скалярному dlarrayкоторый gradCAM затем дифференцируется относительно активаций слоя функции. Например, чтобы вычислить карту CAM градиента для канала 208 из softmax активаций сети, функцией сокращения является @(x)(x(208)). Эта функция получает активации и извлекает 208-й канал.

    • gradCAM функция автоматически выбирает сокращение и слои функции, чтобы использовать при вычислении карты CAM градиента. Для некоторых сетей выбранные слои не могут подойти. Например, если ваша сеть имеет несколько слоев, которые могут использоваться в качестве слоя функции, затем функция выбирает один из тех слоев, но его выбор не может наиболее подойти. Для таких сетей задайте который слой функции использовать использование 'FeatureLayer' аргумент значения имени.

    Ссылки

    [1] Selvaraju, Рэмпрасаэт Р., Майкл Когсвелл, Десять кубометров Abhishek, Рамакришна Ведэнтэм, Devi Parikh и Dhruv Batra. “CAM градиента: Визуальные Объяснения от Глубоких Сетей через Основанную на градиенте Локализацию”. 2017 (октябрь 2017): 618–626, https://doi.org/10.1109/ICCV.2017.74.

    [2] Виноградова, Кира, Александр Дибров и Джин Майерс. “К Поддающейся толкованию Семантической Сегментации через Взвешенное Градиентом Отображение Активации Класса”. Продолжения Конференции AAAI по Искусственному интеллекту 34, № 10 (апрель 2020): 13943–13944, https://doi.org/10.1609/aaai.v34i10.7244.

    Введенный в R2021a