Этот пример показывает, как использовать локально интерпретируемые модели-агностические объяснения (LIME) для исследования надежности глубокой сверточной нейронной сети, обученной классифицировать спектрограммы. LIME - это методика визуализации того, какие части наблюдения вносят вклад в классификационное решение сети. В этом примере используется imageLIME функция, чтобы понять, какие особенности в данных спектрограммы наиболее важны для классификации.
В этом примере создается и обучается нейронная сеть для классификации четырех видов моделируемых данных временных рядов:
Синусоидальные волны одной частоты
Наложение трех синусоидальных волн
Широкие гауссовы пики во временных рядах
Гауссовы импульсы во временном ряду
Чтобы сделать эту проблему более реалистичной, временные ряды включают в себя добавленные смешанные сигналы: постоянную низкочастотную фоновую синусоиду и большое количество высокочастотного шума. Шумные данные временных рядов представляют собой сложную проблему классификации последовательностей. Проблему можно решить, предварительно преобразовав данные временных рядов в частотно-временную спектрограмму, чтобы выявить основные особенности данных временных рядов. Затем можно ввести спектрограммы в сеть классификации изображений.
Создайте данные временных рядов для четырех классов. В этом примере используется вспомогательная функция generateSpectrogramData для генерации временного ряда и соответствующих данных спектрограммы. Вспомогательные функции, используемые в этом примере, присоединяются как вспомогательные файлы.
numObsPerClass = 500; classes = categorical(["SingleFrequency","ThreeFrequency","Gaussian","Pulse"]); numClasses = length(classes); [noisyTimeSeries,spectrograms,labels] = generateSpectrogramData(numObsPerClass,classes);
Вычислите размер изображений спектрограммы и количество наблюдений.
inputSize = size(spectrograms, [1 2]); numObs = size(spectrograms,4);
Постройте график подмножества данных временных рядов с добавлением шума. Поскольку шум имеет амплитуду, сравнимую с сигналом, данные кажутся шумными во временной области. Эта особенность делает классификацию сложной проблемой.
figure numPlots = 12; for i=1:numPlots subplot(3,4,i) plot(noisyTimeSeries(i,:)) title(labels(i)) end

Постройте график частотно-временных спектрограмм шумных данных в том же порядке, что и графики временных рядов. Горизонтальной осью является время, а вертикальной осью - частота.
figure for i=1:12 subplot(3,4,i) imshow(spectrograms(:,:,1,i)) hold on colormap parula title(labels(i)) hold off end

