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

Этот пример представляет итеративный основанный на глубоком обучении рабочий процесс, чтобы пометить сигналы с уменьшаемым человеческим усилием по маркировке.

Маркировка данных сигнала является утомительной и дорогой задачей, которая требует большого человеческого усилия. Находить способы уменьшать это усилие может значительно ускорить разработку решений для глубокого обучения для проблем обработки сигналов.

Рассмотрите задачу маркировки необходимых областей в наборе данных сигнала. Первый подход состоит из маркировки данных вручную. Этот подход требует большого количества времени и усилия. Альтернативный подход, исследуемый в этом примере, обрабатывает процесс маркировки итеративно. В каждой итерации подмножество сигналов выбрано из непомеченного набора данных и отправляется в предварительно обученную глубокую сеть для автоматизированной маркировки. Человеческая этикетировочная машина исследует получившиеся метки и корректирует неправильные метки. Подтвержденные помеченные сигналы добавляются к обучающему набору данных, чтобы переобучить глубокую сеть с расширенными обучающими данными.

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

Данные

Этот пример рассматривает маркировку областей сигнала ECG с помощью данных, общедоступных в Базе данных QT 1[] 2[]. Данные состоят примерно из 15 минут записей ECG от в общей сложности 105 пациентов. Чтобы получить каждую запись, ревизоры поместили два электрода в другие места на груди пациента, приводящей к двухканальному сигналу. База данных обеспечивает метки области сигнала, сгенерированные автоматизированной экспертной системой [3]. Метки соответствуют местоположениям волны P, T волна и области комплекса QRS в измерениях ECG. Этот пример выполняет процедуру, представленную в Сегментации Формы волны Используя Глубокое обучение, чтобы обучить двунаправленную длинную краткосрочную сеть (BiLSTM) памяти, которая может классифицировать выборки сигнала ECG как принадлежащий одной из этих трех необходимых областей.

Загрузите данные из Репозитория GitHub. Этот пример принимает, что вы поместили файл в свою временную директорию, местоположение которой задано tempdir MATLAB® команда. Разархивируйте файл данных и загрузите данные.

unzip(fullfile(tempdir,'QT_Database-master.zip'),tempdir)
load(fullfile(tempdir,'QT_Database-master','QTData.mat'))

Используйте displayWaveformLabels функция помощника, чтобы построить первые 1 000 выборок ECG сигнализирует от первого пациента с областями, помеченными экспертной системой, наложенной в различных цветах. Набор данных содержит дополнительную метку, and/A', который используется, чтобы идентифицировать выборки сигнала, которые не принадлежат ни одной из этих трех необходимых областей.

patientID = 1;
signalVals = getSignal(QTData,patientID);
labelVals = getLabelValues(QTData,patientID,'WaveformLabels_Chan1');

displayWaveformLabels(signalVals(1,1:1000),labelVals.Value(1:1000)) 

Используйте resizeSignals функция помощника, чтобы повредить сигналы ECG и векторы метки в системы координат, каждого из них 5 000 выборок долго. Функция затем переставляет системы координат и делит их на обучающий набор данных, содержащий 70% данных и набора тестовых данных, содержащего 30% данных.

rng default
[testFrames,testLabels,ecgFrames,ecgLabels,testInfo,ecgInfo] = resizeSignals(QTData,0.3);

ecgFrames содержит 6 543 системы координат и testFrames содержит 2 768 систем координат. Переменная ecgInfo хранит терпеливый ID, ID канала и демонстрационный индекс каждой системы координат обучающего набора данных. testInfo хранит ту же информацию для набора тестовых данных.

Преобразуйте системы координат ECG к частотному диапазону времени. Используйте featureExtraction функция помощника, чтобы вычислить synchrosqueezed преобразование Фурье ECG сигнализирует о системах координат по частотному диапазону интереса, [0.5, 40] Гц, и стандартизировать получившиеся преобразования путем вычитания среднего значения и деления на стандартное отклонение.

Fs = QTData.SampleRate;
testFrames = featureExtraction(testFrames,Fs);
ecgFrames = featureExtraction(ecgFrames,Fs);

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

  1. Сеть помечает подмножество непомеченных систем координат данных, использующих ранее помеченные системы координат.

  2. Человеческая этикетировочная машина корректирует любые ошибки маркировки вручную.

  3. Откорректированная маркировка добавляется к ранее помеченным системам координат.

  4. Расширенный набор помеченных сигналов используется, чтобы обучить сеть для следующей итерации.

