likes
comments
collection
share

强化学习与多任务学习在高级人体活动识别中的融合应用

作者站长头像
站长
· 阅读数 47

在智能系统的研究与应用中,人体活动识别(HAR)扮演着至关重要的角色。随着技术的进步,对于能够准确识别和理解复杂人类行为的智能算法的需求日益增长。USC-HAD 数据集,以其全面的日常活动分类和高精度传感器数据,为 HAR 的研究提供了一个理想的测试平台。

然而,面对日益复杂的活动模式和大数据挑战,传统的 HAR 方法在准确性和泛化能力上显现出了局限性。针对这一问题,本文提出了一种创新的方法,将强化学习与多任务学习技术相结合,以提高模型的适应性和鲁棒性。

USC-HAD数据集介绍

USC-HAD 数据集是一个广泛用于人类活动识别(HAR)研究的多模态数据集。该数据集定义了 12 种基本日常活动,每种活动由 14 名受试者进行 5 次重复试验,每次试验持续约 24 秒。试验中,受试者的腰部佩戴了一种高精度的 MotionNode 传感器,该传感器集成了三轴加速度计和三轴陀螺仪,能够以 100Hz 的采样频率捕捉人体的运动数据。这种高频率的采样对于捕捉细微的运动变化至关重要,有助于提高活动识别的准确性。

强化学习与多任务学习在高级人体活动识别中的融合应用

12项基本活动:

活动 描述 向前走 被试者沿着一条直线向前走 向左走 受试者沿着逆时针方向走了一圈 向右走 受试者按顺时针方向走了一圈 上楼 被试者多次向上走楼梯 下楼 被试者多次向下走楼梯 向前跑 受试者以一条直线向前跑 跳过 受试者保持在相同的位置,并不断地上下跳跃 坐 受试者坐在椅子上工作或休息。坐立不安也被认为属于这个类。 站 被试者站在那里,和某人说话 睡 被试者睡觉或躺在床上 上电梯 受试者乘坐一部上行电梯 下电梯 被试者乘坐一个下降的电梯

活动描述
向前走被试者沿着一条直线向前走
向左走受试者沿着逆时针方向走了一圈
向右走受试者按顺时针方向走了一圈
上楼被试者多次向上走楼梯
下楼被试者多次向下走楼梯
向前跑受试者以一条直线向前跑
跳过受试者保持在相同的位置,并不断地上下跳跃
受试者坐在椅子上工作或休息。坐立不安也被认为属于这个类。
被试者站在那里,和某人说话
被试者睡觉或躺在床上
上电梯受试者乘坐一部上行电梯
下电梯被试者乘坐一个下降的电梯

USC-HAD 数据集处理

USC-HAD 数据集是一个包含多种活动和多个受试者数据的集合,广泛用于人类活动识别(HAR)研究。以下是对 USC-HAD 数据集处理流程的详细分析,包括数据预处理、数据集分割、标准化处理以及数据保存等关键步骤。

1.环境设置

首先,需要导入处理数据所需的库和模块:

import scipy.io as scio
import os
import numpy as np
import sys
from utils import *

2.参数配置

定义 USC 函数,该函数接受多种参数以配置数据集的处理方式:

def USC(dataset_dir='./USC-HAD', WINDOW_SIZE=100, OVERLAP_RATE=0.1, SPLIT_RATE=(8, 2), VALIDATION_SUBJECTS={}, Z_SCORE=True, SAVE_PATH=os.path.abspath('../../HAR-datasets')):
    # 参数说明...

3.数据加载与预处理

受试者数据加载

遍历数据集中的每个受试者文件夹,加载每个 .mat 文件中的数据:

subject_list = os.listdir(dataset_dir)
for subject in subject_list:
    if not os.path.isdir(subject):
        continue
    # 受试者数据处理...

滑窗处理

对每个受试者的数据进行滑窗处理,以 WINDOW_SIZEOVERLAP_RATE 作为参数:

for mat in mat_list:
    content = scio.loadmat(mat)['sensor_readings']
    cur_data = sliding_window(content, WINDOW_SIZE, OVERLAP_RATE)

数据分割

根据 VALIDATION_SUBJECTS 的设置,选择留一法或平均法来分割训练集和验证集:

  • 留一法:如果受试者编号在 VALIDATION_SUBJECTS 中,则该受试者的数据作为验证集,否则作为训练集。
if VALIDATION_SUBJECTS:
    if subject_id not in VALIDATION_SUBJECTS:
        # 训练集数据添加
    else:
        # 验证集数据添加
  • 平均法:根据 SPLIT_RATE 计算训练集和验证集的长度,然后进行分割。
else:
    trainlen = int(len(cur_data) * SPLIT_RATE[0] / sum(SPLIT_RATE))
    xtrain += cur_data[:trainlen]
    xtest += cur_data[trainlen:]

数据标准化

如果设置了 Z_SCORETrue,则对训练集和验证集的数据进行 Z-score 标准化处理:

if Z_SCORE:
    xtrain, xtest = z_score_standard(xtrain=xtrain, xtest=xtest)

4.数据保存

将预处理后的数据保存到 SAVE_PATH 指定的目录中:

if SAVE_PATH:
    save_npy_data(
        dataset_name='USC_HAD',
        root_dir=SAVE_PATH,
        xtrain=xtrain,
        xtest=xtest,
        ytrain=ytrain,
        ytest=ytest
    )

5.结果输出

打印出训练集和验证集的数据形状,以验证数据处理的正确性:

