UCI-HAR数据集深度剖析:训练仿真与可视化解读

news2024/11/26 2:29:41

在本篇文章中,我们将深入探讨如何使用Python对UCI人类活动识别(HAR)数据集进行分割和预处理,以及运用模型网络CNN对数据集进行训练仿真和可视化解读。

一、UCI-HAR数据集分析及介绍

UCI-HAR数据集是一个公开的数据集,旨在通过智能手机传感器数据进行人类活动识别。这个数据集由30名志愿者在进行日常生活活动时携带带有嵌入式惯性传感器的腰部智能手机生成。数据集中的活动包括行走、上楼梯、下楼梯、坐着、站立和躺着等六种基本活动。

UCI-HAR数据集提供了原始的采样数据和经过预处理的数据。原始数据包括加速度计和陀螺仪的三轴数据,而预处理后的数据则包括时域和频域的特征向量。数据集中的每个样本都包含了丰富的特征信息,如加速度和角速度数据,以及从这些数据中提取的561种特征向量。

执行的六项活动如下:

Walking;Walking Upstairs;Walking Downstairs;Sitting;Standing;Laying

二、UCI-HAR数据集分割及处理

1.环境设置

在正式开始实验前,我们需要确保Python环境中安装了以下库:

  • numpy:用于高效的数值计算。
  • pandas:用于数据分析和处理。
  • ossys:Python标准库,用于操作系统级别的操作。

2.数据集下载

首先,我们需要下载UCI-HAR数据集,通过设定一个单独的 download_dataset 函数完成,下载数据集并将其保存到指定的目录,这是下载链接:https://archive.ics.uci.edu/static/public/240/human+activity+recognition+using+smartphones.zip

download_dataset(
    dataset_name='UCI-HAR',
    file_url='https://archive.ics.uci.edu/static/public/240/human+activity+recognition+using+smartphones.zip', 
    dataset_dir=dataset_dir
)

3.数据预处理

3.1读取数据

预处理的第一步是将文本格式的数据转换为numpy数组,通过自定义的 xloadyload 函数完成。

def xload(X_path):
    # 遍历每个信号类别的文件路径
    x = []
    for each in X_path:
        # 打开文件,读取每一行,分割字符串并转换为浮点数数组
        with open(each, 'r') as f:
            x.append(np.array([eachline.replace('  ', ' ').strip().split(' ') for eachline in f], dtype=np.float32))
    # 转置数组以匹配预期的形状
    x = np.transpose(x, (1, 2, 0))
    return x

xload 函数接收一组文本文件路径,逐行读取数据,去除空白字符,分割字符串,并将每个信号的数据转换为浮点数格式。然后,它通过转置操作调整数据的形状以匹配后续处理的需要。

3.2标签处理

yload 函数用于读取标签数据,并将它们转换为从0开始的整数数组。

def yload(Y_path):
    # 使用pandas读取CSV文件,转换为numpy数组,并重塑为一维数组
    y = pd.read_csv(Y_path, header=None).to_numpy().reshape(-1)
    # 将标签转换为从0开始的整数
    return y - 1

4.数据分割

UCI-HAR数据集已经预先分割为训练集和测试集。在本次的实验中,我们定义了训练集和测试集的文件路径,并使用 xloadyload 函数加载数据。

X_train_path = [dataset + '/train/Inertial Signals/' + signal + 'train.txt' for signal in signal_class]
X_test_path = [dataset + '/test/Inertial Signals/' + signal + 'test.txt' for signal in signal_class]
Y_train_path = dataset + '/train/y_train.txt'
Y_test_path = dataset + '/test/y_test.txt'

X_train = xload(X_train_path)
X_test = xload(X_test_path)
Y_train = yload(Y_train_path)
Y_test = yload(Y_test_path)

5.数据保存

预处理后需要将数据保存起来,供下面的训练仿真与可视化使用。这里,我们使用 save_npy_data 函数将数据保存为 .npy 文件。

