tcn的过程是比较容易理解的,st-gcn的输入是(n*m,c,t,v),第一个维度是batchsize(视频数乘以人数),第二个维度是特征数,一开始是3,t是时间帧,v是关节数。首先理解它的数据结构:其实表面看就是和图片一样(batchsize,channel,w,h),channel一开始也是3(rgb),但是区别是,graph矩阵的t和v这两个维度是相互独立的,t代表时间,v代表节点数,这个时候可以把一个节点对应到image上的一个像素。这个矩阵里每一行代表,同一个节点,不同时间的状态。每一列代表同一个时间下的所有节点,其实就是图结构。这样来看,巧妙的建立了图和时间序列矩阵,再运算时再加上它的邻接矩阵就完整了。因此对他们做卷积运算的时候需要对他们的自己的意义做相对应的特定的运算。
回到tcn。对时间做卷积,用上一段的话就是对每一行做卷积,那么卷积核的列维度一定是1,行维度就是和cnn一样,这里的意义是每几个时间帧做一次卷积。文中tcn的卷积核是(9,1),t时间帧的维度是300帧。别忘了,还有padding哈。
来到了gcn,其实这里因为比tcn复杂,用语言也无法完整解释。gcn首先是做了一个普通的conv2d,这里是比较好解释的,用第一段的话说,gcn的时候应该是对列卷积,但是因为是图结构,每个节点的相邻关系在这个矩阵中是无法体现的,所以不好把相邻的几个值放到一个卷积核中一起进行运算,那么作者先用11的卷积核做cnn,我觉得这里应该是先遍历这些节点。为什么一定要遍历这些节点呢,以我暂时的理解就是这个11的卷积中的卷积核是用来优化gcn的参数,不然就没有可以优化的参数了。作者在原文中将一个图的邻接矩阵分为三个子图,分别对应一个人所有节点数的划分方式,为了保持特征维度不变,所以在1*1cnn的时候将outchannel乘以3,再进行view,和加权之后的邻接矩阵做einsum(这真的是一个很神奇的函数了),这应该算是图卷积的最关键步骤了,撇开channel数,帧数,batchsize,单单与关节点数相乘,这就代表了图的特征值乘以它的边的权值,用来表示一张图上的信息。