Чтобы сделать количественные сравнения, симулируйте два сценария:

  • Для базового сценария, в котором человек помечает набор данных в целом с нуля, обучаются, сеть с помощью полного пометила ecgFrames набор.

  • Для второго сценария притворитесь что ecgFrames данные не помечены, и пометьте их с помощью итерационного метода.

Производительность предсказания Используя полностью пометила ECG Data Set

Создайте сеть BiLSTM и обучайтесь, она с полным пометила ecgFrames установите, чтобы получить верхнюю границу производительности предсказания. Как упомянуто выше, этот подход требует маркировки "в лоб" целого набора данных и следовательно самого большого человеческого усилия по маркировке. Обучите сеть с помеченным ecgFrames установите и вычислите точность предсказания на набор тестовых данных.

Сетевая архитектура

Создайте сеть BiLSTM с помощью слоев глубокого обучения.

  • Задайте sequenceInputLayer с размером как количество функций в FSST сигналов, который является общим количеством выборок частотного диапазона (40 в этом примере).

  • Задайте bilstmLayer с 200 скрытыми узлами и набором OutputMode к sequence поскольку каждая выборка сигнала имеет метку.

  • Задайте fullyConnectedLayer с выходным размером 4 соответствий этим четырем категориям, P волна, комплекс QRS, T волна и N/A.

  • Добавьте softmaxLayer и classificationLayer выводить предполагаемые метки.

% Training with the full emulated unlabeled data set
layers = [ ...
    sequenceInputLayer(size(ecgFrames{1},1))
    bilstmLayer(200,'OutputMode','sequence')
    fullyConnectedLayer(4)
    softmaxLayer
    classificationLayer];

Используйте traningOptions задавать решатель оптимизации и гиперпараметры, чтобы обучить сеть. Этот пример использует оптимизатор ADAM и мини-пакетный размер 50. Обучите сеть с помощью или центрального процессора или графического процессора. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения информации о других параметрах смотрите trainingOptions. Этот пример использует графический процессор в обучении с помощью 'ExecutionEnvironment'пара "имя-значение".

options = trainingOptions('adam', ...
    'MaxEpochs',10, ...
    'MiniBatchSize',50, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch',...
    'Plots','training-progress',...
    'Verbose',0);

Обучите сеть с, полностью пометил ecgFrames набор данных.

baselineNet = trainNetwork(ecgFrames,ecgLabels,layers,options);

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

predictLabelsAll = classify(baselineNet,testFrames,'MiniBatchSize',50);
accuracyAll = mean(cellfun(@(x,y)mean(x==y),predictLabelsAll,testLabels));
fprintf('The baseline prediction accuracy is %2.1f.\n',accuracyAll*100);
The baseline prediction accuracy is 94.2.

Итеративная маркировка человеком в цикле

Чтобы уменьшать усилие по маркировке, попробуйте итерационный подход: Притворитесь что ecgFrames набор данных первоначально не помечен и что данные помечены вручную. В действительности пример использует метки основной истины, обеспеченные по условию набор.

Обучите начальную сеть

Запустите путем выбора 25 систем координат из ecgFrames установите и маркировка их вручную. Обучите сеть BiLSTM с этой начальной буквой помеченный набор, чтобы служить начальным шагом итеративного процесса.

numInitFrames = 25;

currentTrainingSet = ecgFrames(1:numInitFrames,1);
currentTrainingLabels = ecgLabels(1:numInitFrames);

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

options = trainingOptions('adam', ...
    'MaxEpochs',20, ...
    'MiniBatchSize',5, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch', ...
    'Plots','none',...
    'Verbose',0);

Обучите сеть BiLSTM с набором данных начальной подготовки и предскажите, что метки с помощью того же набора тестовых данных раньше устанавливали базовую линию производительности. Точность предсказания сетей меньше приблизительно 80%.

initNet = trainNetwork(currentTrainingSet,currentTrainingLabels,layers,options);
initPrediction = classify(initNet,testFrames,'MiniBatchSize',50); 
initAccuracy = mean(cellfun(@(x,y)mean(x==y),initPrediction,testLabels));
fprintf('The prediction accuracy is %2.1f.\n',initAccuracy*100);
The prediction accuracy is 78.3.

