Объясните предсказания сети с помощью LIME
использует локально интерпретируемый метод объяснения модели-агностики (LIME), чтобы вычислить карту важности функций в вход изображении scoreMap
= imageLIME(net
,X
,label
)X
когда сеть net
оценивает счет класса для класса, заданную как label
. Используйте эту функцию, чтобы объяснить решения классификации и проверить, что ваша сеть фокусируется на соответствующих функциях изображения.
Метод LIME аппроксимирует классификационное поведение net
использование более простой, более интерпретируемой модели. Путем генерации синтетических данных из входных X
, классификация синтетических данных с помощью net
, а затем используя результаты для соответствия простой регрессионой модели, imageLIME
функция определяет важность каждой характеристики X
к классификационной оценке сети для класса, заданному label
.
Эта функция требует Statistics and Machine Learning Toolbox™.
[
также возвращает карту функций, используемую для вычисления результатов LIME и вычисленной важности каждой функции.scoreMap
,featureMap
,featureImportance
] = imageLIME(net
,X
,label
)
___ = imageLIME(___,
задает опции, использующие один или несколько аргументы пары "имя-значение" в дополнение к входным параметрам в предыдущих синтаксисах. Для примера, Name,Value
)'NumFeatures',100
устанавливает целевое число функций равное 100.
Этот пример использует:
Использование imageLIME
визуализация частей изображения важна для сети для решения о классификации.
Импортируйте предварительно обученную сеть 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
Использование imageLIME
определить, какие части изображения важны для результата классификации.
scoreMap = imageLIME(net,X,label);
Постройте график результата по оригинальному изображению с прозрачностью, чтобы увидеть, какие области изображения влияют на классификационную оценку.
figure imshow(X) hold on imagesc(scoreMap,'AlphaData',0.5) colormap jet
Сеть фокусируется преимущественно на голове Лайки и обратно, чтобы принять решение о классификации. Глаз и ухо Лайки также важны для результата классификации.
Этот пример использует:
Использование imageLIME
определить самые важные функции в изображении и изолировать их от неважных функций.
Импортируйте предварительно обученную сеть SqueezeNet.
net = squeezenet;
Импортируйте изображение и измените размер, чтобы соответствовать размеру входа для сети.
X = imread("sherlock.jpg");
inputSize = net.Layers(1).InputSize(1:2);
X = imresize(X,inputSize);
Классифицируйте изображение, чтобы получить метку класса.
label = classify(net,X)
label = categorical
golden retriever
Вычислите карту функции важности, а также получите карту функций и функции важности. Установите метод сегментации изображений равным 'grid'
, количество функций, которые нужно 64
, и количество синтетических изображений в 3072
.
[scoreMap,featureMap,featureImportance] = imageLIME(net,X,label,'Segmentation','grid','NumFeatures',64,'NumSamples',3072);
Постройте график результата по оригинальному изображению с прозрачностью, чтобы увидеть, какие области изображения влияют на классификационную оценку.
figure imshow(X) hold on imagesc(scoreMap,'AlphaData',0.5) colormap jet colorbar
Используйте значение функции, чтобы найти индексы наиболее важных пяти функций.
numTopFeatures = 5; [~,idx] = maxk(featureImportance,numTopFeatures);
Используйте карту функций, чтобы замаскировать изображение, так что видны только самые важные пять функций. Отобразите маскированное изображение.
mask = ismember(featureMap,idx); maskedImg = uint8(mask).*X; figure imshow(maskedImg);
Использование imageLIME
с помощью пользовательской карты сегментации для просмотра наиболее важнейшие функции для решения классификации.
Импортируйте предварительно обученную сеть GoogLeNet.
net = googlenet;
Импортируйте изображение и измените размер, чтобы соответствовать размеру входа для сети.
X = imread("sherlock.jpg");
inputSize = net.Layers(1).InputSize(1:2);
X = imresize(X,inputSize);
Классифицируйте изображение, чтобы получить метку класса.
label = classify(net,X)
label = categorical
golden retriever
Создайте матрицу, определяющую пользовательскую карту сегментации, которая разделяет изображение на треугольные сегменты. Каждый треугольный сегмент представляет функция.
Начните с определения матрицы с размером, равным входу изображения.
segmentationMap = zeros(inputSize(1));
Затем создайте карту сегментации меньшего размера, которая разделяет область 56 на 56 пикселей на две треугольные функции. Присвойте значения 1 и 2 верхнему и нижнему сегментам, представляющим первые и вторые функции, соответственно.
blockSize = 56;
segmentationSubset = ones(blockSize);
segmentationSubset = tril(segmentationSubset) + segmentationSubset;
% Set the diagonal elements to alternate values 1 and 2.
segmentationSubset(1:(blockSize+1):end) = repmat([1 2],1,blockSize/2)';
Чтобы создать пользовательскую карту сегментации для всего изображения, повторите маленькую карту сегментации. Каждый раз, когда вы повторяете меньшую карту, увеличивайте значения индекса функции так, чтобы пиксели в каждом треугольном сегменте соответствовали уникальной функции. В последней матрице значение 1 указывает первую функцию, значение 2 - вторая функция и так далее для каждого сегмента изображения.
blocksPerSide = inputSize(1)/blockSize; subset = 0; for i=1:blocksPerSide for j=1:blocksPerSide xidx = (blockSize*(i-1))+1:(blockSize*i); yidx = (blockSize*(j-1))+1:(blockSize*j); segmentationMap(xidx,yidx) = segmentationSubset + 2*subset; subset = subset + 1; end end
Просмотрите карту сегментации. Эта карта разделяет изображение на 32 треугольных области.
figure imshow(X) hold on imagesc(segmentationMap,'AlphaData',0.8); title('Custom Segmentation Map') colormap gray
Использование imageLIME
с помощью пользовательской карты сегментации, чтобы определить, какие части изображения наиболее важны для результата классификации.
scoreMap = imageLIME(net,X,label, ... 'Segmentation',segmentationMap);
Постройте график результата imageLIME
по оригинальному изображению увидеть, какие области изображения влияют на классификационную оценку.
figure; imshow(X) hold on title('Image LIME (Golden Retriever)') colormap jet; imagesc(scoreMap, "AlphaData", 0.5);
Красные области карты имеют более большое значение - когда эти области удаляются, счет для класса золотого ретривера падает. Наиболее важнейшая функция для этой классификации является ухо.
net
- Сеть классификации изображенийSeriesNetwork
| объекта DAGNetwork
объектСеть классификации изображений, заданная как SeriesNetwork
объект или DAGNetwork
объект. Вы можете получить обученную сеть, импортировав предварительно обученную сеть или обучив свою собственную сеть с помощью trainNetwork
функция. Для получения дополнительной информации о предварительно обученных сетях смотрите Pretrained Deep Neural Networks.
net
должен содержать один входной слой и один выходной слой. Слой входа должен быть imageInputLayer
. Слой выхода должен быть classificationLayer
.
X
- Входное изображениеВходное изображение, заданное как числовой массив.
Изображение должно быть того же размера, что и размер входа изображения сети net
. Размер входа определяется InputSize
свойство imageInputLayer
сети.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
label
- Метка классаМетка класса, используемая для вычисления карты важности функции, заданная как категориальная, вектор char, строковый скаляр или вектор этих значений.
Если вы задаете label
в качестве вектора программа вычисляет значение функции для каждой метки класса независимо. В этом случае scoreMap(:,:,k)
и featureImportance(idx,k)
соответствуют карте функции важности и важности функции idx
для k
первый элемент в label
, соответственно.
Пример: ["cat" "dog"]
Типы данных: char
| string
| categorical
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'NumFeatures',100,'Segmentation','grid', 'OutputUpsampling','bicubic','ExecutionEnvironment','gpu'
сегментирует вход изображение в сетку приблизительно 100 функций, выполняет вычисление на графическом процессоре и увеличивает размер полученной карты до того же размера, что и входа изображение, используя бикубическую интерполяцию. 'NumFeatures'
- Целевое количество функций49
(по умолчанию) | положительное целое числоЦелевое количество функций для деления входа изображения на, заданное как разделенная запятой пара, состоящее из 'NumFeatures'
и положительное целое число.
Большее значение 'NumFeatures'
разделяет вход изображение на более мелкие функции. Чтобы получить лучшие результаты при использовании большего количества функций, также увеличьте количество синтетических изображений, используя 'NumSamples'
Пара "имя-значение".
Точное количество функций зависит от входа изображения и метода сегментации, заданных с помощью 'Segmentation'
Пара "имя-значение" и может быть меньше целевого количества функций.
Когда вы задаете 'Segmentation','superpixels'
фактическое количество функций может быть больше или меньше количества, заданного при помощи 'NumFeatures'
.
Когда вы задаете 'Segmentation','grid'
фактическое количество функций может быть меньше количества, заданного при помощи 'NumFeatures'
. Если ваше входное изображение квадратное, задайте 'NumFeatures'
как квадратное число.
Когда вы задаете 'Segmentation',segmentation
, где segmentation
- двумерная матрица, 'NumFeatures'
совпадает с количеством уникальных элементов в матрице.
Пример: 'NumFeatures',100
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
'NumSamples'
- Количество синтетических изображений2048
(по умолчанию) | положительное целое числоКоличество синтетических изображений для генерации, заданное как разделенная разделенными запятой парами, состоящая из 'NumSamples'
и положительное целое число.
Большее количество синтетических изображений дает лучшие результаты, но занимает больше времени, чтобы вычислить.
Пример: 'NumSamples',1024
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
'Segmentation'
- Метод сегментации'superpixels'
(по умолчанию) | 'grid'
| числовую матрицуМетод сегментации для разделения входа изображения на функции, заданный как разделенная запятой пара, состоящий из 'Segmentation'
и 'superpixels'
, 'grid'
, или двумерная матрица сегментации.
The imageLIME
функция сегментирует вход изображение в функции следующими способами в зависимости от метода сегментации.
'superpixels'
- Входное изображение разделяется на суперпиксельные функции, используя superpixels
(Image Processing Toolbox) функция. Функции имеют неправильную форму, основанную на значении пикселей. Эта опция требует Image Processing Toolbox™.
'grid'
- Входное изображение разделено на регулярную сетку функций. Функции примерно квадратные, основанные на соотношении сторон входного изображения и заданном значении 'NumFeatures'
. Количество камер сетки может быть меньше заданного значения 'NumFeatures'
. Если входное изображение квадратное, задайте 'NumFeatures'
как квадратное число.
числовая матрица - Входное изображение разделено на пользовательские функции, используя числовую матрицу в качестве карты, где целочисленное значение каждого пикселя задает функцию соответствующего пикселя. 'NumFeatures'
совпадает с количеством уникальных элементов в матрице. Размер матрицы должен совпадать с размером входа изображения.
Для данных фотографического изображения, 'superpixels'
опция обычно дает лучшие результаты. В этом случае функции основаны на содержимом изображения, путем сегментации изображения в области с подобным значением пикселя. Для других типов изображений, таких как спектрограммы, более регулярные 'grid'
опция или пользовательская карта сегментации может предоставить более полезные результаты.
Пример: 'Segmentation','grid'
'Model'
- Тип простой модели'tree'
(по умолчанию) | 'linear'
Тип подгоняемой простой модели, заданный как разделенная разделенными запятой парами, состоящая из 'Model'
и 'tree'
или 'linear'
.
imageLIME
функция классифицирует синтетические изображения с помощью сетевого net
а затем использует результаты, чтобы соответствовать простой, интерпретируемой модели. Методы, используемые для подгонки результатов и определения важности каждой функции, зависят от типа используемой простой модели.
'tree'
- Подгонка дерева регрессии с помощью fitrtree
(Statistics and Machine Learning Toolbox) затем вычислите важность каждой функции, используя predictorImportance
(Statistics and Machine Learning Toolbox)
'linear'
- Подгонка линейной модели с регрессией лассо с помощью fitrlinear
(Statistics and Machine Learning Toolbox) затем вычислите важность каждой функции, используя веса линейной модели.
Пример: 'Model','linear'
Типы данных: char
| string
'OutputUpsampling'
- Метод увеличения дискретизации выходного сигнала'nearest'
(по умолчанию) | 'bicubic'
| 'none'
Выведите метод повышающей дискретизации, который будет использоваться, когда метод сегментации 'grid'
, заданная как разделенная разделенными запятой парами, состоящая из 'OutputUpsampling'
и одно из следующих.
'nearest'
- Используйте интерполяцию по ближайшему соседу, разверните карту до того же размера, что и входные данные. Карта указывает размер каждой функции относительно размера входных данных.
'bicubic'
- Используйте бикубическую интерполяцию, чтобы получить гладкую карту того же размера, что и входные данные.
'none'
- Не используйте повышающую дискретизацию. Карта может быть меньше, чем входные данные.
Если 'OutputUpsampling'
является 'nearest'
или 'bicubic'
, вычисленная карта повышается до размера входных данных с помощью imresize
функция.
Пример: 'OutputUpsampling','bicubic'
'MiniBatchSize'
- Размер мини-партииРазмер мини-пакета, используемого для вычисления важности функции карты, задается как разделенная разделенными запятой парами, состоящая из 'MiniBatchSize'
и положительное целое число.
Мини-пакет является подмножеством набора синтетических изображений. Мини-пакет определяет количество синтетических изображений, которые передаются в сеть сразу. Большие размеры мини-пакетов приводят к более быстрым расчетам счет увеличения памяти.
Пример: 'MiniBatchSize',256
'ExecutionEnvironment'
- Аппаратный ресурс 'auto'
(по умолчанию) | 'cpu'
| 'gpu'
Аппаратный ресурс для вычисления карты, заданный как разделенная разделенными запятой парами, состоящая из 'ExecutionEnvironment'
и одно из следующих.
'auto'
- Используйте графический процессор, если он доступен. В противном случае используйте центральный процессор.
'cpu'
- Использовать центральный процессор.
'gpu'
- Использовать графический процессор.
Для опции GPU требуется Parallel Computing Toolbox™.
Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).
Если вы выбираете 'ExecutionEnvironment','gpu'
опция и Parallel Computing Toolbox или подходящий графический процессор недоступны, затем программное обеспечение возвращает ошибку.
Пример: 'ExecutionEnvironment','gpu'
scoreMap
- Карта важности функций Карта важности функции, возвращенная как числовая матрица или числовой массив. Области на карте с более высокими положительными значениями соответствуют областям входных данных, которые вносят положительный вклад в указанную классификационную метку.
Значение scoreMap(i,j)
обозначает важность пикселя изображения (i,j)
к простой модели, кроме тех случаев, когда вы используете опции 'Segmentation','grid'
, и 'OutputUpsampling','none'
. В этом случае scoreMap
меньше, чем вход изображение, и значение scoreMap(i,j)
обозначает важность функции в положении (i,j)
в сетке функций.
Если label
задается как вектор, изменение классификационной оценки для каждой метки класса вычисляется независимо. В этом случае scoreMap(:,:,k)
соответствует карте окклюзии для k
первый элемент в label
.
featureMap
- Карта функцийКарта функций, возвращенная как числовая матрица.
Для каждого пикселя (i,j)
на вход изображении idx = featureMap(i,j)
- целое число, соответствующее индексу функции, содержащего этот пиксель.
featureImportance
- Особенность важностиФункция, возвращенная как числовой вектор или числовая матрица.
Значение featureImportance(idx)
- вычисленная важность функции, заданная в idx
. Если вы предоставляете метки как вектор категориальных значений, векторов char или строковых скаляров, то featureImportance(idx,k)
соответствует важности функции idx
для label(k)
.
Локально интерпретируемый метод моделирования-агностических объяснений (LIME) является методом объяснения, используемым для объяснения классификационных решений, принимаемых глубокой нейронной сетью.
Учитывая решение о классификации глубокой сети для части входных данных, метод LIME вычисляет важность каждой функции входных данных для результата классификации.
Метод LIME аппроксимирует поведение глубокой нейронной сети с помощью более простой, более интерпретируемой модели, такой как регрессионное дерево. Чтобы отобразить важность различных частей входа изображения, imageLIME
функция от выполняет следующие шаги.
Сегментируйте изображение в функции.
Сгенерируйте синтетические данные изображения случайным образом, включая или исключая функции. Каждый пиксель исключённой функции заменяется значением среднего пикселя изображения.
Классификация синтетических изображений с помощью глубокой сети.
Подгонка регрессионной модели с использованием наличия или отсутствия функций изображения для каждого синтетического изображения в качестве бинарных предикторов регрессии для счетов целевого класса.
Вычислите важность каждой функции, используя регрессионую модель.
Получившаяся карта может использоваться, чтобы определить, какие функции были наиболее важны для конкретного решения классификации. Это может быть особенно полезно для проверки того, что ваша сеть фокусируется на соответствующих функциях при классификации.
activations
| classify
| gradCAM
| occlusionSensitivity
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.