使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能
此示例说明如何使用连续小波变换 (CWT) 和深度卷积神经网络 (CNN) 对人体心电图 (ECG) 信号进行分类。
从头开始训练深度 CNN 的计算成本很高,并且需要大量的训练数据。在很多应用中,并没有足够数量的训练数据可用,并且人工新建符合实际情况的训练数据也不可行。在这些情况下,利用已基于大型数据集训练的现有神经网络来完成概念相似的任务是可取的。这种对现有神经网络的利用称为迁移学习。在本示例中,采用预训练深度神经网络GoogLeNet(GoogLeNet针对图像识别进行过预训练).
GoogLeNet 是深度 CNN,最初是用于将图像分类至 1000 个类别。我们可重用 CNN 的网络架构,以基于时间序列数据的 CWT 图像对 ECG 信号进行分类。本示例中使用的数据可从 PhysioNet 公开获取。
在本示例中,使用从三组人获得的 ECG 数据:心律失常者 (ARR)、充血性心力衰竭者 (CHF) 和正常窦性心律者 (NSR)。总共使用来自三个 PhysioNet 数据库的 162 份 ECG 录音:MIT-BIH Arrhythmia 数据库 [3][7]、MIT-BIH Normal Sinus Rhythm 数据库 [3] 和 BIDMC Congestive Heart Failure 数据库 [1][3]。更具体地说,使用了心律失常者的 96 份录音、充血性心力衰竭者的 30 份录音和正常窦性心率者的 36 份录音。目标是训练一个分类器来区分 ARR、CHF 和 NSR。实例为MATLAB语言。
从 GitHub 仓库下载数据,将文件解压缩到临时目录中。
unzip(fullfile(tempdir,"physionet_ECG_data-main.zip"),tempdir)
解压缩会在您的临时目录中创建文件夹 physionet-ECG_data-main。此文件夹包含文本文件README.md和ECGData.zip。ECGData.zip文件包含ECGData.mat Modified_physionet_data.txt License.txt
ECGData.mat保存本示例中使用的数据,文本文件Modified_physionet_data.txt提供数据的来源说明以及对应用于每份 ECG 录音的预处理步骤的说明。解压缩 physionet-ECG_data-main 中的 ECGData.zip。将数据文件加载到您的 MATLAB 工作区中。
unzip(fullfile(tempdir,"physionet_ECG_data-main","ECGData.zip"), ...
fullfile(tempdir,"physionet_ECG_data-main"))
load(fullfile(tempdir,"physionet_ECG_data-main","ECGData.mat"))
ECGData 是包含两个字段的结构体数组:Data 和 Labels,标签分别为:'ARR'、'CHF' 和 'NSR'。
绘制每个 ECG 类别的表示图。
在创建文件夹后,创建 ECG 信号的时频表示。这些表示称为尺度图。尺度图是信号的 CWT 系数的绝对值。要创建尺度图,请预先计算一个 CWT 滤波器组。当要使用相同的参数获取众多信号的 CWT 时,建议预先计算 CWT 滤波器组。我们先尝试生成一个尺度图。使用 cwtfilterbank (Wavelet Toolbox) 为具有 1000 个采样的信号创建一个 CWT 滤波器组。使用滤波器组获取信号的前 1000 个采样的 CWT,并基于系数获得尺度图。
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)")
将尺度图转化为 RGB 图像,并将其写入 dataDir 中的适当子目录。每个 RGB 图像是大小为 224×224×3 的数组。
将图像随机分成两组,一组用于训练,另一组用于验证。使用 80% 的图像进行训练,其余的用于验证。
加载预训练的 GoogLeNet 神经网络,绘制结构图。
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")
网络架构中的每层都可以视为一个滤波器。较浅的层识别图像的更常见特征,如斑点、边缘和颜色。后续层侧重于更具体的特征,以便区分类别。GoogLeNet 经训练可将图像分类至 1000 个目标类别。对于我们的 ECG 分类问题,必须重新训练 GoogLeNet。
检查网络的最后五层。
lgraph.Layers(end-4:end)
ans =
5×1 Layer array with layers:
1 'pool5-7x7_s1' 2-D Global Average Pooling 2-D global average pooling
2 'pool5-drop_7x7_s1' Dropout 40% dropout
3 'loss3-classifier' Fully Connected 1000 fully connected layer
4 'prob' Softmax softmax
5 'output' Classification Output crossentropyex with 'tench' and 999 other classes
为防止过拟合,使用了丢弃层。丢弃层以给定的概率将输入元素随机设置为零。默认概率为 0.5。将网络中的最终丢弃层 pool5-drop_7x7_s1 替换为概率为 0.6 的丢弃层。
newDropoutLayer = dropoutLayer(0.6,"Name","new_Dropout");
lgraph = replaceLayer(lgraph,"pool5-drop_7x7_s1",newDropoutLayer);
网络的卷积层会提取最后一个可学习层和最终分类层用来对输入图像进行分类的图像特征。GoogLeNet 中的 loss3-classifier
和 output 这两个层包含有关如何将网络提取的特征合并为类概率、损失值和预测标签的信息。要重新训练 GoogLeNet 以对 RGB 图像
进行分类,请将这两个层替换为适合数据的新层。将全连接层 loss3-classifier 替换为新的全连接层,其中滤波器的数量等于类的
数量。要使新层中的学习速度快于迁移的层,请增大全连接层的学习率因子。
numClasses = numel(categories(imgsTrain.Labels));
newConnectedLayer = fullyConnectedLayer(numClasses,"Name","new_fc", ...
"WeightLearnRateFactor",5,"BiasLearnRateFactor",5);
lgraph = replaceLayer(lgraph,"loss3-classifier",newConnectedLayer);
分类层指定网络的输出类。将分类层替换为没有类标签的新分类层。trainNetwork 会在训练时自动设置层的输出类。
newClassLayer = classificationLayer("Name","new_classoutput");
lgraph = replaceLayer(lgraph,"output",newClassLayer);
训练神经网络是一个使损失函数最小的迭代过程。要使损失函数最小,使用梯度下降算法。在每次迭代中,会评估损失函数的梯度
并更新下降算法权重。
options = trainingOptions("sgdm", ...
MiniBatchSize=15, ...
MaxEpochs=20, ...
InitialLearnRate=1e-4, ...
ValidationData=imgsValidation, ...
ValidationFrequency=10, ...
Verbose=1, ...
Plots="training-progress");
使用验证数据评估网络。
[YPred,~] = classify(trainedGN,imgsValidation);
accuracy = mean(YPred==imgsValidation.Labels);
disp("GoogLeNet Accuracy: "+num2str(100*accuracy)+"%")
GoogLeNet Accuracy: 93.75%
使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案的更多相关文章
- [AI开发]将深度学习技术应用到实际项目
本文介绍如何将基于深度学习的目标检测算法应用到具体的项目开发中,体现深度学习技术在实际生产中的价值,算是AI算法的一个落地实现.本文算法部分可以参见前面几篇博客: [AI开发]Python+Tenso ...
- 一张图看懂AI、机器学习和深度学习的区别
AI(人工智能)是未来,是科幻小说,是我们日常生活的一部分.所有论断都是正确的,只是要看你所谈到的AI到底是什么. 例如,当谷歌DeepMind开发的AlphaGo程序打败韩国职业围棋高手Lee Se ...
- 02基于python玩转人工智能最火框架之TensorFlow人工智能&深度学习介绍
人工智能之父麦卡锡给出的定义 构建智能机器,特别是智能计算机程序的科学和工程. 人工智能是一种让计算机程序能够"智能地"思考的方式 思考的模式类似于人类. 什么是智能? 智能的英语 ...
- 5700刀打造3卡1080Ti深度学习机器【转】
本文转载自:https://www.jianshu.com/p/ca2e003bf77e 5700美刀,打造3x1080Ti实验室GPU深度学习机器 最近为公司搭建了一台实验用的深度学习主机,在网 ...
- 人工智能热门图书(深度学习、TensorFlow)免费送!
欢迎访问网易云社区,了解更多网易技术产品运营经验. 这个双十一,人工智能市场火爆,从智能音箱到智能分拣机器人,人工智能已逐渐渗透到我们的生活的方方面面.网易云社区联合博文视点为大家带来人工智能热门图书 ...
- 基于深度学习的安卓恶意应用检测----------android manfest.xml + run time opcode, use 深度置信网络(DBN)
基于深度学习的安卓恶意应用检测 from:http://www.xml-data.org/JSJYY/2017-6-1650.htm 苏志达, 祝跃飞, 刘龙 摘要: 针对传统安卓恶意程序检测 ...
- 【PyTorch】深度学习与PyTorch资料链接整理
欢迎来到我的博客! 以下链接均是日常学习,偶然得之,并加以收集整理,感兴趣的朋友可以多多访问和学习.如果以下内容对你有所帮助,不妨转载和分享.(Update on 5,November,2019) 1 ...
- 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射
机器学习降维方法概括 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...
- 【转】用深度学习做crowd density estimation
本博文主要是CVPR2016的<Single-Image Crowd Counting via Multi-Column Convolutional Neural Network>这篇文章 ...
- 【深度学习Deep Learning】资料大全
最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books by Yoshua Bengio, Ian Goodfellow and Aaron C ...
随机推荐
- KingbaseES V8R3 集群运维案例--sys_rewind恢复备库节点
案例说明: 在KingbaseES V8R3集群执行failover切换后,原主库被人为误(未配置recovery.conf)启动:或者人为promote备库为主库后.需要将操作节点再重新加入集群 ...
- 8分钟搞懂Java中的各种锁
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/f9fc66cb.html 前言 你好,我是测试蔡坨坨. 在前几篇Redis相关文章中都说到了锁,同时我们在参加设计评审或者c ...
- Zotero 插件:DOI Manager 使用
一.项目信息与下载安装 https://github.com/bwiernik/zotero-shortdoi 根据readme,下载并安装即可.可能访问会失败,多试几次,总是能够成功的. 本博客编写 ...
- #排列组合,背包#CF232B Table
题目 有一个 \(n\times m\) 的矩阵,求使得每个 \(n\times n\) 的矩阵中都有正好 \(k\) 个点的方案数. 分析 考虑到如果确定了前 \(n\) 列的选点个数,那么对于一列 ...
- #dp#C 公共子序列
题目 给定两个字符串\(s1,s2\),求它们的\(LCS\) 满足\(|s1|\leq 10^6,|s2|\leq 10^3\) 分析 考场写了\(O(|s1|*|s2|)\)成功TLE, 考虑突破 ...
- #后缀数组,单调队列#洛谷 2852 [USACO06DEC]Milk Patterns G
题目 给定一个长度为\(n\)的字符串,求出现至少\(k\)次的最长子串长度 分析 由于后缀排序后的LCP才是最长的,既然要求至少\(k\)次, 实际上也就是维护长度为\(k\)的height数组最小 ...
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
目录 简介 Spring基础 Core核心技术 Testing测试 Data Access Web Servlet Web Reactive 总结 简介 是什么让java世界变得更好,程序员变得更友爱 ...
- C++ 面试必备:常见 C++ 面试题汇总及详细解析
C++作为一门重要的编程语言,其在面试中常常是热门的考察对象.本文将会介绍一些常见的C++面试题,帮助C++面试者避免很多不必要的困惑和迷惑.每个问题都有相对应的答案,以便各位同学快速查阅. C++和 ...
- Windows下Net6开源akstream项目vs2022调试GB28181协议对接摄像头全流程
一.背景介绍 笔者经历多个项目对接摄像头需求,不同项目具体要求又有所不同,碰到的摄像头对接开发问题,整理记录.此篇主要用于记录备用及给有缘人提供解决思路等. 1. 同一局域网对接(海康摄像头),如 ...
- js推送网页到扩展屏上
需求: 电脑上有两个屏幕,想在主屏上的网页中点击一个按钮,副屏就可以显示需要推送过去的网页 实现方法: 本方法使用的是js来实现的,亲测可行,支持火狐,但是不支持谷歌 demo: 主屏网页:1.htm ...