Маркировка

На следующем шаге выберите 200 новых систем координат данных из ecgFrames установите и накормите ими предварительно обученную сеть, initNet, пометить сигналы автоматически.

iteration = 1;
% Number of frames to label at each iteration
numFrames = 200; 
% Select the next set of frames to label
indexNext = numInitFrames+1:numInitFrames+numFrames;
currentPrediction = classify(initNet,ecgFrames(indexNext),'MiniBatchSize',50);

Оцените результаты маркировки, сгенерированные сетью, и сравните их с основной истиной. Используйте третью из выбранных систем координат с 200 выборочными данными как пример: Постройте его первые 750 выборок, наложенных с метками основной истины и метками, предсказанными сетью.

idx = 3;
info = ecgInfo{indexNext(idx)};
signal = QTData.Source{info.patientID}(info.channelID,info.indexID);
groundTruthLabels = ecgLabels{indexNext(idx)};
predictedLabels = currentPrediction{idx};

subplot(2,1,1)
displayWaveformLabels(signal,groundTruthLabels)
xlim([1 750])
title('Ground Truth')

subplot(2,1,2)
displayWaveformLabels(signal,predictedLabels)
xlim([1 750])
title('Labeling by Network')

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

Однако существуют случаи, когда производительность маркировки сети не так сильна. Считайте результаты полученными с шестой из выбранных систем координат с 200 выборочными данными.

idx = 6;
info = ecgInfo{indexNext(idx)};
signal = QTData.Source{info.patientID}(info.channelID,info.indexID);
groundTruthLabels = ecgLabels{indexNext(idx)};
predictedLabels = currentPrediction{idx};

figure
subplot(2,1,1)
displayWaveformLabels(signal,groundTruthLabels)
xlim([1 750])
title('Ground Truth')

subplot(2,1,2)
displayWaveformLabels(signal,predictedLabels)
xlim([1 750])
title('Labeling by Network')

Производительность сети на этом сигнале не так хороша. Чтобы смотреть результаты, человеческая этикетировочная машина должна сделать несколько коррекций к предсказанным меткам.

Чтобы определить количество усилия по коррекции для 200 систем координат данных, вычислите коэффициент ошибок маркировки сети и среднее количество выборок на систему координат, которая должна быть откорректирована человеческой этикетировочной машиной.

numSamplesPerFrame = 5000;
networkLabelingErrorRate(iteration) = 1-mean(cellfun(@(x,y)mean(x==y),currentPrediction,ecgLabels(indexNext)));
averageNumOfCorrectionsPerFrame(iteration) = networkLabelingErrorRate(iteration) * numSamplesPerFrame;
fprintf('The average number of corrections per frame is %2.1f.\n',averageNumOfCorrectionsPerFrame(iteration));
The average number of corrections per frame is 1077.4.

Для первой итерации существует в среднем приблизительно 1 000 выборок на систему координат, которая должна быть откорректирована человеком.

В конце первой итерации человеческая воля смотрит 200 систем координат и изменяет любую метку с неправильными значениями. С помощью сети и человеческой этикетировочной машины, системы координат данных имеют правильные метки в конце итерации.

На следующей итерации 200 недавно помеченных систем координат могут быть добавлены к currentTrainingSet установите, чтобы переобучить сеть и повторить итерацию маркировки. Этот график иллюстрирует рабочий процесс в каждой итерации после первой итерации:

Повторите итерации маркировки

Расширьте набор обучающих данных путем добавления недавно откорректированных систем координат labled, выберите еще 200 систем координат данных, которые будут помечены и повторите итерацию маркировки, пока производительность не будет удовлетворительной.

% Include the initial training set and the 200 newly labeled data frames
maxIter = 15;
indexTraining = 1:numInitFrames+numFrames;

networkAccuracy = zeros(1,15);
networkAccuracy(iteration) = initAccuracy;

options = trainingOptions('adam', ...
    'MaxEpochs',20, ...
    'MiniBatchSize',50, ...
    'ExecutionEnvironment','gpu', ...
    'InitialLearnRate',0.01, ...
    'LearnRateDropPeriod',6, ...
    'LearnRateSchedule','piecewise', ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch', ...
    'Plots','none', ...
    'Verbose',0);

