NeurIPS | 通过时频一致性对时间序列进行自监督对比预训练 (qq.com)
论文笔记:Self-Supervised Contrastive Pre-Training For Time Series via Time-Frequency Consistency-CSDN博客

在时间序列中,之前并没有找到一个在不同数据集上都一致的先验假设
——>本文找到了一种不论在什么样的时间序列数据集中都存在的规律,那就是一个时间序列的频域表示和时域表示应该相似
——>提出了Time-Frequency Consistency (TF-C)的核心架构,以对比学习为基础,让时域和频域的序列表示尽可能接近

数据增强

  • 在时域上,使用的数据增强手段包括jittering、scaling、time-shifts、neighborhood segments等时间序列对比学习中的经典操作
  • 在频域上,本文是首次研究了如何进行频域中的时间序列数据增强
    • 通过随机抹除或增加frequency components实现频域上的数据增强
    • 为了避免频域上的增强对原始序列过大的变化,导致增强后的序列和原始序列不相似,会对增删的components和增删幅度做限制
    • 删除操作——会随机选择不超过E个频率进行删除
    • 增加操作——会选择那些振幅小于一定阈值的频率,并提升其振幅

训练的损失函数由三部分组成:

  • 时域对比学习loss
  • 频域对比学习loss
  • 时域和频域的表式对齐loss
    前面两个loss只是分别在时域和频域内利用对比学习拉近表示,还没有引入时域和频域表示的对齐
    为了实现时域和频域的一致性,本文设计了一种一致性loss拉近同一个样本在时域和频域的表示
    借鉴了triplet loss的思想
    不带波浪线的T/F:原始时间序列时域表征&原始时间序列频域表征
    带波浪线的T/F:增强时间序列时域表征&原始时间序列频域表征
    ——>这个loss的目的是:原始时间序列时域&频域表征的距离,小于时域&频域任何一个/两个增强之后表征的距离

idea

  1. 我的facial,就可以imu和增强imu的loss,landmark和增强landmark的loss,imu和landmark的loss

代码复现

  • python main.py –training_mode pre_train –pretrain_dataset SleepEEG –target_dataset Epilepsy
  • python main.py –training_mode fine_tune_test –pretrain_dataset SleepEEG –target_dataset Epilepsy
  • Epilepsy Gesture Facial
  • 每次运行不同数据 改num_classes_target

数据集
找了半天才发现数据处理在 readme 的 raw data 就介绍了

  • (1)Sleepeeg:SLEEPEEG 从 197 个个体中收集了 371,055 个单变量脑电波 (脑电图 ( EEG )。100 Hz)。每个样本与五个睡眠阶段中的一个相关联。Train_dataset: [371055, 1, 178] from SleepEEG.
  • ( 2 ) EPILEPSY [ 62 ]使用单通道脑电传感器 ( 174 Hz )监测 500 名受试者的大脑活动。根据被试是否患有癫痫,对样本进行二值标注。 [11420, 1, 178] from Epilepsy
  • ( 3 ) FD-A [ 63 ]采集机械系统中滚动轴承的振动信号,用于故障检测。每个样品具有 5,120 个时间戳和三个机械装置状态中的一个指示器。
  • ( 4 ) FD-B [ 63 ]设置与 FD - A 相同,但滚动轴承在不同工况 (例如, 变转速)下工作。
  • ( 5 ) HAR [ 64 ]有 10,299 个来自 6 个日常活动的 9 维样本。[5881, 3, 206]为了和 gesture 的维度一样,只用了 3 个 channel 身体的加速度
  • ( 6 ) GESTURE [ 65 ]包括 440 个样本,这些样本来自加速度计记录的 8 个手势。[320, 3, 206][120, 3, 206]
  • ( 7 ) ECG [ 26 ],包含 8 528 条排序的单传感器 ECG 记录
  • 下载的 dataset 中,train. Pt 储存的格式是分别由 sample 和 labels,samples 的 shape 是代表

!有 bug!

  1. 在运行 python main. Py –training_mode fine_tune_test –pretrain_dataset HAR –target_dataset Gesture,
    • IndexError: Target 4 is out of bounds.
      • 报错 acc_bs = labels. Eq (predictions. Detach (). Argmax (dim=1)). Float (). Mean () RuntimeError: CUDA error: device-side assert triggered
      • 改成 cpu 运行。报错。Return torch._C._nn. Cross_entropy_loss (input, target, weight, _Reduction. Get_enum (reduction), ignore_index, label_smoothing) IndexError: Target 4 is out of bounds.
      • 结论,确实是 target 不对,搜索 num_classes_target,找到对应数据集并改变
    • Model_test 报错在 auc_bs = roc_auc_score (onehot_label.Detach (). Cpu ().n
      • 应该是因为最后一个批次数据不够(本来是 8 个分类这个数据只有 7 个类别 onehot 少了一个),所以不能计算 roc 所以报错。Replace np.float(0) with float(0): 但是如果这样,最后 gesture 结果只有 0.67,不知道这篇文章怎么得到那么好结果 0.78
  2. Sleepeeg2EPILEPSY
    1. 结果只有################## Best testing performance! #########################Best Testing Performance: Acc=90.9807| Precision = 91.0589 | Recall = 79.4122 | F1 = 83.5830 | AUROC= 83.7727 | AUPRC=83.9328 Best KNN F1 0.7999025624369648
    2. 于是运行了Data_split文件,重新对select 30 positive and 30 negative samples to form a training set (60 samples in total),60个finetune,11420其他测试,结果变好了?Best Testing Performance: Acc=92.5657| Precision = 92.2778 | Recall = 83.5000 | F1 = 86.9929 | AUROC= 85.7498 | AUPRC=85.1013 Best KNN F1: 0.7738
  3. SleepEEG2EMG