硕士课程可穿戴设备之第二次作业

news2025/1/17 9:04:21

虽然有三个例子,论文中展示的应该是第二个例子,但是找不到数据集,于是跑的第一个例子。


将该DNN模型应用于2017年生理信号挑战赛数据,跑通

配置环境

安装virtualenv

创建虚拟环境

  virtualenv -p python3.6 ecg_env 

激活虚拟环境

修改脚本

修改setup.sh 换清华园镜像,便于在虚拟环境中快速安装库

运行下载包库的脚本

保证训练集和验证集运行模型时的环境一致,这里使用tensorFlow.18。

下载数据集

论文实现的是数据集二,但是我无法找到数据集二。所以复现了他的第一个example。

从挑战赛官网AF Classification from a Short Single Lead ECG Recording: The PhysioNet/Computing in Cardiology Challenge 2017 v1.0.0,下载模型需要的数据集

执行训练代码前的准备工作

1.执行生成json的python代码,在cinc17文件夹下生成json

其中trian.join文件为该研究的训练集,des.join为验证集

2.然后在ecg文件夹下新建saved文件夹

3.根据报错修改相应代码(修改包的引用,和代码二进制的写入)

执行训练代码

解决所有因版本产生的问题,改变100epoch为25epoch(100轮太久,而且预计在25轮左右之后,对准确率的提升并不大),运行代码。

这里提前中断了,但并不是EarlyStoping自行停止,因为代码中给的patience是8,也就是8轮没有优化,才会停止。

 #train.py
 stopping = keras.callbacks.EarlyStopping(patience=8)

但是也能看出,接下来的训练,对正确率的影响已经很微小了,最后一轮的准确率有92%。

查看训练模型文件

模型验证

执行验证代码前的准备工作

1.\examples\cinc17\entry\prepare-entry.sh 修改脚本中的路径信息

2.\examples\cinc17\setup.sh 修改安装版本和安装来源

3.\examples\cinc17\entry\next.sh 修改 环境激活的语句和路径,保证可以持续验证

安装验证环境

运行setup.sh脚本

执行验证脚本

指定测试集中 表现最好的模型,生成文件夹,拷贝文件并开始执行文件,依次验证写入answer.txt。

sh prepare-entry.sh C:/Users/abc/saved/cinc17/1636036307-521/0.419-0.855-021-0.221-0.926.hdf5

集合级别的结果比较

准确率是0.92

论文阅读

摘要

ECG数据在临床诊断中很重要,但是在当时并没有一个端对端的深入学习的方法对数据进行进一步的拓展应用。于是团队用DNN神经网络,在 53,549 位病人数据上(12分类的 91,232 ECG数据)训练得到的模型,在各个分类的快速诊断F1的得分(要求训练模型在25s得出结果,论文中用到的一种评估模型好坏的指标)比专家还要高,要是应用在实际场景作为辅助,挺好。

内容

概念介绍

ECG

ECG每年产生的数据量也很大(神经网络缺的就是数据,这就有了与神经网络结合的可行性),对于诊断一些大病是很关键的,但是现在市面上的算法不太行。如果用算法把这么大批量的数据处理一下,那么新的ECG诊断标准一下就得到改善了,说不定还能用ECG诊断点其他的。

DNN

是由多个处理层组成的计算模型,每个层都能够学习越来越抽象的,与执行特定任务相关的输入数据的更高级别表示。DNN改善了各个领域的状况。DNN有着对那些没有怎么经过处理的、特征标注的数据(像ECG数据)识别有用特征的能力。进一步的,DNN在数据量越多,表现越好,这在ECG延年越来越多的趋势下,简直契合。

数据集

找专家标注。

评估表格

也点明了评估的方法,就是

  1. 一种是序列级别的,用模型在1.3s内预测的和专家的金标准做对比得到的评估结果。

  2. 一种是集合级别的,看整个集合的正确率对比。

各种疾病的评估结果,都挺好的。

应用

趋势

端对端的深度学习感觉是降维打击了,原本的ECG数据的利用要经过一些列操作(信号预处理,特征标记,信号处理之类的)最后去实现指定类型节律的识别分类。

