Využití LSTM sítí ke klasifikaci signálů

V dokumentaci k Signal Processing Toolboxu naleznete pěkný příklad na využití Deep Learningu ke klasifikaci signálů. Konkrétně se využívá LSTM neuronových sítí ke klasifikaci ECG dat ze soutěže Physionet 2017 Challenge.

Přejít na příklad

V uvedeném příkladu se ukazuje, že trénování LSTM sítí přímo na hrubých signálových datech může být dosti neefektivní. Trénování trvá dlouho a přesnost natrénované sítě je velice nízká.

Extrakce významných rysů ze signálů před samotným trénováním sítě může výrazně urychlit proces trénování. Síť natrénovaná na extrahovaných signálech v uvedeném příkladu je velice přesná na trénovacích i testovacích datech. Pro extrakci rysů jsou využity sofistikované algoritmy z oblasti zpracování signálu:

Data

Data uložená v ZIP archivu pod názvem „training2017.zip“ naleznete ke stažení zde:

https://physionet.org/challenge/2017/

Po rozbalení dat do Current Folderu můžete potřebná data načíst do Workspace pomocí následujícího kódu.

Kód pro načtení dat

Vytvoříme datastore, který bude odkazovat na všechny MAT soubory ve složce „training2017“.

fds = fileDatastore('training2017', 'ReadFcn', @load, 'FileExtensions', '.mat');

Načteme všechna data z MAT souborů do MATLAB Workspace – to jsou všechny ECG signály.

Signals = readall(fds);

Proměnná „Signals“ je typu cell array. V každé její buňce je uložená struktura obsahující dvě položky. Nás zajímá pouze hodnota položky „val“. Pomocí funkce „cellfun“ nahradíme v každé buňce strukturu hodnotou položky „val“.

fun = @(x) x.val;
Signals = cellfun(fun,Signals,'UniformOutput',false);

Načteme ozančení jednotlivých signálů ze souboru „REFERENCE.csv“ a převedeme je na kategoriální proměnnou.

labels = readtable('training2017/REFERENCE.csv','ReadVariableNames', false);
Labels = categorical(labels{:,2});

Zbavíme se přebytečných proměnných a následně i přebytečných dat v proměnných „Signals“ a „Labels“. Zajímají nás pouze třídy Normal (N) a AFib (A). Zbavíme se tedy signálů a označení přináležících třídám Other Rhythm (O) a Noisy Recording (~).

clearvars -except Signals Labels

Signals( Labels == 'O' | Labels == '~') = [];
Labels( Labels == 'O' | Labels == '~') = [];

Labels = removecats(Labels);

Příklad

Nyní máme ve Workspace dvě proměnné:

Zbytek příkladu naleznete v dokumentaci.

Potřebné produkty

Ve výše odkazovaném příkladu jsou využity následující produkty:

Pokud některé z uvedených produktů nemáte k dispozici, můžete si od nás vyžádat zkušební licenci pro jejich otestování.

Zkušební verze

Jan Studnička (HUMUSOFT), 10.8.2018