gradCAM

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

    Описание

    пример

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

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

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

    пример

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

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

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

    [scoreMap,featureLayer,reductionLayer] = gradCAM(___) также возвращает имена слоя функции и слоя сокращения, используемые для вычисления карты Grad-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

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

    Используйте Grad-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';

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

    reductionFcn = @(x)x;

    Вычислите карту Grad-CAM.

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

    Отобразите карту Grad-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

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

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

    свернуть все

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

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

    Входные данные, заданные как числовой массив или маркированные dlarray объект.

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

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

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

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

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

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

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

    Пример: [1 5]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • C - Канал

    • B - Партия

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

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

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

    Метод увеличения дискретизации выхода, заданный как разделенная разделенными запятой парами, состоящая из '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' - Использовать графический процессор.

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

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

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

    свернуть все

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

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

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

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

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

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

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

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

    Подробнее о

    свернуть все

    Grad-CAM

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

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

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

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

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

    M=ReLU(kαkcAk).

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

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

    Совет

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

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

    Ссылки

    [1] Selvaraju, Ramprasaath R., Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh и Dhruv Batra. «Grad-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