端对端直接跳过这些,输入的就是原始数据,输出的就是诊断结果。(测一次便知道自己没得这种病 和 知道自己没得这些病)

和同行相比

虽然20年前,开始用DNN处理ECG相关数据了,但是碍于神经网络的层数和算力,不能大展拳脚。同行做的也都是一些对数据做处理然后得到特定类型识别的研究。

那作者团队的研究就是

  • 端对端的深度学习

  • 全新数据集

  • 可以直接使用不加处理原始数据(就只是指明了相应的标签)

发现

  • DNN训练出来的模型也会生成和最初和专家一样的错误,并且他们做出的错误都是“有据可依的”。

局限性

  • 输入的数据集都是单通道ECG信号,不是12-lead ECG信号,在那个数据集上好不好用不知道。

  • 可能会因为专家们的标注好坏影响数据集的好坏从而影响训练好坏,最后模型好坏。

  • 为了在数据集中获得足够多的稀有心律类别,我们在数据提取过程中将患有这些疾病的患者作为目标,所以测试集有偏向性,可能在这上面取得好成绩,在别的地方没这高分。

具体模型

架构

类似残差网络,网络的输入是时间序列的原始ECG数据,每1.28秒输出对应的label预测。34层网络,包含16个残差块,每块两个卷积层,再加一层全连接层和softmax。随机初始化权重,Adam优化,默认变量,初始学习率0.001, 验证集Loss不下降时*0.1,手动调学习率使得最快收敛。最后选择验证集上最低错误率的模型。

实验结果

数据集设置了两种类型的训练。

  1. 序列层级的 sequence是每256个输入样本(大约每1.3s)进行一次算法预测,并以相同的间隔与ground truth进行比较。

  2. 集合层级的 set是用30秒记录的结果进行比较。 sequence级别的度量有助于捕获心律失常的持续时间,例如记录中心律失常的发生和偏移,而set级别的度量只关注心律类别的存在。

结果图表

双边置信区间(AUC scores) 2值阈值

PR曲线

显示了三种典型类别中模型和专家的PR曲线,可以看到模型达到甚至超过了所有心律类别的心脏病专家平均水平。

敏感性特异性表

多类别 DNN的灵敏度超过了所有心律类别的平均心脏病专家的灵敏度。

混淆矩阵

表现出DNN预测结果和心脏病专家结果相似的模式。

结论

数据集大,端对端DNN,满足这两条可以尝试直接训练,无需多道预处理的原始数据。数据驱动

参考内容

论文阅读

自己的英语和科研水平不足以支撑自己读完整篇论文和抓住重点,于是从其他博主的论文笔记中来学习如何吃透一篇论文。

论文阅读笔记(4-1)---基于深度神经网络的动态心电图心律不齐检测与分类_打着灯笼摸黑的博客-CSDN博客

 ##研究贡献
 - 这项研究证明了端到端的DNN方法是可以用来提高ECG解释算法的准确性。
 - 近来的研究表明随着可用数据的增加,算法的性能也会提高。我们的研究保证为端到端深度学习方法提供足够大的数据集。
 - 这项研究为自动心电图诊断提供了一个新的模式。标准的自动心电图解释通常由信号预处理,特征提取,特征选择和分类及部分组成。而DNN可以接受原始ECG数据,并直接输出诊断概率。有了足够多的训练数据,以这种房室使用DNN就有可能以数据驱动的房室学习所有手工特征或者尚未识别的特征,从而改进预测性能。
 - 研究方法的独特之处在于,以端到端的方式使用34层网络来同时输出不同节奏诊断的概率。数据集比大多数数据集大出几个数据级,并且与其他DNN方法相比,没有对ECG数据进行实质性预处理。
 - 研究中得出的重要发现是,DNN似乎可以概括心脏病专家的错误分类,正如模型和心脏病专家在混淆矩阵中的相似性所证明的那样。手动检查不一致之处后发现,DNN的错误分类总体看来非常合理。

