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

Этот пример показывает, как классифицировать человеческую электрокардиограмму (ECG) сигналы с помощью непрерывного вейвлета преобразовывает (CWT) и глубокой сверточной нейронной сети (CNN).

Обучение глубокий CNN с нуля является в вычислительном отношении дорогим и требует большой суммы данных тренировки. В различных приложениях достаточная сумма данных тренировки не доступна, и синтезирование новых реалистических учебных примеров не выполнимо. В этих случаях, усиливая существующие нейронные сети, которые были обучены на больших наборах данных для концептуально подобных задач, желательно. Это усиление существующих нейронных сетей называется изучением передачи. В этом примере мы адаптируем два глубоких CNNs, GoogLeNet и AlexNet, предварительно обученный распознаванию изображений классифицировать формы волны ECG на основе представления частоты времени.

GoogLeNet и AlexNet являются глубоким CNNs, первоначально разработанным, чтобы классифицировать изображения на 1 000 категорий. Мы снова используем сетевую архитектуру CNN, чтобы классифицировать сигналы ECG на основе изображений от CWT данных временных рядов. Чтобы запустить этот пример, у вас должны быть Wavelet Toolbox™, Image Processing Toolbox™, Deep Learning Toolbox™, Модель Deep Learning Toolbox™ для пакета Сетевой поддержки GoogLeNet и Модель Deep Learning Toolbox™ для пакета Сетевой поддержки AlexNet. Чтобы найти и установить пакеты поддержки используют Add-On Explorer MATLAB™. Опция в этом примере установлена так, чтобы учебные процессы работали на центральном процессоре. Если ваша машина имеет графический процессор и Parallel Computing Toolbox™, можно ускорить учебные процессы, установив опцию работать на графическом процессоре. Данные, используемые в этом примере, общедоступны от PhysioNet.

Описание данных

В этом примере вы используете данные о ECG, полученные из трех групп людей: люди с сердечной аритмией (ARR), люди с застойной сердечной недостаточностью (CHF) и люди с нормальными ритмами пазухи (NSR). Всего вы используете 162 записи ECG от трех Физиосетевых баз данных: База данных Аритмии MIT-BIH [3] [7], MIT-BIH Нормальная База данных Ритма Пазухи [3] и База данных Застойной сердечной недостаточности BIDMC [1] [3]. А именно, 96 записей от людей с аритмией, 30 записей от людей с застойной сердечной недостаточностью и 36 записей от людей с нормальными ритмами пазухи. Цель состоит в том, чтобы обучить классификатор различать ARR, швейцарский франк и NSR.

Загрузите данные

Первый шаг должен загрузить данные из репозитория GitHub. Чтобы загрузить данные из веб-сайта, нажмите Clone or download и выберите Download ZIP. Сохраните файл physionet_ECG_data-master.zip в папке, где у вас есть разрешение записи. Инструкции для этого примера принимают, что вы загрузили файл на свою временную директорию, tempdir, в MATLAB. Измените последующие инструкции для того, чтобы разархивировать и загрузить данные, если вы принимаете решение загрузить данные в папке, отличающейся от tempdir. Если вы знакомы с Git, можно загрузить последнюю версию инструментов (Git) и получить данные из системной командной строки с помощью git clone https://github.com/mathworks/physionet_ECG_data/.

После загрузки данных GitHub разархивируйте файл в своей временной директории.

unzip(fullfile(tempdir,'physionet_ECG_data-master.zip'),tempdir)

Разархивация создает папку physionet-ECG_data-master в вашей временной директории. Эта папка содержит текстовый файл README.md и ECGData.zip. Файл ECGData.zip содержит

  • ECGData.mat

  • Modified_physionet_data.txt

  • License.txt.

ECGData.mat содержит данные, используемые в этом примере. .txt файл, Modified_physionet_data.txt, требуется копированием PhysioNet политики и обеспечивает исходные приписывания для данных, а также описание шагов предварительной обработки применилось к каждой записи ECG.

Разархивируйте ECGData.zip в physionet-ECG_data-master. Загрузите файл данных в свое рабочее пространство MATLAB.

unzip(fullfile(tempdir,'physionet_ECG_data-master','ECGData.zip'),...
    fullfile(tempdir,'physionet_ECG_data-master'))
load(fullfile(tempdir,'physionet_ECG_data-master','ECGData.mat'))