if SAVE_PATH: # 如果提供了保存路径
    save_npy_data(
        dataset_name='UCI_HAR',
        root_dir=SAVE_PATH,
        xtrain=X_train,
        xtest=X_test,
        ytrain=Y_train,
        ytest=Y_test
    )

6.结果展示

最后,输出=出训练集和测试集的形状,以确认数据加载和预处理是否正确。

print('xtrain shape: %s\nxtest shape: %s\nytrain shape: %s\nytest shape: %s' % (X_train.shape, X_test.shape, Y_train.shape, Y_test.shape))

输出结果:
image.png

输出结果给出了每个集合的维度信息, X_train.shape 输出 (7352, 128, 9),表示训练集有7352个样本,每个样本有128个时间步长的数据,每个时间步包含9个特征(对应于信号类别)。

通过上述步骤,我们完成了UCI-HAR数据集的下载、预处理、分割和保存。这些步骤为下面的训练仿真与可视化使用任务奠定了基础。预处理后的数据可以直接用于训练模型,而不需要从头开始处理原始数据集。

三、CNN网络训练UCI-HAR数据集

CNN网络我们在之前的文章中已经很详细的介绍了,这里并不做过多的解读。

1.环境设置

确保你的环境中安装了以下Python库:

  • torch:PyTorch深度学习框架。
  • numpy:用于高效的数值计算。
  • sklearn:用于模型评估。
  • argparse:用于解析命令行参数。

2.参数解析

首先,我们使用 argparse 库来定义和解析命令行参数,这包括数据集、模型、保存路径、批次大小、训练轮数和学习率等。

def parse_args():
    # ... 省略部分代码 ...
    args = parser.parse_args()
    return args

3.主执行流程

在主执行流程中,我们首先定义了数据集和模型的字典,选择想要训练的网络模型。

if __name__ == '__main__':
    # ... 省略部分代码 ...
    args = parse_args()
    # ... 省略部分代码 ...

4.数据集加载与预处理

加载数据集,并将其转换为PyTorch需要的张量格式:

X_train = torch.from_numpy(train_data).float().unsqueeze(1)
X_test = torch.from_numpy(test_data).float().unsqueeze(1)
Y_train = torch.from_numpy(train_label).long()
Y_test = torch.from_numpy(test_label).long()

5.模型构建

构建相应的CNN模型,并将其发送到合适的设备(GPU或CPU)。

net = model_dict[args.model](X_train.shape, category).to(device)

6.训练与评估

接下来,我们定义了优化器、学习率调度器、损失函数,并使用混合精度训练来提高训练效率。

