An open API service indexing awesome lists of open source software.

https://github.com/librauee/sd_ecg

山东赛第三届数据应用创新创业大赛-心电图智能事件识别-亚军方案
https://github.com/librauee/sd_ecg

Last synced: 4 months ago
JSON representation

山东赛第三届数据应用创新创业大赛-心电图智能事件识别-亚军方案

Awesome Lists containing this project

README

          

# 心电图智能事件识别 把杰泥牛逼打在公屏上-Writeup & Reproduce

* A榜第2、B榜第2

## 环境配置

* numpy==1.19.5
* pandas==1.1.5
* scipy==1.5.4
* scikit-learn==0.24.2
* torch==1.7.1+cu101
* tqdm==4.62.3
* iterative-stratification==0.1.7

## 数据预处理

### 方案1
* 考虑到数据存在不同长度的问题,以多数类长度16001为基准长度,这里采用长度不足16001在末尾补零,长度超过16001的末尾截断的处理。
* 另外考虑到读取csv速度慢,这里完成上述操作之后均转化为mat矩阵文件保存。

### 方案2
* 使用重采样统一将心电信号变为长度6666,并以字典形式保存所有数据,方便快速读取【减少dataset的IO, 以空间换时间】。

## 算法模型

### 模型一、se_resnet34(方案基线模型)

把经典的神经网络模型resnet34中的二维卷积修改为一维卷积,并添加注意力模块SE,使用该注意力机制有助于提取通道之间相关性,增强模型性能。

### 模型二、se_resnet34_plus(核心模型)

在模型一的基础上添加maxpooling层,将maxpooling层的输出与原网络平均池化的输出拼接,再经过全连接层输出最终结果,提取最大值特征有助于识别心电图的异常。

### 模型三、se_resnet34_plus2

在模型二的基础上,在模型输入处并行四个大小不同的卷积核,以获取不同感受野的心电图特征,然后将其通过1x1卷积缩减通道数,再将他们拼接起来输出到下一层,模型输出端采用和模型二同样的思路,添加maxpooling层,有助于识别心电图的异常。

### 模型四、se_resnet34_plus3(单模最高分模型)

在模型三的基础上,在模型输出处添加一个head包含两个全连接层和hardSwish激活函数。

## 训练方法

* 以评价指标f1-macro作为早停指标,训练得到总指标得分最高的单模型;
* 以每个类别的f1得分作为保存模型的依据,一次同时保存18个在每个类别中的最佳模型。

## 模型融合

* 多模型生成oof以及pred文件(我这里模型很多,把顺序迭代的部分模型都用于集成)
* 使用贝叶斯调参搜索模型权重,最终加权融合

## 后处理

* 根据oof进行阈值后处理(常规操作,百分位提升)
* 根据标签分析进行互斥后处理(千分位提升)

## 代码运行

* 安装上述环境
* 把ecg_data以及label_and_example两个文件夹放到当前路径
* 运行命令 sh infer.sh
* 生成提交文件sub_final.csv即为最终提交文件
* 【注】如需重新训练,请将命令中的所有train设置为1

## 运行要求

* 训练最多需要约40G内存,12G显存
* 推理最多需要约40G内存,4G显存