ECGData является массивом структур с двумя полями: Data и Labels. Поле Data 162 65536 матрица, где каждая строка является записью ECG, выбранной на уровне 128 герц. Labels является 162 1 массивом ячеек диагностических меток, один для каждой строки Data. Три диагностических категории: 'ARR', 'швейцарский франк' и 'NSR'.

Чтобы хранить предварительно обработанные данные каждой категории, сначала создайте директорию dataDir данных о ECG в tempdir. Затем создайте три подкаталога в 'data', названном в честь каждой категории ECG. Функция помощника helperCreateECGDirectories делает это. helperCreateECGDirectories принимает ECGData, имя директории данных о ECG и имя родительского каталога как входные параметры. Можно заменить tempdir на другую директорию, где у вас есть разрешение записи. Можно найти исходный код для этой функции помощника в разделе Supporting Functions в конце этого примера.

parentDir = tempdir;
dataDir = 'data';
helperCreateECGDirectories(ECGData,parentDir,dataDir)

Постройте представителя каждой категории ECG. Функция помощника helperPlotReps делает это. helperPlotReps принимает ECGData как вход. Можно найти исходный код для этой функции помощника в разделе Supporting Functions в конце этого примера.

helperPlotReps(ECGData)

Создайте представления частоты времени

После создания папок создайте представления частоты времени сигналов ECG. Эти представления называются scalograms. scalogram является абсолютным значением коэффициентов CWT сигнала.

Чтобы создать scalograms, предварительно вычислите набор фильтров CWT. Предварительное вычисление набора фильтров CWT является предпочтительным методом при получении CWT многих сигналов с помощью тех же параметров.

Прежде, чем сгенерировать scalograms, исследуйте одного из них. Создайте набор фильтров CWT с помощью cwtfilterbank для сигнала с 1 000 выборок. Используйте набор фильтров, чтобы взять CWT первых 1 000 выборок сигнала и получить scalogram из коэффициентов.

Fs = 128;
fb = cwtfilterbank('SignalLength',1000,...
    'SamplingFrequency',Fs,...
    'VoicesPerOctave',12);
sig = ECGData.Data(1,1:1000);
[cfs,frq] = wt(fb,sig);
t = (0:999)/Fs;figure;pcolor(t,frq,abs(cfs))
set(gca,'yscale','log');shading interp;axis tight;
title('Scalogram');xlabel('Time (s)');ylabel('Frequency (Hz)')

Используйте функцию помощника, helperCreateRGBfromTF, чтобы создать scalograms, когда RGB отображает, и запишите им в соответствующий подкаталог в dataDir. Исходный код для этой функции помощника находится в разделе Supporting Functions в конце этого примера. Чтобы быть совместимым с архитектурой GoogLeNet, каждое изображение RGB является массивом размера 224 224 3.

helperCreateRGBfromTF(ECGData,parentDir,dataDir)

Разделитесь на данные об обучении и валидации

Загрузите изображения scalogram как datastore изображений. Функция imageDatastore автоматически маркирует изображения на основе имен папок и хранит данные как объект ImageDatastore. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти, и эффективно считать пакеты изображений во время обучения CNN.

allImages = imageDatastore(fullfile(parentDir,dataDir),...
    'IncludeSubfolders',true,...
    'LabelSource','foldernames');

Случайным образом разделите изображения на две группы, один для обучения и другого для валидации. Используйте 80% изображений для обучения и остатка для валидации. В целях воспроизводимости мы устанавливаем случайный seed на значение по умолчанию.

rng default
[imgsTrain,imgsValidation] = splitEachLabel(allImages,0.8,'randomized');
disp(['Number of training images: ',num2str(numel(imgsTrain.Files))]);
disp(['Number of validation images: ',num2str(numel(imgsValidation.Files))]);
Number of training images: 130
Number of validation images: 32

GoogLeNet

Загрузка

Загрузите предварительно обученную нейронную сеть GoogLeNet. Если Модель Deep Learning Toolbox™ для пакета Сетевой поддержки GoogLeNet не установлена, программное обеспечение обеспечивает ссылку на необходимый пакет поддержки в Add-On Explorer. Чтобы установить пакет поддержки, щелкните по ссылке, и затем нажмите Install.

net = googlenet;

Извлеките график слоя от сети и постройте график слоя.