optimizer = torch.optim.AdamW(net.parameters(), lr=LR, weight_decay=0.001)
lr_sch = torch.optim.lr_scheduler.StepLR(optimizer, EP // 3, 0.5)
loss_fn = nn.CrossEntropyLoss()
scaler = GradScaler()  # 在训练最开始之前实例化一个GradScaler对象

然后,我们进入训练循环,每个epoch都包括模型训练和评估。

for i in range(EP):
    net.train()
    inference_start_time = time.time()
    for data, label in train_loader:
        data, label = data.to(device), label.to(device)
        # 前向过程(model + loss)开启 autocast,混合精度训练
        with autocast():
            out = net(data)
            loss = loss_fn(out, label)

        optimizer.zero_grad()  # 梯度清零
        scaler.scale(loss).backward()  # 梯度放大
        scaler.step(optimizer)  # unscale梯度值
        scaler.update()
    lr_sch.step()

7.可视化结果展示

7.1 准确率、精确率、召回率、F1分数、推理时间

在每个epoch结束后,输出准确率、精确率、召回率、F1分数、推理时间。

# 计算评估指标
accuracy = accuracy_score(all_labels, all_preds)
report = classification_report(all_labels, all_preds, output_dict=True, zero_division=1)
precision = report['weighted avg']['precision']
recall = report['weighted avg']['recall']
f1_score = 2 * precision * recall / (precision + recall)
# 计算推理时间
inference_end_time = time.time()
inference_time = inference_end_time - inference_start_time

image.png
最后得到的准确率、精确率、召回率、F1分数、推理时间分别是:Test Acc:0.9572,Precision: 0.9588,Recall: 0.9572,F1 Score: 0.9580,Inference Time: 0.6689 seconds。
根据上述性能指标,我们可以看出所训练的CNN模型在UCI-HAR数据集上取得了非常优异的性能。准确率、精确率、召回率和F1分数均超过了95%,显示出模型具有很高的分类准确性和鲁棒性。同时,较短的推理时间意味着该模型可以有效地应用于需要快速响应的实际问题中。

接下来,我们将介绍混淆矩阵、雷达图、准确率与损失率的收敛曲线图以及仿真指标的柱状图和折线图的生成方法。

7.2混淆矩阵图

混淆矩阵是一个重要的工具,用于可视化模型在各个类别上的性能。我们首先计算归一化的混淆矩阵,然后使用seabornheatmap函数进行绘图。

conf_matrix = confusion_matrix(all_labels, all_preds, normalize='true')
# 自定义类别标签列表
class_labels = ['Walking', 'Walking Upstairs', 'Walking Downstairs', 'Sitting', 'Standing', 'Laying']

# 使用 seaborn 的 heatmap 函数绘制归一化的混淆矩阵
ax = sns.heatmap(conf_matrix, annot=True, fmt='.4f', cmap='Blues',
                 xticklabels=class_labels, yticklabels=class_labels,
                 square=True, linewidths=.5)

输出混淆矩阵图:
image.png

7.3雷达图

雷达图可以展示模型在不同类别上的识别能力。我们使用matplotlib绘制每个行为的雷达图。

# 绘制雷达图
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

# 绘制每个行为的雷达图
ax.plot(angles, beh, linestyle='-', linewidth=2)
ax.fill(angles, beh, alpha=0.25)

# 设置雷达图的刻度和标签
ax.set_xticks(angles)
ax.set_xticklabels(['Walking', 'Walking Upstairs', 'Walking Downstairs', 'Sitting', 'Standing', 'Laying'])

image.png

7.4准确率和损失率的收敛曲线图

通过绘制训练损失和测试损失,以及训练准确率和测试准确率的收敛曲线图,我们可以观察模型在训练过程中的稳定性和泛化能力。

# 绘制训练损失和测试损失
plt.plot(range(1, EP + 1), train_losses, label='Train Loss', color='blue', marker='o')
plt.plot(range(1, EP + 1), test_losses, label='Test Loss', color='orange', linestyle='--', marker='x')

# 绘制训练准确率和测试准确率
plt.plot(range(1, EP + 1), train_accuracies, label='Train Accuracy', color='green', marker='o')
plt.plot(range(1, EP + 1), test_accuracies, label='Test Accuracy', color='purple', linestyle='--', marker='x')

image.png

7.5仿真指标柱状图

柱状图可以展示模型在不同类别上的精确率,有助于识别模型在哪些类别上表现更好或更差。

# 自定义类别标签列表
class_labels = ['Walking', 'Jogging', 'Sitting', 'Standing', 'Upstairs', 'Downstairs']

# 计算每个类别的精确率
precisions = {}
for label in unique_labels:
    # 为当前类别创建一个二进制的标签数组
    y_true = np.where(all_labels == label, 1, 0)
    y_pred = np.where(all_preds == label, 1, 0)

    # 计算当前类别的精确率
    # 设置 average 参数为 'binary',因为我们现在是针对每个类别单独计算
    precision = precision_score(y_true, y_pred, average='binary')
    precisions[label] = precision

image.png

7.6仿真指标折线图

通过改变批处理大小并进行多次实验,我们可以评估批处理大小对模型性能的影响。

# 进行多次实验,每次使用不同的批处理大小
batch_sizes = [16, 32, 64, 128, 256]
f1_scores_per_batch = {BS: [] for BS in batch_sizes}
for BS in batch_sizes:
    f1_scores_per_batch[BS] = train_and_evaluate(BS, 10, LR)

# 绘制不同批处理大小下的加权F1分数
plt.figure(figsize=(10, 5))
for BS, f1_scores in f1_scores_per_batch.items():
    plt.plot(f1_scores, label=f'Batch Size: {BS}')

image.png

在这一部分,我们展示了如何对CNN网络训练的UCI-HAR数据集进行性能评估和可视化。通过混淆矩阵、雷达图、收敛曲线图以及柱状图和折线图,我们可以全面了解模型的性能,并识别模型在不同类别上的表现。这些可视化工具对于模型的调试和优化至关重要。

注意:具体的代码实现和模型细节可以联系作者获取,以便进一步的研究和应用。本文首发于稀土掘金,未经允许禁止转发和二次创作,侵权必究。

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

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

相关文章

xtu oj 彩球

样例输入# 3 7 5 3 1 2 3 1 2 3 1 6 4 3 1 2 2 3 1 3 6 2 2 1 2 3 4 5 5 样例输出# Yes Yes No 滑动窗口问题 AC代码 #include<stdio.h> #define N 10005 int main(){int T;scanf("%d",&T);while(T--){int n,m,k,i,flag1;//m个k种颜色 scanf("%d%d…

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意&#xff1a;在C语言中&#xff0c;如果内存不够…

一台电脑轻松接入CANFD总线_来可CNA板卡介绍

在工业控制领域&#xff0c;常常使用的总线技术有CAN(FD)、RS-232、RS-485、Modbus、Profibus、Profinet、EtherCAT等。RS-485以其长距离通信能力著称&#xff0c;Modbus广泛应用于PLC等设备&#xff0c;EtherCAT则以其低延迟和高实时性在自动化系统中备受青睐。 其中&#xff…

The Ether: EvilScience VM靶机打靶记录

一、靶机介绍 下载地址&#xff1a;https://www.mediafire.com/file/502nbnbkarsoisb/theEther.zip 二、信息收集 扫描一下目标靶机的ip&#xff1a;192.168.242.135 arp-scan -l 扫描端口 nmap -p- -A 192.168.242.135 这里看开放了 22&#xff0c;80端口 扫描一下目录 …

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

【每日刷题】Day138

【每日刷题】Day138 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 2. 38. 外观数列 - 力扣&#xff08;Leet…

【2024版】超详细安装教程以及环境配置和使用指南, 学Python看完这一篇就够了!

windows版本PyCharm安装 1.点击蓝色链接---->PyCharm官网&#xff0c;进入之后是这个界面。 2.点击"Download"进入下载页面 注意&#xff1a;若有老版本IDEA&#xff0c;先卸载&#xff08;控制面板卸载&#xff09;&#xff0c;再安装&#xff01; 以管理员身…

1788C - Matching Numbers

给你n&#xff0c;求permutation [ 1 , 2 n ] [1,2n] [1,2n]数字能不能构造出 n n n个数字&#xff0c;每个数字是其中两个数字之和。 偶数不行&#xff0c;通过之和相同构造n和k的关系&#xff0c;k是构造后的首项。 奇数的话&#xff0c;我们把 [ 1 , 2 n ] [1,2n] [1,2n]…

两种方式创建Vue项目

文章目录 引言利用Vue命令创建Vue项目准备工作安装Vue CLI创建Vue项目方法一&#xff1a;使用vue init命令方法二&#xff1a;使用vue create命令启动Vue项目 利用Vite工具创建Vue项目概述利用Vite创建项目启动项目 结语 引言 大家好&#xff0c;今天我将向大家展示如何使用不…

【计算机方向】三本计算机视觉IEEE系列,发文量高,影响因子呈上升趋势,备受国人追捧!

本期将为您带来三本计算机SCI 妥妥毕业神刊&#xff01; IEEE Transactions on Pattern Analysis and Machine Intelligence IEEE Transactions on Knowledge and Data Engineering IEEE Transactions on Cognitive and Developmental Systems 期刊名称&#xff1a;IEEE Tr…

如何在Ubuntu上更改MySQL数据存储路径

文章目录 0 背景1 备份现有数据库数据2 停止 MySQL 服务3 复制现有的 MySQL 数据到新目录4 修改 MySQL 配置文件5 更新 AppArmor 或 SELinux 配置&#xff08;如有启用&#xff09;6. 修改 MySQL 系统文件中的 datadir7. 启动 MySQL 服务8. 验证更改参考资料 0 背景 在原先划分…

Cpp::STL—list类的模拟实现(上)(13)

文章目录 前言一、结点类的实现二、迭代器类的实现迭代器类的存在意义迭代器类的模板参数构造函数运算符的重载--运算符的重载、!运算符的重载*运算符的重载->运算符的重载 总结 前言 注意本篇难度偏高&#xff0c;其主要体现在迭代器类的实现&#xff01;   什么&#xf…

【论文#码率控制】ADAPTIVE RATE CONTROL FOR H.264

目录 摘要1.前言2.基本知识2.1 蛋鸡悖论2.2 基本单元的定义2.3 线性MAD预测模型 3.GOP级码率控制3.1 总比特数3.2 初始化量化参数 4.帧级码率控制4.1 非存储图像的量化参数4.2 存储图像的目标比特 5.基本单元级码率控制6.实验结果7.结论 《ADAPTIVE RATE CONTROL FOR H.264》 A…

望繁信科技创始人索强出席2022福布斯中国·青年海归菁英100人评选颁奖典礼

2022年12月20日&#xff0c;由福布斯中国和福科无限共同举办的“2022福布斯中国青年海归菁英100人评选”颁奖典礼在上海圆满落幕。 来自福布斯中国的高层、知名企业家、投资人齐聚一堂&#xff0c;围绕全球化趋势、海归创业机遇等话题&#xff0c;共同把脉数字时代发展风向&am…

vim实用笔记

函数跳转功能 想要使用函数跳转功能需要先安装 ctags sudo apt-get install exuberant-ctags接着&#xff0c;在源文件目录树执行如下命令&#xff1a; ctags -R . 即可在该目录下生成一个tags文件&#xff0c; 这个文件就是所有函数和变量的索引 接着打开用vim打开任一文件…

使用node+prisma+socket+vue3实现一个群聊功能,拓展功能:使用lottie实现入场动画

使用nodeprisma和vue3实现一个群聊功能 后端代码编写 node环境初始化 新建一个空文件夹node&#xff0c;初始化node环境 npm init -y修改 packages.json&#xff0c;添加 type 为 module&#xff0c;删除 main {"name": "node","version": …

iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例

作者&#xff1a;UC 浏览器后端工程师&#xff0c;梁若羽 传统 ELK 方案 众所周知&#xff0c;ELK 中的 E 指的是 ElasticSearch&#xff0c;L 指的是 Logstash&#xff0c;K 指的是 Kibana。Logstash 是功能强大的数据处理管道&#xff0c;提供了复杂的数据转换、过滤和丰富…

如何写好SCI论文的Abstract

摘要是一篇论文的缩影&#xff0c;是对全文内容的高度浓缩和提炼&#xff0c;也是整篇论文的精髓和灵魂。读者通常先通过摘要快速获得文章信息&#xff0c;然后决定是否要进一步仔细阅读全文&#xff0c;因此&#xff0c;写好摘要至关重要! 那么如何才能写好论文摘要呢&#xf…

线性代数在大一计算机课程中的重要性

线性代数在大一计算机课程中的重要性 线性代数是一门研究向量空间、矩阵运算和线性变换的数学学科&#xff0c;在计算机科学中有着广泛的应用。大一的计算机课程中&#xff0c;线性代数的学习为学生们掌握许多计算机领域的关键概念打下了坚实的基础。本文将介绍线性代数的基本…

睡眠小乖 2.2.19 | 免费改善睡眠神器

睡眠小乖是一款完全免费的睡眠监测软件、冥想软件、改善睡眠软件。支持的功能包括&#xff1a;睡眠监测、梦话鼾声记录、睡眠报告、多种白噪音、冥想板块。白噪音板块提供了近80种白噪音&#xff0c;支持任意选择4种白噪音组合成一个混音&#xff0c;支持单独调节每种白噪音的音…