- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
具体的软硬件实现点击 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低成本方案的文章就讲到这里了,如果你想了解更多关于使用小波分析和深度学习对心电图(ECG)进行分类mcu-ai低成本方案mcu-ai低成本方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!