lgraph = layerGraph(net);
numberOfLayers = numel(lgraph.Layers);
figure('Units','normalized','Position',[0.1 0.1 0.8 0.8]);
plot(lgraph)
title(['GoogLeNet Layer Graph: ',num2str(numberOfLayers),' Layers']);

Осмотрите первый элемент свойства сети Layers. Заметьте, что GoogLeNet требует изображений RGB размера 224 224 3.

net.Layers(1)
ans = 

  ImageInputLayer with properties:

                Name: 'data'
           InputSize: [224 224 3]

   Hyperparameters
    DataAugmentation: 'none'
       Normalization: 'zerocenter'
        AverageImage: [224×224×3 single]

Измените параметры сети GoogLeNet

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

Чтобы переобучить GoogLeNet к нашей проблеме классификации ECG, замените последние четыре слоя сети. Первый из этих четырех слоев, 'pool5-drop_7x7_s1' является слоем уволенного. Слой уволенного случайным образом обнуляет входные элементы с данной вероятностью. Слой уволенного используется, чтобы помочь предотвратить сверхподбор кривой. Вероятность по умолчанию 0.5. Смотрите dropoutLayer для получения дополнительной информации. Эти три оставшихся слоя, 'loss3-классификатор', 'prob', и 'вывод', содержат информацию о том, как сочетать функции, которые сеть извлекает в вероятности класса и метки. По умолчанию последние три слоя сконфигурированы для 1 000 категорий.

Добавьте четыре новых слоя в график слоя: слой уволенного с вероятностью 60%-го уволенного, полносвязного слоя, softmax слоя и классификации вывел слой. Установите итоговый полносвязный слой иметь тот же размер как количество классов в новом наборе данных (3 в этом примере). Чтобы учиться быстрее в новых слоях, чем в переданных слоях, увеличьте факторы темпа обучения полносвязного слоя. Сохраните размеры изображения GoogLeNet в inputSize.

lgraph = removeLayers(lgraph,{'pool5-drop_7x7_s1','loss3-classifier','prob','output'});