Признаки из каждого класса хорошо видны, демонстрируя, почему преобразование из временной области в спектрограммы изображений может быть полезным для этого типа проблем. Например, SingleFrequency класс имеет единственный пик на основной частоте, видимый в виде горизонтальной планки в спектрограмме. Для ThreeFrequency класс, три частоты видны.
Все классы отображают слабую полосу на низкой частоте (рядом с верхней частью изображения), соответствующую фоновой синусоиде.
Используйте splitlabels функция для разделения данных на данные обучения и проверки. Используйте 80% данных для обучения и 20% для проверки.
splitIndices = splitlabels(labels,0.8);
trainLabels = labels(splitIndices{1});
trainSpectrograms = spectrograms(:,:,:,splitIndices{1});
valLabels = labels(splitIndices{2});
valSpectrograms = spectrograms(:,:,:,splitIndices{2});Создайте сверточную нейронную сеть с блоками свертки, пакетной нормализации и слоев ReLU.
dropoutProb = 0.2;
numFilters = 8;
layers = [
imageInputLayer(inputSize)
convolution2dLayer(3,numFilters,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Stride',2,'Padding','same')
convolution2dLayer(3,2*numFilters,'Padding','same')
batchNormalizationLayer
convolution2dLayer(3,4*numFilters,'Padding','same')
batchNormalizationLayer
reluLayer
globalMaxPooling2dLayer
dropoutLayer(dropoutProb)
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];Определите параметры обучения с помощью оптимизатора SGDM. Тасуйте данные каждую эпоху, установив 'Shuffle' опция для 'every-epoch'. Контролировать ход обучения, установив 'Plots' опция для 'training-progress'. Для подавления подробных выходных данных установите 'Verbose' кому false.
options = trainingOptions('sgdm', ... 'Shuffle','every-epoch', ... 'Plots','training-progress', ... 'Verbose',false, ... 'ValidationData',{valSpectrograms,valLabels});
Обучите сеть классификации изображений спектрограмм.
net = trainNetwork(trainSpectrograms,trainLabels,layers,options);

Классифицируйте проверочные наблюдения с использованием обученной сети.
predLabels = classify(net,valSpectrograms);
Исследование производительности сети путем построения таблицы путаницы с помощью confusionchart.
figure confusionchart(valLabels,predLabels,'Normalization','row-normalized')

Сеть точно классифицирует проверочные спектрограммы с точностью до 100% для большинства классов.
Используйте imageLIME чтобы понять, какие особенности в данных изображения наиболее важны для классификации.
Метод LIME сегментирует изображение на несколько признаков и генерирует синтетические наблюдения путем случайного включения или исключения признаков. Каждый пиксель в исключенном элементе заменяется значением среднего пикселя изображения. Сеть классифицирует эти синтетические наблюдения и использует результирующие оценки для прогнозируемого класса, наряду с наличием или отсутствием признака, в качестве ответов и предикторов для тренировки проблемы регрессии с помощью более простой модели - в этом примере дерева регрессии. Дерево регрессии пытается аппроксимировать поведение сети при одном наблюдении. Он узнает, какие функции важны и существенно влияют на оценку класса.
По умолчанию imageLIME использует суперпиксельную сегментацию для разделения изображения на элементы. Этот вариант хорошо работает для естественных изображений, но менее эффективен для данных спектрограмм. Можно указать пользовательскую карту сегментации, установив 'Segmentation' аргумент name-value числового массива того же размера, что и изображение, где каждый элемент является целым числом, соответствующим индексу элемента, в котором находится пиксель.
Для данных спектрограммы изображения спектрограммы имеют гораздо более тонкие характеристики в y-размерности (частоте), чем в x-размерности (времени). Создайте карту сегментации с 240 сегментами в сетке 40 на 6, чтобы обеспечить более высокое разрешение частоты. Приведите сетку к размеру изображения с помощью команды imresize функция, определяющая метод повышающей дискретизации как 'nearest'.
featureIdx = 1:240;
segmentationMap = reshape(featureIdx,6,40)';
segmentationMap = imresize(segmentationMap,inputSize,'nearest');Постройте график спектрограммы и вычислите карту LIME для двух наблюдений из каждого класса.
obsToShowPerClass = 2; for j=1:obsToShowPerClass figure for i=1:length(classes) idx = find(valLabels == classes(i),obsToShowPerClass); % Read the test image and label. testSpectrogram = valSpectrograms(:,:,:,idx(j)); testLabel = valLabels(idx(j)); % Compute the LIME importance map. map = imageLIME(net,testSpectrogram,testLabel, ... 'NumSamples',4096, ... 'Segmentation',segmentationMap); % Rescale the map to the size of the image. mapRescale = uint8(255*rescale(map)); % Plot the spectrogram image next to the LIME map. subplot(2,2,i) imshow(imtile({testSpectrogram,mapRescale})) title(string(testLabel)) colormap parula end end


Карты LIME показывают, что для большинства классов сеть ориентирована на соответствующие особенности классификации. Например, для SingleFrequency , сеть фокусируется на частоте, соответствующей спектру мощности синусоидальной волны, а не на ложных фоновых деталях или шумах.
Для SingleFrequency , сеть использует частоту для классификации. Для Pulse и Gaussian классы, сеть дополнительно фокусируется на правильной частотной части спектрограммы. Для этих трех классов сеть не смущает фоновая частота, видимая вблизи верхней части всех спектрограмм. Эта информация не помогает различать эти классы (поскольку она присутствует во всех классах), поэтому сеть игнорирует ее. Напротив, для ThreeFrequency класс, постоянная фоновая частота релевантна для решения о классификации сети. Для этого класса сеть не игнорирует эту частоту, но рассматривает ее с такой же важностью, что и три фактические частоты.
imageLIME результаты показывают, что сеть правильно использует пики в частотно-временных спектрограммах и не путается ложной фоновой синусоидой для всех классов, кроме ThreeFrequency класс, где сеть не различает три частоты в сигнале и низкочастотный фон.
imageLIME | trainNetwork | pspectrum (Панель инструментов обработки сигналов)