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.
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 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.
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);
Nyní máme ve Workspace dvě proměnné:
Zbytek příkladu naleznete v dokumentaci.
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í.
Jan Studnička (HUMUSOFT), 10.8.2018