numClasses = numel(categories(imgsTrain.Labels));
newLayers = [
    dropoutLayer(0.6,'Name','newDropout')
    fullyConnectedLayer(numClasses,'Name','fc','WeightLearnRateFactor',5,'BiasLearnRateFactor',5)
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classoutput')];
lgraph = addLayers(lgraph,newLayers);

lgraph = connectLayers(lgraph,'pool5-7x7_s1','newDropout');
inputSize = net.Layers(1).InputSize;

Установите опции обучения и обучите GoogLeNet

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

Обучение может быть настроено путем установки различных вариантов. InitialLearnRate задает начальный размер шага в направлении отрицательного градиента функции потерь. MiniBatchSize задает как большой из подмножества набора обучающих данных, чтобы использовать в каждой итерации. Одна эпоха является всей передачей учебного алгоритма по целому набору обучающих данных. MaxEpochs задает максимальное количество эпох, чтобы использовать для обучения. Выбор правильного номера эпох не является тривиальной задачей. Сокращение числа эпох имеет эффект underfitting модель и увеличение числа результатов эпох в сверхподборе кривой.

Используйте функцию trainingOptions, чтобы задать опции обучения. Установите MiniBatchSize на 10, MaxEpochs к 10 и InitialLearnRate к 0,0001. Визуализируйте учебный прогресс установкой Plots к training-progress. Используйте стохастический спуск градиента с оптимизатором импульса. По умолчанию обучение сделано на графическом процессоре, если вы доступны (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В целях воспроизводимости обучите сеть с помощью только одного центрального процессора, путем установки ExecutionEnvironment на cpu, и установите случайный seed на значение по умолчанию. Время выполнения будет быстрее, если вы сможете использовать графический процессор.

options = trainingOptions('sgdm',...
    'MiniBatchSize',15,...
    'MaxEpochs',20,...
    'InitialLearnRate',1e-4,...
    'ValidationData',imgsValidation,...
    'ValidationFrequency',10,...
    'Verbose',1,...
    'ExecutionEnvironment','cpu',...
    'Plots','training-progress');

Учебный процесс обычно занимает 1-5 минут на настольном центральном процессоре. Командное окно отображает учебную информацию во время выполнения. Результаты будут включать номер эпохи, номер итерации, время протекло, мини-пакетная точность, точность валидации и значение функции потерь для данных о валидации.

rng default
trainedGN = trainNetwork(imgsTrain,lgraph,options);
Initializing input data normalization.
|======================================================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Validation  |  Mini-batch  |  Validation  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |   Accuracy   |     Loss     |     Loss     |      Rate       |
|======================================================================================================================|
|       1 |           1 |       00:00:05 |        6.67% |       18.75% |       4.9207 |       2.4153 |      1.0000e-04 |
|       2 |          10 |       00:00:25 |       66.67% |       62.50% |       0.9578 |       1.3203 |      1.0000e-04 |
|       3 |          20 |       00:00:46 |       46.67% |       75.00% |       1.2938 |       0.5938 |      1.0000e-04 |
|       4 |          30 |       00:01:06 |       53.33% |       78.13% |       0.7139 |       0.4628 |      1.0000e-04 |
|       5 |          40 |       00:01:27 |       73.33% |       84.38% |       0.4740 |       0.3422 |      1.0000e-04 |
|       7 |          50 |       00:01:47 |       93.33% |       84.38% |       0.2818 |       0.2945 |      1.0000e-04 |
|       8 |          60 |       00:02:08 |       80.00% |       87.50% |       0.3610 |       0.2482 |      1.0000e-04 |
|       9 |          70 |       00:02:28 |       86.67% |       84.38% |       0.3397 |       0.2574 |      1.0000e-04 |
|      10 |          80 |       00:02:49 |      100.00% |       96.88% |       0.0718 |       0.1922 |      1.0000e-04 |
|      12 |          90 |       00:03:10 |       86.67% |      100.00% |       0.2872 |       0.1726 |      1.0000e-04 |
|      13 |         100 |       00:03:30 |       86.67% |       96.88% |       0.4367 |       0.1650 |      1.0000e-04 |
|      14 |         110 |       00:03:51 |       86.67% |      100.00% |       0.3139 |       0.1589 |      1.0000e-04 |
|      15 |         120 |       00:04:12 |       93.33% |       96.88% |       0.1491 |       0.1524 |      1.0000e-04 |
|      17 |         130 |       00:04:32 |      100.00% |      100.00% |       0.0553 |       0.1368 |      1.0000e-04 |
|      18 |         140 |       00:04:53 |       93.33% |       96.88% |       0.0997 |       0.1414 |      1.0000e-04 |
|      19 |         150 |       00:05:13 |       93.33% |       93.75% |       0.1621 |       0.1339 |      1.0000e-04 |
|      20 |         160 |       00:05:34 |       93.33% |       96.88% |       0.0881 |       0.1176 |      1.0000e-04 |
|======================================================================================================================|

Осмотрите последние три слоя обучившего сеть. Обратите внимание на то, что Классификация Выходной Слой упоминает три метки.

trainedGN.Layers(end-2:end)
cNames = trainedGN.Layers(end).ClassNames
ans = 

  3x1 Layer array with layers:

     1   'fc'            Fully Connected         3 fully connected layer
     2   'softmax'       Softmax                 softmax
     3   'classoutput'   Classification Output   crossentropyex with 'ARR' and 2 other classes

cNames =

  3×1 cell array

    {'ARR'}
    {'CHF'}
    {'NSR'}

Оцените точность GoogLeNet

Оцените сеть с помощью данных о валидации.

[YPred,probs] = classify(trainedGN,imgsValidation);
accuracy = mean(YPred==imgsValidation.Labels);
display(['GoogLeNet Accuracy: ',num2str(accuracy)])
GoogLeNet Accuracy: 0.96875

Точность идентична точности валидации, о которой сообщают относительно учебной фигуры визуализации. scalograms были разделены в наборы обучения и валидации. Оба набора использовались, чтобы обучить GoogLeNet. Идеальный способ оценить результат обучения состоит в том, чтобы иметь сеть, классифицируют данные, которые это не видело. С тех пор существует недостаточный объем данных, чтобы разделиться на обучение, валидацию и тестирование, мы обрабатываем вычисленную точность валидации как сетевую точность.

Исследуйте активации GoogLeNet

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

wghts = trainedGN.Layers(2).Weights;
wghts = rescale(wghts);
wghts = imresize(wghts,5);
figure
montage(wghts)
title('First Convolutional Layer Weights')

Можно исследовать активации и обнаружить, какие функции GoogLeNet изучает путем сравнения областей активации с оригинальным изображением. Для получения дополнительной информации смотрите, Визуализируют Активации Сверточной Нейронной сети (Deep Learning Toolbox) и Визуализируют Функции Сверточной Нейронной сети (Deep Learning Toolbox).

Исследуйте, какие области в сверточных слоях активируются на изображении от класса ARR. Сравните с соответствующими областями в оригинальном изображении. Каждый слой сверточной нейронной сети состоит из названных каналов многих 2D массивов. Передайте изображение через сеть и исследуйте выходные активации первого сверточного слоя, 'conv1-7x7_s2'.

convLayer = 'conv1-7x7_s2';

imgClass = 'ARR';
imgName = 'ARR_10.jpg';
imarr = imread(fullfile(parentDir,dataDir,imgClass,imgName));

trainingFeaturesARR = activations(trainedGN,imarr,convLayer);
sz = size(trainingFeaturesARR);
trainingFeaturesARR = reshape(trainingFeaturesARR,[sz(1) sz(2) 1 sz(3)]);
figure
montage(rescale(trainingFeaturesARR),'Size',[8 8])
title([imgClass,' Activations'])

Найдите самый сильный канал для этого изображения. Сравните самый сильный канал с оригинальным изображением.

imgSize = size(imarr);
imgSize = imgSize(1:2);
[~,maxValueIndex] = max(max(max(trainingFeaturesARR)));
arrMax = trainingFeaturesARR(:,:,:,maxValueIndex);
arrMax = rescale(arrMax);
arrMax = imresize(arrMax,imgSize);
figure;
imshowpair(imarr,arrMax,'montage')
title(['Strongest ',imgClass,' Channel: ',num2str(maxValueIndex)])

AlexNet

AlexNet является глубоким CNN, архитектура которого поддерживает изображения размера 227 227 3. Даже при том, что размеры изображения отличаются для GoogLeNet, вы не должны генерировать новые изображения RGB в размерностях AlexNet. Можно использовать исходные изображения RGB.

Загрузка

Загрузите предварительно обученную нейронную сеть AlexNet. Если Модель Deep Learning Toolbox™ для пакета Сетевой поддержки AlexNet не установлена, программное обеспечение обеспечивает ссылку на необходимый пакет поддержки в Add-On Explorer. Чтобы установить пакет поддержки, щелкните по ссылке, и затем нажмите Install.

alex = alexnet;

Рассмотрите сетевую архитектуру. Обратите внимание на то, что первый слой задает входной размер изображений как 227 227 3, и что AlexNet имеет меньше слоев, чем GoogLeNet.

layers = alex.Layers
layers = 

  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

Измените параметры сети AlexNet

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

По умолчанию последние три слоя AlexNet сконфигурированы для 1 000 категорий. Эти слои должны быть подстроены к нашей проблеме классификации ECG. Слой 23, полносвязный слой, должен собираться иметь тот же размер как количество категорий в наших данных о ECG. Слой 24 не должен изменяться с нашей проблемой классификации ECG. Softmax применяет функцию softmax к входу. Смотрите softmaxLayer для получения дополнительной информации. Слой 25, слой Classification Output, содержит имя функции потерь, используемой для того, чтобы обучить сеть и метки класса. С тех пор существует три категории ECG, слой 23 набора, чтобы быть полносвязным слоем размера, равного 3 и установить слой 25 быть классификацией выходной слой.

layers(23) = fullyConnectedLayer(3);
layers(25) = classificationLayer;

Подготовьте данные о RGB к AlexNet

Изображения RGB имеют размерности, подходящие для архитектуры GoogLeNet. Получите из первого слоя AlexNet размеры изображения, используемые AlexNet. Используйте те размерности, чтобы создать увеличенные хранилища данных изображений, которые автоматически изменят размер существующих изображений RGB для архитектуры AlexNet. Для получения дополнительной информации смотрите augmentedImageDatastore.

inputSize = alex.Layers(1).InputSize;
augimgsTrain = augmentedImageDatastore(inputSize(1:2),imgsTrain);
augimgsValidation = augmentedImageDatastore(inputSize(1:2),imgsValidation);

Установите опции обучения и обучите AlexNet

Установите опции обучения совпадать с используемыми для GoogLeNet. Затем обучите AlexNet. Учебный процесс обычно занимает 1-5 минут на настольном центральном процессоре.

rng default
mbSize = 10;
mxEpochs = 10;
ilr = 1e-4;
plt = 'training-progress';

opts = trainingOptions('sgdm',...
    'InitialLearnRate',ilr, ...
    'MaxEpochs',mxEpochs ,...
    'MiniBatchSize',mbSize, ...
    'ValidationData',augimgsValidation,...
    'ExecutionEnvironment','cpu',...
    'Plots',plt);

trainedAN = trainNetwork(augimgsTrain,layers,opts);
Initializing input data normalization.
|======================================================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Validation  |  Mini-batch  |  Validation  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |   Accuracy   |     Loss     |     Loss     |      Rate       |
|======================================================================================================================|
|       1 |           1 |       00:00:02 |       20.00% |       18.75% |       2.6121 |       1.9324 |      1.0000e-04 |
|       4 |          50 |       00:00:34 |      100.00% |       87.50% |       0.0961 |       0.3066 |      1.0000e-04 |
|       8 |         100 |       00:01:07 |      100.00% |       96.88% |       0.1020 |       0.1581 |      1.0000e-04 |
|      10 |         130 |       00:01:27 |      100.00% |       93.75% |       0.0414 |       0.1236 |      1.0000e-04 |
|======================================================================================================================|

Точность валидации составляет 93,75%. Осмотрите последние три слоя обученной сети AlexNet. Наблюдайте Классификацию, Выходной Слой упоминает три метки.

trainedAN.Layers(end-2:end)
ans = 

  3x1 Layer array with layers:

     1   'fc'            Fully Connected         3 fully connected layer
     2   'prob'          Softmax                 softmax
     3   'classoutput'   Classification Output   crossentropyex with 'ARR' and 2 other classes

Заключение

Этот пример показывает, как использовать изучение передачи и непрерывный анализ вейвлета, чтобы классифицировать три класса сигналов ECG путем усиления предварительно обученного CNNs GoogLeNet и AlexNet. Основанные на вейвлете представления частоты времени сигналов ECG используются, чтобы создать scalograms. Изображения RGB scalograms сгенерированы. Изображения используются, чтобы подстроить обоих глубоко CNNs. Активации различных сетевых слоев также исследовались.

Этот пример иллюстрирует один возможный рабочий процесс, который можно использовать для классификации сигналов с помощью предварительно обученных моделей CNN. Другие рабочие процессы возможны. GoogLeNet и AlexNet являются моделями, предварительно обученными на подмножестве базы данных ImageNet [10], который используется в ImageNet крупномасштабной визуальной проблеме распознавания (ILSVRC) [8]. Набор ImageNet содержит изображения реальных объектов, такие как рыба, птицы, устройства и грибы. Scalograms выходят за пределы класса реальных объектов. В порядке поместиться в архитектуру GoogLeNet и AlexNet, scalograms также подвергся снижению объема данных. Вместо того, чтобы подстроить предварительно обучил CNNs отличать различные классы scalograms, обучение, CNN с нуля в исходных scalogram размерностях является опцией.

Ссылки

  1. Baim, D. S. В. С. Колуччи, Э. С. Монрэд, Х. С. Смит, Р. Ф. Райт, А. Лэноу, Д. Ф. Готье, Б. Дж. Рэнсил, В. Гроссман и Э. Бронвалд. "Выживание пациентов с тяжелой застойной сердечной недостаточностью отнеслось с устным milrinone". Журнал американского Колледжа Кардиологии. Издание 7, Номер 3, 1986, стр 661–670.

  2. Engin, M. "ECG разбил классификацию с помощью нейронечеткой сети". Буквы Распознавания образов. Издание 25, Номер 15, 2004, pp.1715-1722.

  3. Голдбергер А. Л., Л. А. Н. Амарал, L. Стекло, Дж. М. Гаусдорф, P. Ch. Иванов, Р. Г. Марк, Дж. Э. Митус, Г. Б. Муди, C.-K. Пенг и Х. Э. Стэнли. "PhysioBank, PhysioToolkit и PhysioNet: Компоненты Нового Ресурса Исследования для Комплексных Физиологических Сигналов". Циркуляция. Издание 101, Номер 23: e215–e220. [Циркуляция Электронные Страницы; http://circ.ahajournals.org/content/101/23/e215.full]; 2000 (13 июня). doi: 10.1161/01. CIR.101.23.e215.

  4. Leonarduzzi, R. F. Г. Шлоттоер и М. Э. Торрес. "Вейвлет основанный на лидере мультифрактальный анализ изменчивости сердечного ритма во время миокардиальной ишемии". В Разработке в Обществе Медицины и Биологии (EMBC), Ежегодной Международной конференции IEEE, 110–113. Буэнос-Айрес, Аргентина: IEEE, 2010.

  5. Литий, T. и М. Чжоу. "Классификация ECG с помощью пакета вейвлета энтропийные и случайные леса". Энтропия. Издание 18, Номер 8, 2016, p.285.

  6. Махарадж, E. A., и утра Алонсо. "Дискриминантный анализ многомерных временных рядов: Приложение к диагнозу на основе сигналов ECG". Вычислительная Статистика и Анализ данных. Издание 70, 2014, стр 67–87.

  7. Капризный, G. B. и Р. Г. Марк. "Влияние Базы данных Аритмии MIT-BIH". Разработка IEEE в Журнале Медицины и Биологии. Издание 20. Номер 3, мочь-июнь 2001, стр 45–50. (PMID: 11446209)

  8. Russakovsky, O., Цз. Дэн и Х. Су и др. "Крупный масштаб ImageNet Визуальная проблема Распознавания". Международный журнал Компьютерного зрения. Издание 115, Номер 3, 2015, стр 211–252.

  9. Чжао, Q. и Л. Чжан. "Выделение признаков ECG и классификация с помощью вейвлета преобразовывают и поддерживают векторные машины". На Международной конференции IEEE по вопросам Нейронных сетей и Мозга, 1089–1092. Пекин, Китай: IEEE, 2005.

  10. ImageNet. http://www.image-net.org

Поддерживание функций

helperCreateECGDataDirectories создает директорию данных в родительском каталоге, затем создает три подкаталога в директории данных. Подкаталоги называют в честь каждого класса сигнала ECG, найденного в ECGData.

function helperCreateECGDirectories(ECGData,parentFolder,dataFolder)
% This function is only intended to support the ECGAndDeepLearningExample.
% It may change or be removed in a future release.

rootFolder = parentFolder;
localFolder = dataFolder;
mkdir(fullfile(rootFolder,localFolder))

folderLabels = unique(ECGData.Labels);
for i = 1:numel(folderLabels)
    mkdir(fullfile(rootFolder,localFolder,char(folderLabels(i))));
end
end

helperPlotReps строит первую тысячу выборок представителя каждого класса сигнала ECG, найденного в ECGData.

function helperPlotReps(ECGData)
% This function is only intended to support the ECGAndDeepLearningExample.
% It may change or be removed in a future release.

folderLabels = unique(ECGData.Labels);

for k=1:3
    ecgType = folderLabels{k};
    ind = find(ismember(ECGData.Labels,ecgType));
    subplot(3,1,k)
    plot(ECGData.Data(ind(1),1:1000));
    grid on
    title(ecgType)
end
end

helperCreateRGBfromTF использует cwtfilterbank, чтобы получить непрерывное преобразование вейвлета ECG, сигнализирует и генерирует scalograms от коэффициентов вейвлета. Функция помощника изменяет размер scalograms и пишет им в диск как jpeg изображения.

function helperCreateRGBfromTF(ECGData,parentFolder,childFolder)
% This function is only intended to support the ECGAndDeepLearningExample.
% It may change or be removed in a future release.

imageRoot = fullfile(parentFolder,childFolder);

data = ECGData.Data;
labels = ECGData.Labels;

[~,signalLength] = size(data);

fb = cwtfilterbank('SignalLength',signalLength,'VoicesPerOctave',12);
r = size(data,1);

for ii = 1:r
    cfs = abs(fb.wt(data(ii,:)));
    im = ind2rgb(im2uint8(rescale(cfs)),jet(128));
    
    imgLoc = fullfile(imageRoot,char(labels(ii)));
    imFileName = strcat(char(labels(ii)),'_',num2str(ii),'.jpg');
    imwrite(imresize(im,[224 224]),fullfile(imgLoc,imFileName));
end
end