for iteration = 2:maxIter
    % Extended training data set
    currentTrainingSet = ecgFrames(indexTraining,1);    
    % Emulate human correction by assigning ground-truth labels to the
    % extended training set
    currentTrainingLabels = ecgLabels(indexTraining);

    % Train network with extended training set
    currentNet = trainNetwork(currentTrainingSet,currentTrainingLabels,layers,options);
    
    % Predict labels for the test data set and calculate the accuracy to
    % compare to baseline performance
    currentTestSetPrediction = classify(currentNet,testFrames,'MiniBatchSize',50);
    networkAccuracy(iteration) = mean(cellfun(@(x,y)mean(x==y),currentTestSetPrediction,testLabels));
    
    % Get another numFrames data frames for human labeler
    indexNext = indexTraining(end)+1:indexTraining(end)+numFrames;
    
    % Measure average number of human corrections per frame in this iteration
    currentPrediction = classify(currentNet,ecgFrames(indexNext),'MiniBatchSize',50);
    networkLabelingErrorRate(iteration) = 1-mean(cellfun(@(x,y)mean(x==y),currentPrediction,ecgLabels(indexNext)));
    averageNumOfCorrectionsPerFrame(iteration) = networkLabelingErrorRate(iteration) * numSamplesPerFrame;
    
    indexTraining = 1:indexNext(end);
end

Маркировка производительности

После 15 итераций маркировки в currentTrainingSet существует 2 825 систем координат данных, соответствие приблизительно половине 6 543 систем координат данных содержится в полном ecgDataset набор. Точность предсказания сети, обученной с 2 825 системами координат, только приблизительно на 1% ниже, чем базовая точность.

accuDiff = accuracyAll-networkAccuracy(end);
fprintf('The accuracy difference is %2.1f%%.\n',accuDiff*100);
The accuracy difference is 0.8%.

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

figure
examinedDataSize = 25:200:2825;
plot(examinedDataSize,networkAccuracy,'*-')
hold on
% Prediction accuracy upper bound
plot(examinedDataSize,ones(1,15)*accuracyAll,'r--')
grid on
xlabel('Training set size')
title('Accuracy for the test data set')
xlim([25 2825])
legend('Labeling Network','Upper Bound','Location','southeast')

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

figure
plot(examinedDataSize,averageNumOfCorrectionsPerFrame,'*-')
grid on
xlabel('Training set size')
title('Average number of human corrections per frame')
xlim([25 2825])

Во всех 15 итерациях маркировки в среднем приблизительно 500 выборок сигнала на систему координат потребовали человеческих коррекций.

fprintf('The average number of corrections per frame is %2.1f.\n',mean(averageNumOfCorrectionsPerFrame));
The average number of corrections per frame is 465.7.

Заключение

Этот пример показал, что маркировка только половины набора данных ECG позволяет глубокой сети достигать точности предсказания, похожей на достигнутый той же сетью, когда обучено с полностью набор маркированных данных. С предложенным итеративным рабочим процессом маркировки человеческая этикетировочная машина должна посмотреть только на половину набора данных и откорректировать в среднем 500 выборок сигнала на систему координат. С другой стороны, маркировка "в лоб" требует рассмотрения каждой системы координат в наборе данных и маркировке всех ее выборок с нуля.

Ссылки

[1] Голдбергер, Ари Л., Луис А. Н. Амараль, Леон Гласс, Джеффри М. Гаусдорф, Plamen Ch. Иванов, Роджер Г. Марк, Джозеф Э. Митус, Джордж Б. Муди, Чанг-Канг Пенг и Х. Юджин Стэнли. "PhysioBank, PhysioToolkit и PhysioNet: Компоненты Нового Ресурса Исследования для Комплексных Физиологических Сигналов". Циркуляция. Издание 101, Номер 23, 2000, стр e215–e220. [Циркуляция Электронные Страницы; http://circ.ahajournals.org/content/101/23/e215.full].

[2] Laguna, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. "База данных для Оценки Алгоритмов для Измерения QT и Других Интервалов Формы волны в ECG". Компьютеры в Кардиологии. Vol.24, 1997, стр 673–676.

[3] Laguna, Пабло, Рэймон Джейне и Пере Каминаль. "Автоматическое обнаружение контуров волны в мультиведущих сигналах ECG: Валидация с базой данных CSE". Компьютеры и Биомедицинское Исследование. Издание 27, Номер 1, 1994, стр 45–60.