论文方法笔记参考:【论文阅读笔记】(2s-AGCN)Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognit_小吴同学真棒的博客-CSDN博客
NTU RGB+D 120 数据示例
A(Graph)的定义
模型 Model 的定义
模型 Model 的输入 Input
TCN_GCN_unit
unit_tcn
unit_gcn
补充学习
1、nn.BatchNorm1()、nn.BatchNorm2() 和 nn.BatchNorm3() 的定义与区别
2、torch.nn.Parameter() & Variable
3、requires_grad
论文名称:Two-stream adaptive graph convolutional networks for skeleton-based action recognition
论文下载:https://openaccess.thecvf.com/content_CVPR_2019/papers/Shi_Two-Stream_Adaptive_Graph_Convolutional_Networks_for_Skeleton-Based_Action_Recognition_CVPR_2019_paper.pdf
论文代码:https://github.com/lshiwjx/2s-AGCN
https://github.com/BizhuWu/2s-AGCN/blob/953c14fc10883cd869646328f5d522e9e9282063/graph/ntu_rgb_d.py#L17
https://github.com/BizhuWu/2s-AGCN/blob/953c14fc10883cd869646328f5d522e9e9282063/graph/tools.py#L22
最开始没搞明白 inward_ori_index 里面的数据是什么意思?后面对照论文里的图搞明白了,就是:每个节点与向心节点的连接对。
所以最后的 A 是由 单位矩阵、每个节点相邻的向心节点 和 每个节点相邻的离心节点 堆叠而成的。
https://github.com/BizhuWu/2s-AGCN/blob/master/model/agcn.py
对应论文里的图(模型的定义多了一层 l4 ?):
https://github.com/BizhuWu/2s-AGCN/blob/master/model/agcn.py
N:Batch Size
C:channels
T:Frames' Number
V:Joints‘ Number
M:People's Number
模型的输入维度:(N * M, C, T, V)
https://github.com/BizhuWu/2s-AGCN/blob/953c14fc10883cd869646328f5d522e9e9282063/model/agcn.py#L112
每个 TCN_GCN_unit 是由一个 unit_gcn 和 一个 unit_tcn 组成的。还有额外的 residual。
其中
其输入维度为:(N*M,C,T,V)
https://github.com/BizhuWu/2s-AGCN/blob/953c14fc10883cd869646328f5d522e9e9282063/model/agcn.py#L36
The convolution for the temporal dimension is the same as ST-GCN, i.e., performing the Kt × 1 convolution on the C×T×N feature maps. Both the spatial GCN and temporal GCN are followed by a batch normalization (BN) layer and a ReLU layer. As shown in Fig. 3, one basic block is the combination of one spatial GCN (Convs), one temporal GCN (Convt) and an additional dropout layer with the drop rate set as 0.5. To stabilize the training, a residual connection is added for each block.
这个模块的输入的维度也是(N*M,C,T,V),相当于 CNN 的(N,C,H,W)。unit_tcn 中的 con2d 的 kernel_size 为 (kernel_size, 1)。说明只对 T 这个维度进行卷积。
最后一层 relu 在 TCN_GCN_unit 中。
https://github.com/BizhuWu/2s-AGCN/blob/master/model/agcn.py#L53
输入维度:(N*M,C,T,V)
根据论文里的图可以推断:
代码里的 A 对应图中的 Ak
代码里的 self.PA 对应图中的 Bk(这里有点奇怪,明明论文里说的是初始化为 0,但是代码里初始化为 1e-6。。。)
代码里的 self.conv_a 对应图中的 θk
代码里的 self.conv_b 对应图中的 φk
代码里的 self.conv_d 对应图中的 wk
1d:BatchNorm1d — PyTorch 1.11.0 documentation
2d:BatchNorm2d — PyTorch 1.11.0 documentation
3d:BatchNorm2d — PyTorch 1.11.0 documentation
the Batch Normalization is done over the C dimension
1d:Applies Batch Normalization over a 2D or 3D input
2d:Applies Batch Normalization over a 4D input
3d:Applies Batch Normalization over a 5D input
PyTorch里面的torch.nn.Parameter() - 简书
Pytorch 中的 Tensor , Variable和Parameter区别与联系_念及她名的博客-CSDN博客_pytorch variable和parameter
Variable
Variable 这个数据结构,是为了引入计算图(自动求导),方便构建神经网络。
每一个 Variable 被构建的时候,都包含三个属性:
- Variable 中所包含的 tensor
- tensor 的梯度 .grad
- 以何种方式得到这种梯度 .grad_fn
通过调用 backward(),我们可以对某个 Variable(譬如说y)进行一次自动求导,但如果我们再对这个 Variable 进行一次 backward() 操作,会发现程序报错。这是因为 PyTorch 默认做完一次自动求导后,就把计算图丢弃了。我们可以通过设置 retain_graph 来实现多次求导。
引入 Parameter 的原因:
- Variable 默认是不需要求梯度的,那还需要手动设置参数
requires_grad = True
- Variable 因为要多次反向传播,那么在 backward 的时候还要手动注明参数
w.backward(retain_graph=True)
Parameter
将一个不可训练的类型 Tensor 转换成可以训练的类型 parameter,并将这个 parameter 绑定到这个 module 里面(net.parameter() 中就有这个绑定的 parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个 self.v 变成了模型的一部分,成为了模型中根据训练可以改动的参数了。使用这个函数的目的也是想让某些变量在学习的过程中不断的修改其值以达到最优化。
Pytorch 主要通过引入 nn.Parameter 类型的变量和 optimizer 机制来解决了这个问题。Parameter 是 Variable 的子类,本质上和后者一样,只不过 parameter 默认是求梯度的,同时一个网络 net 中的 parameter 变量是可以通过 net.parameters() 来很方便地访问到的,只需将网络中所有需要训练更新的参数定义为 Parameter 类型,再佐以 optimizer,就能够完成所有参数的更新了。
手把手教你使用PyTorch(2)-requires_grad&computation graph_慕课手记
只要某一个输入需要相关梯度值,则输出也需要保存相关梯度信息,这样就保证了这个输入的梯度回传。
而反之,若所有的输入都不需要保存梯度,那么输出的 requires_grad 会自动设置为 False。既然没有了相关的梯度值,自然进行反向传播时会将这部分子图从计算中剔除。
注意:
- 对于那些要求梯度的 tensor,PyTorch 会存储他们相关梯度信息和产生他们的操作,这产生额外内存消耗,为了优化内存使用,默认产生的 tensor 是不需要梯度的。
- 而我们在使用神经网络时,这些全连接层、卷积层等结构的参数都是默认需要梯度的。