训练数据的格式是(296,60,17,2)的tensor,2表示一个关节的二维坐标,17表示一帧里的17个关节,60表示一个序列里的60帧,296是batch_size=74*4。296个序列作为一个batch_size,每次训练输入一个batch_size。
1.joint to embedding
线性变换,将数据格式从(296,60,17,2)扩展为(296,60,17,32),即由两通道扩展为32通道,同时将得到的权重和偏置存储在参数中。
2.加入位置信息
将位置信息编码进语义表征中,位置信息是(1,17,32)的tensor,然后转为参数Parameter类型,使得其能够根据模型训练而变化。
3.spatial mixer
根据黄红颜色分为两个模块
红色部分是对通道数进行改变,黄色部分是对token进行改变
黄色部分:多头自注意力。数据通过层归一化和多头自注意力得到的结果与原数据相加,层归一化是对数据的最后一维归一化,归一化后的格式仍然为(296,60,17,32)。多头自注意力将输入数据线性映射(nn.Linear计算)8次,每次生成一套q,k,v,得到8套q,k,v,再在每套中进行1次自注意力操作,共操作8次,得到8个自注意力结果,将得到的8个自注意力结果进行拼接就是多头自注意力的结果。多头自注意力能够使网络注意到不同的部分。
红色部分:MLP(multi-layer perceptrons),多层感知机,由两层全连接层组成。使用1*1卷积核改变通道数32为128,通过激活函数GELU添加非线性,再使用第二个1*1卷积核改变通道数128为32,两层全连接层后面都添加了dropout防止过拟合。
像这样的spatial mixer有4个,顺次连接,最后进行层归一化计算(nn.LayerNorm(32)),通道数为32.
4.temporal mixer
上述层归一化的输出要输入4个顺次连接的temporal mixer结构中。一个temporal mixer结构如上图所示。先使用深度可分离卷积(Depthwise separable convolution)。分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution),一个卷积核负责一个通道,一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样,逐通道卷积使用31*1的卷积核,一个32通道的图像经过逐通道卷积运算后生成了32个feature map,逐点卷积使用1*1的卷积核,每个卷积核将32个feature map在深度方向上进行加权组合,生成新的feature map,逐点卷积有几个1*1卷积就生成几个feature map。后续再通过GELU激活函数和批归一化,对特征进行归一化处理。
四个temporal mixer的(输入通道数,输出通道数)分别为(32,32),(32,64),(64,128),(128,256),后续是一层内核为(60,17),步长为1的平均池化层,再进行两次维度压缩。
经过四个spatial mixer和四个temporal mixer后,通过层归一化(nn.LayerNorm(256)),线性投射(nn.Linear计算),将256个通道投射为128通道,此时tensor的格式为(74,128)。模型最后对第二维数据进行L-2范数标准化,输出(74,128)的tensor。