print('xtrain shape:', xtrain.shape, 'xtest shape:', xtest.shape, 'ytrain shape:', ytrain.shape, 'ytest shape:', ytest.shape)

通过对 USC-HAD 数据集的详细处理,我们完成了从数据下载到预处理、数据集分割、标准化处理以及数据保存的整个流程。这为后续的机器学习模型训练和评估提供了结构化和标准化的数据。

USC-HAD数据集训练

在 USC-HAD 数据集训练中,我们采用了迁移学习技术,利用在大规模数据集上预训练的模型作为我们模型的基础,以提高对新数据的泛化能力。此外,我们通过引入 Dropout 和 Batch Normalization 等正则化技术,有效减少了模型的过拟合现象。还采用了 AdamW 优化算法,结合学习率预热和周期性调整策略,进一步提升了模型的训练效率:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Dropout, BatchNormalization
from tensorflow.keras.optimizers import AdamW

def create_transfer_learning_model(base_model, num_classes):
    # 冻结预训练模型的层
    for layer in base_model.layers:
        layer.trainable = False

    # 添加新的分类层
    x = base_model.output
    x = Dropout(0.5)(x)
    x = BatchNormalization()(x)
    predictions = Dense(num_classes, activation='softmax')(x)

    model = Model(inputs=base_model.input, outputs=predictions)

    # 编译模型
    optimizer = AdamW(learning_rate=0.001)
    model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

    return model

1.基于 Inception 模块的深度卷积神经网络

我们设计了一种基于 Inception 模块的深度卷积神经网络,该网络通过多尺度特征融合,有效提高了特征的表达能力。

强化学习与多任务学习在高级人体活动识别中的融合应用 同时,我们还借鉴了 DenseNet 网络结构,通过特征重用机制,增强了网络的学习能力。此外,Capsule Network 的引入,通过动态路由算法,实现了对活动类别的更精确识别。

from tensorflow.keras import layers

def inception_module(input_tensor, num_filters):
    tower_1 = layers.Conv2D(num_filters, (1, 1), activation='relu')(input_tensor)
    tower_2 = layers.Conv2D(num_filters, (3, 3), activation='relu')(input_tensor)
    # 省略部分模块。自己可以根据需要在增加
    output = layers.concatenate([tower_1, tower_2], axis=-1)
    return output

# 使用 Inception 模块构建网络
base_model = ... 
x = inception_module(base_model.output, num_filters=64)

2.强化学习的应用

在 USC-HAD 数据集的训练过程中,我们引入了基于策略梯度的强化学习算法,模型的超参数和网络结构可以通过与环境的交互进行动态调整。这种自我优化机制使得模型能够更加灵活地适应不同的数据分布和识别任务。

def policy_gradient_update(model, loss_fn, rewards):
    with tf.GradientTape() as tape:
        logits = model(inputs)
        loss = loss_fn(true_labels, logits)

    # 计算梯度
    gradients = tape.gradient(loss, model.trainable_variables)
    # 应用梯度
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    # 更新模型参数
    model.update_parameters(rewards)

3.任务学习框架

我们采用了多任务学习框架来训练 USC-HAD 数据集上的模型,模型不仅能够识别基本活动,还能够预测活动的强度和持续时间。这种多任务学习策略使得模型能够更全面地理解活动的特征,并提高了模型在复杂环境下的鲁棒性。

def multi_task_model(input_shape, num_activities, num_features):
    inputs = Input(shape=input_shape)
    x = layers.Conv1D(64, 3)(inputs)
    x = layers.MaxPooling1D(2)(x)
    x = layers.Dense(128, activation='relu')(x)

    # 分支 1 - 活动识别
    activity_output = layers.Dense(num_activities, activation='softmax', name='activity')(x)

    # 分支 2 - 活动强度预测
    intensity_output = layers.Dense(1, activation='sigmoid', name='intensity')(x)

    # 分支 3 - 持续时间预测
    duration_output = layers.Dense(1, activation='linear', name='duration')(x)

    model = Model(inputs=inputs, outputs=[activity_output, intensity_output, duration_output])
    return model

4.注意力机制

在 USC-HAD 数据集的模型评估中,我们采用了注意力机制来分析模型对不同特征的关注度,从而揭示模型的决策过程。此外,通过特征重要性评估,我们能够识别出对活动识别最为关键的特征,为模型的进一步优化提供了指导。

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Attention

def create_model_with_attention(input_shape, num_classes):
    base_model = ...
    x = base_model.output
    attention_layer = Attention()
    attention_output = attention_layer([x, x])

    outputs = Dense(num_classes, activation='softmax')(attention_output)
    model = Model(inputs=base_model.input, outputs=outputs)
    return model

5.结果展示

我们将模型的仿真结果可视化成仿真指标柱状图和混淆矩阵,可以发现12种活动在此模型的训练中准确率十分高,有好几次甚至达到了100%。可以说模型的训练方法和网络设定十分合理有效:

强化学习与多任务学习在高级人体活动识别中的融合应用

强化学习与多任务学习在高级人体活动识别中的融合应用

本研究的核心在于展示如何利用强化学习动态调整模型参数,并通过多任务学习框架提高模型对多种任务的学习能力。此外,还引入了模型解释性分析,包括注意力机制,以增强模型的透明度和可解释性。通过这次仿真实验,我们期望为 HAR 领域带来新的洞见,并为开发更加智能、可靠的人体活动识别系统提供理论和实践指导。


转载自:https://juejin.cn/post/7388221919777046569
评论
请登录