Cardiologist-Level Arrhythmia Detection with Convolutional Neural Networks2017_sunyao_123的博客-CSDN博客

 ##架构的总结
 为了能够训练,采用和残差网络相似的短链接。神经网络层与层之间的短连接,通过使信息在非常深的网络间很好传递,来优化训练。在数据输入网络之前,使用鲁棒性正则化策略进行正则化。网络包含16个残差模块,每个残差模块包括2个卷积层。所有的卷积层滤波器大小为16,个数为64k,k从1开始,每4个残差网络递增1。每个交替的残差网络对输入下采样一半,因此,原始的数据被下采样了2的8次方 。当一个残差网络下采样输入时,相对应的短路经也使用Max Pooling下采样它们的输入,采样因子相同。在每个卷积层之前都加了BN层,和一个修正线性单元,采用pre-activation block design。由于这个pre-activation block结构,网络的第一层和最后一层是特殊的。我们还在卷积层之间和非线性单元之后增加了Dropout。最后的全连接层和softmax激活对每个时间step产生14个类的分布。

Nature Medicine文章Cardiologist-level arrhythmia detection and classifcation细节记录_wendell 的博客-CSDN博客

什么是端到端的训练或学习?shuijinghua的博客-CSDN博客端到端训练

什么是召回率??井察的博客-CSDN博客召回率

代码复现

整体思路

#房颤 (qq.com) --出自微信公众号:杏林里的码农

通过搜索技能找到这篇文章,跟着一步一步走,可还是在作者没有提及到的地方翻车了。

  • 环境版本配置不一致,以至于最后无法验证

  • 项目路径问题,导致脚本运行失败

环境配置

虚拟机共享文件夹 VMware Tools安装Mr.zhou-CSDN博客安装vmtools

linux git clone相关问题 github 推送出现“git@github.com: Permission denied (publickey). fatal: 无法读取远程仓库。请确认您有正确的访问权限并且仓库存在。” 问题_fatal: 无法读取远程仓库。 请确认您有正确的访问权限并且仓库存在。-CSDN博客

conda 新建虚拟环境 Anaconda-用conda创建python虚拟环境 - 知乎 (zhihu.com)

自己尝试过用linux去复现这个项目,一方面由于操作不太熟练,另一方面找到了在Windows上成功复现的参考文档,于是此念头作罢。

大多问题在杏林里的码农的文章中可以得到解决,可还是有一些微小的bug,需要继续配置环境,如下

'str' object has no attribute ‘decode‘成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘_一个处女座的程序猿-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「网络编程」基于 UDP 协议实现回显服务器

🎇个人主页:Ice_Sugar_7 🎇所属专栏:计网 🎇欢迎点赞收藏加关注哦! 实现回显服务器 🍉socket api🍉回显服务器🍌实现🥝服务器🥝客户端 &#x1f3…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中,Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志,提取邮件的发送状态(成功、失败或退回)和…

【TB作品】msp430f5529单片机墨水屏,口袋板,tmp421温度,温控风扇

文章目录 一、扬声器模块介绍二、驱动介绍三、程序介绍四、全部代码下载 msp430f5529d单片机墨水屏,口袋板,tmp421温度,温控风扇 基本要求:高于20度开转,温度越高转速越快,高于40度风扇停转,温…

本轮牛市新趋势,跟随The First捕捉牛市Alpha

与以往牛市“百花齐放”的繁荣景象相比,本轮牛市颇具独特走势,呈现出了资金集中度高、财富聚集效应小的特点,绝大部分加密资产甚至跑不赢BTC的涨幅幅度。而以往大放色彩的公链币价值币的走势,甚至比不过牛尾才爆发的MEME币。这使得…

【动手学深度学习】卷积神经网络CNN的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 卷积神经网络 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 特征提取和模式识别:CNN 在计算机视觉领域被广泛用于提取图像…

【Hive SQL 每日一题】统计指定范围内的有效下单用户

