深度学习实验——蒸馏模型实战(一)

首先从github上下载了几份课题相关的开源的项目,对代码进行系统阅读

例如:

GitHub - Dylan-H-Wang/SLF-RPM: Official PyTorch implementation of AAAI-22: Self-supervised Representation Learning Framework for Remote PhysiologicalMeasurement using Spatiotemporal Augmentation Loss (SLF-RPM)

论文地址:

  大致思路: 原始视频通过基于稀疏度的时间增强和基于地标的空间增强进行转换,生成不同的视图,然后用于对比学习。同时,利用伪标签对学习过程进行约束。正样本用相同的下标和不同的上标表示。

   首先应用基于稀疏度的时间和基于地标的空间增强来生成总共2N个样本。然后将来自同一个视频的两个增强片段c1'i, c2'i输入视频编码器,得到对应的视频特征h1i, h2i。然后它们都被投影头映射到空间z1i, z2进行对比学习。

一些细节:视频编码器采用3D ResNet架构。3D架构允许同时学习空间和时间信息。每个输入都被转换成一个平坦的特征向量h,然后输入到投影头,即我们实验中的多层感知器(MLP)中,得到最终的编码特征向量(即Eq. 5中的z)。在评估过程中去掉投影头,直接使用视频编码器中的特征向量h作为RPM表示进行最终的预测。

   1.基于地标的空间增强:

(基于地标的空间增强插图。基于检测到的面部标志,我们定义了7个ROI区域{R1, R2, R3, R4, R5, R6, R7})

   基于地标的空间模拟定义了两个标准:1)需要考虑每个像素的颜色通道之间的关系,任何像素值的变化(如颜色抖动)都是不允许的;2)在不同的视角中间,潜在的颜色变化是总是相似的。

  因此,我们根据人脸地标位置选择和裁剪每一帧到几个面部部分,roi的选择考虑了两个因素:1)眼睛和嘴巴的运动比在镜面反射上占更大权重的面部其他部位更快2)同一视频中肤色相似的面部部位Ck(t)应包含相似的信号p(t)。

   2.基于稀疏性的时间增强:

 (信号稀疏度示意图。这是一个采样率为256的1秒信号的例子。蓝线表示原始信号(即步幅为1),绿点表示步幅为10的数据点,红点表示步幅为20的数据点。注:红点与绿点重叠,即红点位置也会出现绿点。)

  基于稀疏性的时间扩展的主要思想来自于Nyquist Shannon采样定理(Nyquist 1928),即如果信号的带限B小于采样率fs,则一个离散的采样序列可以重构相应的连续时间信号。在我们的例子中,每秒帧数(FPS)可以作为采样速率,只要FPS大于Nyquist速率(即2倍于rPPG信号带宽限制),就可以从视频片段中提取rPPG信号。因此,我们可以使用不同的步幅来增加每个视频在时间轴上的步幅,步幅越大FPS就越低。

  3.伪标签的时空损失:

特定的约束条件,如模型训练时的诱导偏差,可以帮助提取具有代表性的特征。它有效地调节和概括领域信息。因此,我们引入了一个时空损失来调节对比学习的训练过程和处理复杂的噪声。它首先为增强视频片段生成伪标签,并创建两个附加的辅助分类任务来预测伪标签,基于相应的数据增广定义每个视频片段的伪标签。

实验部分:

数据集:: MAHNOB-HCI、VIPL-HR-V2、UBFC-rPPG

评估指标:通过标准偏差(SD)、平均绝对误差(MAE)、均方根误差(RMSE)和Pearson s相关系数(R)的比较度量来衡量模型在HR估计(RPM的下游任务)上的表现。

线性分类:为了评估提取的rPPG的质量,通过冻结自监督视频编码器层的权重,并根据视频编码器的全球平均池特征训练后续FC层。

 线性评估和有监督方法的比较。表的上部分显示了SOTA SSL方法和我们在三个数据集上的SLF-RPM的结果。下面是每个数据集的最佳性能结果。表的底部部分显示了SOTA监督HR估计方法的结果和基线(即3D ResNet-18)。每个数据集的最佳性能结果以粗体显示。

 接下来根据文章的大致思路对框架进行修改

1.对ResNet3d网络进行蒸馏 大致思路如下

该ResNet结构加入了自我蒸馏模块,ResNet按深度分为四节,在每一节之后设置额外的瓶颈层和全连接层,构成多个分类器,所有的分类器都可以独立使用,具有不同的准确率和响应时间,每个分类器在三种监督下进行训练,在推断中可以去掉虚线下面的部分。

在我对网络结构进行修改之后遇到了报错:

mat1 and mat2 shapes cannot be multiplied(16384*1 and 512*512)

通过检查得知fc层与之相乘的矩阵维度为(512*400)

紧接着我在每个fc层之前加入x.view将其维度改为(32*512)使之能够相乘

随后报错:

Given groups=1, weight of size [128, 64, 1, 1, 1], expected input[32, 128, 8, 8, 8] to have 64 channels, but got 128 channels instead

奔溃啊,然后继续查找原因 很多博客里面说是数据读入的通道数不对,通过检查得知是我网络的定义问题。继续修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值