Объяснение сетевых прогнозов с использованием LIME
использует локально интерпретируемый метод моделирования-агностического объяснения (LIME) для вычисления карты важности признаков во входном изображении scoreMap = imageLIME(net,X,label)X когда сеть net оценивает балл класса для класса, заданного label. Эта функция используется для пояснения классификационных решений и проверки того, что сеть фокусируется на соответствующих функциях изображения.
Метод LIME аппроксимирует классификационное поведение net использование более простой, более интерпретируемой модели. Путем генерации синтетических данных из входных данных X, классификация синтетических данных с использованием net, а затем используя результаты для соответствия простой регрессионной модели, imageLIME функция определяет важность каждой функции X к шкале классификации сети для класса, label.
Для выполнения этой функции требуются Toolbox™ статистики и машинного обучения.
[ также возвращает карту элементов, используемых для вычисления результатов LIME, и вычисленную важность каждого элемента.scoreMap,featureMap,featureImportance] = imageLIME(net,X,label)
___ = imageLIME(___, указывает параметры, использующие один или несколько аргументов пары имя-значение в дополнение к входным аргументам в предыдущих синтаксисах. Например, Name,Value)'NumFeatures',100 устанавливает целевое количество элементов равным 100.
Использовать imageLIME визуализация частей изображения важна для сети для принятия решения о классификации.
Импортируйте предварительно обученную сеть SqueeEcNet.
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 определить наиболее важные элементы изображения и изолировать их от неважных элементов.
Импортируйте предварительно обученную сеть SqueeEcNet.
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 функция. Дополнительные сведения о предварительно обученных сетях см. в разделе Предварительно обученные глубокие нейронные сети.
net должен содержать один входной уровень и один выходной уровень. Входной уровень должен быть imageInputLayer. Уровень вывода должен быть classificationLayer.
X - Входное изображениеВходное изображение, указанное как числовой массив.
Размер изображения должен совпадать с размером входного изображения сети net. Размер входных данных определяется параметром InputSize свойство сети imageInputLayer.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
label - Этикетка классаМетка класса, используемая для вычисления карты важности элемента, заданная как категориальный, символьный вектор, строковый скаляр или вектор этих значений.
При указании 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 элементов, выполняет вычисление на GPU и увеличивает выборку результирующей карты до того же размера, что и входное изображение, используя бикубическую интерполяцию. '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'или двумерная матрица сегментации.
imageLIME функция сегментирует входное изображение на элементы следующими способами в зависимости от метода сегментации.
'superpixels' - Входное изображение делится на суперпиксельные функции, используя superpixels(Панель инструментов обработки изображений). Элементы имеют неправильную форму на основе значения пикселов. Для этого параметра требуется Toolbox™ обработки изображений.
'grid' - Входное изображение делится на регулярную сетку признаков. Элементы приблизительно квадратные, исходя из соотношения сторон входного изображения и заданного значения 'NumFeatures'. Число ячеек сетки может быть меньше указанного значения 'NumFeatures'. Если входное изображение является квадратным, укажите 'NumFeatures' в виде квадратного числа.
numeric matrix - Входное изображение делится на пользовательские элементы, используя в качестве карты числовую матрицу, где целое значение каждого пикселя задает признак соответствующего пикселя. 'NumFeatures' совпадает с количеством уникальных элементов в матрице. Размер матрицы должен соответствовать размеру входного изображения.
Для данных фотографического изображения, 'superpixels' вариант обычно дает лучшие результаты. В этом случае признаки основаны на содержимом изображения путем сегментирования изображения на области с аналогичным значением пикселя. Для других типов изображений, таких как спектрограммы, более регулярные 'grid' опция или пользовательская карта сегментации может предоставить более полезные результаты.
Пример: 'Segmentation','grid'
'Model' - Тип простой модели'tree' (по умолчанию) | 'linear'Тип простой модели для подгонки, указанный как пара, разделенная запятыми, состоящая из 'Model' и 'tree' или 'linear'.
imageLIME функция классифицирует синтетические изображения с помощью сети net а затем использует результаты для соответствия простой, интерпретируемой модели. Методы, используемые для подгонки результатов и определения важности каждого элемента, зависят от типа используемой простой модели.
'tree' - подгонка дерева регрессии с помощью fitrtree (Statistics and Machine Learning Toolbox) затем вычислить важность каждой функции с помощью predictorImportance(Набор инструментов для статистики и машинного обучения)
'linear' - подгонка линейной модели с регрессией лассо с использованием fitrlinear (Статистика и инструментарий машинного обучения) затем вычисляют важность каждого элемента с использованием весов линейной модели.
Пример: '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 требует Toolbox™ параллельных вычислений.
Чтобы использовать графический процессор для глубокого обучения, необходимо также иметь поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox).
При выборе 'ExecutionEnvironment','gpu' option и 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. Если метки предоставляются как вектор категориальных значений, векторов символов или строковых скаляров, то featureImportance(idx,k) соответствует важности признака idx для label(k).
Метод локально интерпретируемых модельно-агностических объяснений (LIME) - это метод объяснимости, используемый для объяснения классификационных решений, принимаемых глубокой нейронной сетью.
Учитывая классификационное решение глубокой сети для части входных данных, методика LIME вычисляет важность каждого признака входных данных для результата классификации.
Методика LIME аппроксимирует поведение глубокой нейронной сети, используя более простую, более интерпретируемую модель, такую как регрессионное дерево. Чтобы отобразить важность различных частей входного изображения, imageLIME функция выполняет следующие шаги.
Сегментируйте изображение на элементы.
Создание данных синтетического изображения путем случайного включения или исключения элементов. Каждый пиксель в исключенном элементе заменяется значением среднего пикселя изображения.
Классифицируйте синтетические изображения с помощью глубокой сети.
Подберите регрессионную модель, используя наличие или отсутствие признаков изображения для каждого синтетического изображения в качестве бинарных предикторов регрессии для оценок целевого класса.
Вычислите важность каждого элемента с помощью регрессионной модели.
Полученная карта может использоваться для определения того, какие функции были наиболее важными для конкретного решения о классификации. Это может быть особенно полезно для проверки того, что ваша сеть фокусируется на соответствующих функциях при классификации.
activations | classify | gradCAM | occlusionSensitivity
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.