文章目录 测试数据需求说明需求实现 前言:本题制作参考牛客网进阶题目 —— SQL128 未完成试卷数大于1的有效用户 测试数据 -- 创建用户表 DROP TABLE IF EXISTS users; CREATE TABLE users (user_id INT,name STRING,age INT,gender STRING,register_date STRING…

ESP32S3——多线程

一、环境: 平台:arduino IDE 或 VS Code PlatformIO 皆可。 我的是后者,具体为: 框架:VS PlatformIO Arduino 二、硬件准备: 一个esp32s3 本文用到的是U0RXD(GPIO44 )与U0TXD…

文件无法在当前环境下执行在 x86_64 系统上运行 ARM 可执行文件

目录 遇到的问题是由于"..."文件无法在当前环境下执行。这个错误通常是因为二进制文件的格式不兼容,可能是因为它是为不同的架构编译的。例如,如果二进制文件是为 x86 架构编译的,但你在 ARM 设备上尝试运行它,就会出现…

[数据集][目标检测]老鼠检测数据集VOC+YOLO格式4107张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4107 标注数量(xml文件个数):4107 标注数量(txt文件个数):4107 标注…

【LeetCode】每日一题 2024_6_4 将元素分配到两个数组中 II(二分、离散化、树状数组)

文章目录 LeetCode?启动!!!题目:将元素分配到两个数组中 II题目描述代码与解题思路 每天进步一点点 LeetCode?启动!!! 又有段时间没写每日一题的分享了,原本今…

【前端】响应式布局笔记——flex

二、Flex Flex(FlexiableBox:弹性盒子,用于弹性布局,配合rem处理尺寸的适配问题)。 1、flex-direction:子元素在父元素盒子中的排列方式。 父级元素添加:flex-direction: row; 父级元素添加:flex-direction: row-reverse; 父…

练习实践-linux启动耗时分析

练习实践-启动耗时整体概览,具体服务的启动细节 参考来源: B站up主林哥讲运维:一分钟学会:可视化查看系统启动时的性能 如何使用Linux命令查看系统的启动进程(linux查看启动进程) 解决ubuntu开机变慢&…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

C#-Switch判断分支语句

Switch判断分支语句 作用 : 让顺序执行的代码 产生分支 判断变量和常量相同时 才会执行 用法: Switch后面的变量值与case后面的常量相同时,case内的代码才会执行,如果都不满足则执行default内的代码 break的作用: 跳出 不会再执行判断 …

MCU 的最佳存储方案 CS 创世 SD NAND

MCU 的最佳存储方案 CS 创世 SD NAND 【SD NAND】大家都知道 MCU 是一种 “麻雀” 虽小,却 “五脏俱全” 的主控。 大家都知道 MCU 是一种 “麻雀” 虽小,却 “五脏俱全” 的主控。它的应用领域非常广泛,小到手机手表,大到航空航…

Python知识点14---被规定的资源

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…

Jupyter Notebook快速搭建

Jupyter Notebook why Jupyter Notebook Jupyter Notebook 是一个开源的 Web 应用程序,允许你创建和分享包含实时代码、方程、可视化和解释性文本的文档。其应用包括:数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等等。 Jupyter Notebo…

Vue02-搭建Vue的开发环境

一、Vue.js的安装 1-1、直接用 <script> 引入&#xff08;CDN&#xff09; 1、CDN的说明 2、Vue的版本说明 生产版本是开发版本的压缩。 3、Vue的引入 验证是否存在Vue函数&#xff1a; 4、搭建Vue的开发环境 ①、下载开发版本的Vue&#xff0c;并在代码中引入 ②、安…

连锁门面电能监测系统是什么?

1.什么叫连锁门面电能监测系统 连锁门面电能监测系统是一种前沿的能源管理体系系统&#xff0c;针对连锁加盟店铺的电力应用情况进行实时监控及管理。这类系统根据集成化硬件配置和软件系统&#xff0c;能够帮助企业管理人员获得每个门店的电力耗费数据信息&#xff0c;进而实…

免费,C++蓝桥杯等级考试真题--第10级(含答案解析和代码)

C蓝桥杯等级考试真题--第10级 答案&#xff1a;D 解析&#xff1a;数组是一种线性数据结构&#xff0c;其特点是数组中的元素在内存中占据一段连续的存储空间&#xff0c;每个元素通过索引&#xff08;下标&#xff09;访问&#xff0c;索引起始通常是0。 数组的长度在声明时…