数学建模社区-数学中国

标题: 骨架图算法Graph Embedded Pose Clustering [打印本页]

作者: 杨利霞    时间: 2022-9-5 15:49
标题: 骨架图算法Graph Embedded Pose Clustering
骨架图算法Graph Embedded Pose Clustering
& Y3 b# j9 L8 d$ k! P; j) e' P- W: Z6 K4 F/ [4 @% C4 c0 F
骨架图算法4 R9 W& f. o6 O- U2 V
/ Q8 |( y" [' y

3 H/ \  U0 i/ L  r0 p4 _Graph Embedded Pose Clustering for Anomaly Detection0 q9 K. Y( {+ `: l* o" w
paper        code
% m1 n& r* M! Chttps://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc
. G& H' X/ V/ I% f8 @我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。$ i5 Q1 H' m6 I4 _+ U( q8 }8 P6 r

) W9 ?/ f5 o" D) @2 o% I7 f首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。$ Q! ?- V* p0 d5 B( h$ a

! A9 z( P0 |& ^图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。
) k: s: B% ~/ z2 b5 w' J; E/ z% a, w为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算
  W" i0 w+ f$ V! R6 X8 h  {! J8 Z" f/ c7 X8 t/ J+ {
我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。
1 Z3 t+ E  Q, m6 \
6 S8 K6 k. U, G* \2 H4 s3.2. Spatial Attention Graph Convolution1 ^6 F& b% u/ P- |$ [7 o5 t( G6 t
我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。
$ G5 Z# y7 C1 ^1 s# l5 x
/ w: C' _. m- L% t2 l. bGCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。  x  }  H* g- q  |5 W
+ [" z2 ~+ e4 o/ _# I
三个邻接矩阵捕捉了模型的不同方面:3 g$ h9 J4 D! n
(i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。# y- ?! }+ D0 j1 Q* D+ W4 |
(ii)由全局邻接矩阵捕获的数据集级关键点关系,以及
7 q. k7 {' A- [' L: i% z(iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权
  o& n" ?" n) _' e; K! ^1 C: C7 Y& {
- b1 i3 x; Z6 ]2 W/ y1 ?! P
后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。
7 N7 z/ a( O" w9 `3 k7 B3.3. Deep Embedded Clustering7 B  i. J9 T2 t
为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。0 `9 }' A% D. f+ l0 i
) K& F2 X2 {- s  K& @1 \1 d) [
我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。/ R3 T& B; ~0 h, j
. W6 s, O: l" X) \
具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。
5 G' I3 r5 \: {/ L( r6 T" u
# m. q. y$ z' X9 QST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。7 c, Q/ A; B5 T2 }, L# V
) O# U& f+ |/ o; G2 G! z5 E) |
符号        表示- {3 G* I. A) Z; J
x i x_ix
6 |0 v2 r( [& k/ r% I6 ^  Xi
6 I$ k' O* K- e& {2 J# R' y2 {8 B8 w; o7 D
        输入示例3 ?( ?: v: s$ S/ r9 R2 T
z i z_iz
9 c- w$ K- v8 [  u% p9 }i, E: V9 F. A5 r4 L$ g

5 v) ], o7 H& t         编码器的潜在嵌入
0 f: `% `' Q7 J( Ty i y_iy
6 t+ v, p0 i8 T0 }9 ni
" h8 ^) ?3 [; M3 g
) O1 A, d2 @7 J( O4 h6 D' S/ K+ K         使用聚类层计算的软聚类分配
% N. A% J5 e. _/ sΘ ΘΘ        聚类层的参数9 B$ l0 t2 }$ l: A
p i k p_{ik}p
4 u7 }7 _' P! N! F# lik
0 o7 l: c8 R5 U( T0 m& _" D5 g7 E( w, Q/ B4 `0 _) u6 b
        probability for the i-th sample to be assigned to the k-th cluster% y/ z8 P0 y4 [) h$ V' K& ]0 J

4 Q2 U, H. n& r5 N- S
! Z2 U* e8 c* I- v0 s+ S; ]我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:. `) [4 h' Y4 E
4 _2 u$ W/ g: }1 o( H, H& J; Z7 c

# S  A5 T' W( H) F  R目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:
3 M/ V0 t9 c. A. R; V; W  j8 A' w4 C1 M) r
( N# ~8 b% Z9 O
聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。
9 p- A- G3 [: B/ |9 M在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。
) {- `( t  _5 }, v9 T- }
$ i1 F. [9 V/ o, Q$ W3.4. Normality Scoring
! g9 T8 U! B) p* Z; n) N该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。3 E; J& X6 D. V
软分配向量本身(捕获动作)也可以通过多模态分布建模。/ W/ D2 O9 l- w% T  X5 i

' i& ]6 r% v2 v3 l/ Z2 [6 ]  GDirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。, o3 _+ s, [6 J0 I

& M, q" w  v: ]' C  n! yDirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:
: P7 a# d; @/ F(i) 估计(拟合)阶段,在此期间评估一组分布参数,以及- Y# @' p# ^( R; }8 [
(ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。7 E! J# p' D3 d5 H  c: a9 f( k. [( V

* ]; s1 \' c! F# M% D* ?DPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。% s) c! ]  X, u  [- I
+ L( q; r' T2 z$ E2 }! P3 n3 y4 Q
3.5. Training" N. J$ ]; V# }: k; b% s) V
该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:2 S3 c8 a9 G5 c

! \. E7 H& L- i* R) z: @+ I' p  aPre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失
7 j+ M  |0 F# ]: m+ O9 a% F0 x: n  A4 q- D% A" l# k# v& \
Fine-Tuning:
6 O, a! H& t: F; h; |; ^该模型优化了由重建损失和聚类损失组成的组合损失函数。. ]* u3 }- B2 I* H0 t) U
进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。
# v  K! b) s# n6 X/ ~集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。6 [2 ^/ n' n& {" q4 S- z2 T
本阶段的综合损失为:# ~4 Y, u; n+ D3 J5 C6 j+ n

# G. B7 I9 t* o6 u: M
' C7 \/ ?0 V9 z$ n% [/ E7 n" u9 I. X$ U( A+ f
实现细节
1 g8 d# G5 a- L1 H; x( Q9 i. E! N9 M4 x

: V4 B" P3 t/ x+ Z9 v
8 r+ H, D; [6 [" I: D% hdef calc_reg_loss(model, reg_type='l2', avg=True):% v9 _1 a. g" _8 K  m1 Q3 R3 h
    reg_loss = None3 p6 z, t3 l0 Y8 s& n+ C' W
    parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)( E  `! D4 @/ h
    num_params = len(parameters)
/ g  e# y# v: `' ]8 q  m( A. L    if reg_type.lower() == 'l2':
) a0 t1 x+ Z' D/ ^  v6 R$ Q( v        for param in parameters:
& H% \3 @0 ?  |- C9 L$ t            if reg_loss is None:
. l$ Y( v" H$ Q, d0 O, @0 K                reg_loss = 0.5 * torch.sum(param ** 2)5 m) w/ {" X% A7 {+ R( K- M; q
            else:0 x$ |8 a# b+ j$ K" I$ o0 o
                reg_loss = reg_loss + 0.5 * param.norm(2) ** 2- h6 D/ B* t5 U; u  h0 V8 L
, ^9 J: \9 R* K
        if avg:
) G& {& S0 k5 v6 G4 u5 A+ Z            reg_loss /= num_params
" E/ I, `$ O7 ~2 V2 c' n" T        return reg_loss
2 B, [- \* s7 p1 G0 A7 l    else:
2 A9 T/ m. q& v" H8 a        return torch.tensor(0.0, device=model.device)5 o+ k9 H' e* N- w0 m" C
1" ^9 g) n3 A) Y' k, h
2
! h5 k7 h( N+ |/ @3
/ P2 }; Q! K: k% U9 P+ C7 I% A0 p4
* m* D/ r2 [4 p6 d* C5
. a0 ]- |1 [$ `0 g3 m( K6
# K- I6 t) x1 h) Q' s7
& ]& I( B. q% X7 z. n% y" x8
! ]+ N3 L* ~+ T, F, F6 Q; o9
6 v$ m# ~; {( O107 S/ H/ g, ?2 E8 X+ J( l
11
3 B& q3 @- h$ l1 g12  C* W; n$ j/ A5 ]+ e; }" P1 X1 V+ Y" u' @
13
8 o  G4 v* c0 p+ ~; {% ~' `143 \3 t4 h: a+ z. B) `$ ?
15  G* ]& n" |  |  r9 E
165 w# s5 E3 [+ o! u1 \

3 _1 D9 {! I4 D: B; s9 J8 j, `4 j5 Y' B7 |  p: [
' C4 c- y( q2 L, m
, q9 d7 f& o( i0 i' L
PatchModel(- S" R1 ]7 H& A
  (patch_fe): Identity()
, R  U( x/ |  L! u3 t" u; Z  (gcae): GCAE(
% c" ?+ }4 g6 e- P4 L  x7 P    (data_bn): BatchNorm1d(54, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)" L' |* p, L9 t/ I$ u9 Y
    (act): ReLU(inplace=True)# S1 a4 v; j* y. c7 c! Y
    (st_gcn_enc): ModuleList(! M( X' ~5 n2 m4 D4 E! [* h6 ?
      (0): ConvBlock(. a4 {! d, @; x9 W! T: [
        (act): ReLU(inplace=True); u) J' y- W6 S, t. b
        (gcn): PyGeoConv(
  v7 X. G9 J6 c  _, u          (g_conv): SAGC(# m% ^( Z* E7 Y" D. z; g
            (conv_a): ModuleList(
7 E6 |" c; F% i0 x. t$ r              (0): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1)), {6 p) E" y# ~6 Y+ d2 D
              (1): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1))9 ?* G! V) Z. [1 [3 S( o
              (2): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1)), J- K+ B; V( C7 f. h( _6 m( z
            )8 G+ z" F& X# s* e" S4 n
            (conv_b): ModuleList(+ _. R: n: {* Y  _0 T! ?
              (0): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1))3 I/ r8 ]; d. \) n. k! {: A* ]
              (1): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1))
) [1 d$ r4 O3 D              (2): Conv2d(3, 8, kernel_size=(1, 1), stride=(1, 1))
2 \: L3 m- G6 F: @- D! {            ), }8 d: ]5 s+ j; O% m
            (gconv): ModuleList(: q3 \$ f. Y& D3 y
              (0): GraphConvBR(
% R& _/ V& F" Y0 q  C                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)( C/ i: @4 F' w! |& R2 H. k
                (act): ReLU(inplace=True)0 U% ^, a$ i+ H6 z7 n
              )! e4 [+ Y1 k1 z, p# j
              (1): GraphConvBR(# d% ~( v+ C& M) q  v, J9 M
                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
: }" q' U5 L$ B4 S                (act): ReLU(inplace=True)
5 b5 C. S" y  v* ?# `- {4 }9 A* X              )
# Q. R, v1 a, n. h9 g9 L              (2): GraphConvBR(
& }/ |% x3 U+ S- O. X/ @$ D) D                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ L7 n$ w2 T7 `7 {9 Z% g& o+ @- z                (act): ReLU(inplace=True)
0 E* n# W* {+ ?              )8 N6 u1 Y, r4 t% j1 o6 J* e- @
            ): l* [3 t$ Y4 ]. [
            (down): Sequential(
! j- B- [' e1 p9 O# q, Z              (0): Conv2d(3, 32, kernel_size=(1, 1), stride=(1, 1))
* t+ e6 D' s4 s: B6 X6 v4 |) G# M              (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)# T4 I8 y3 s3 N) d  Z
            )! z4 q3 `3 s2 ~2 l; i
            (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
! \' |, `& V, O8 Q            (soft): Softmax(dim=-2)# F% O7 @! z( i- j' h, y% c
            (relu): CELU(alpha=0.01)
! B1 c+ L6 i: s            (expanding_conv): Conv2d(3, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)3 z) {8 _. |. x8 U+ v/ r- O  B* b
            (reduction_conv): Conv2d(96, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
1 B+ ^5 h4 i$ Q5 ]8 ?  ~8 D& m( n          )
" o; O7 B5 X3 H# l: K. u; A( D        )+ ?% d+ O: x% N) h$ K
        (tcn): Sequential() E  i8 L, m' j, ?3 T
          (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
3 o2 h$ g4 W* s          (1): ReLU(inplace=True)4 X) V! x$ a$ b# A7 q, h+ P- b) o$ j9 n
          (2): Conv2d(32, 32, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))4 j& a2 }4 j+ l8 x  q
          (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- V: l7 x" k- @3 p1 b* X6 r& a% H; k          (4): Dropout(p=0.3, inplace=True)
* A2 @  \, O& P) f4 F* j7 B        )
+ ^  _7 [) ~+ P6 \) R1 m      )# h0 t& g5 S+ y5 H3 s: e+ H/ y, Y; k
      (1): ConvBlock(8 \/ h) Y8 o" U) g$ N  p# k1 m( {4 j
        (act): ReLU(inplace=True)
5 S8 b* D! \* s! }2 Y% c        (gcn): PyGeoConv(
# Q* Y6 x4 z* Z8 X& U6 P          (g_conv): SAGC(8 U4 l$ R' c5 J8 D% t/ ]9 U
            (conv_a): ModuleList(9 c( P9 s7 z. T/ z
              (0): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))9 ~  j) U( m1 A
              (1): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))6 O9 y7 @" d/ B2 H* ?0 |2 v" c( u
              (2): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))% c& R2 g6 X' x% M9 u
            )( x" u% O1 D8 k# l& h6 u
            (conv_b): ModuleList(
% I1 n: Q; b; {: _              (0): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))# q6 X6 e* V6 {) `
              (1): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))
% o) E$ z6 u2 q8 D9 {+ u) L  G              (2): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))+ j! t# m! R3 I( C- z
            )' E. J) q- L" L: {
            (gconv): ModuleList(6 D2 L5 H4 s1 R! G
              (0): GraphConvBR(
" p1 a( L- U9 ]7 R9 X% }. E% e                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)0 [' a7 \( ]( F" \  ~
                (act): ReLU(inplace=True)" L: T1 k4 ?% o$ |* W
              )& z, e1 C) x, N8 [/ |4 t
              (1): GraphConvBR(
6 K0 a$ B1 R) I% U3 e( \* W+ ~0 y                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)$ @' z2 Y9 O% r0 Z/ [7 E% W
                (act): ReLU(inplace=True), K  ?0 c# Z. v: }$ {1 _- j3 Z# _
              )9 X+ {- g$ v. ]) ^
              (2): GraphConvBR(9 k$ a# j* n" D
                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
0 I' h7 R, z+ m5 D& g3 Q( D                (act): ReLU(inplace=True)
; P* v' N- s6 z              )
" {$ \. a& e% T0 y& ^% K            )/ R' U1 q8 B* J& {, g" {% b" z0 W+ ^
            (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)- r& P5 f. G8 @+ W" U# k; K1 a
            (soft): Softmax(dim=-2)" S3 Q7 [9 V" }$ P5 t& j
            (relu): CELU(alpha=0.01)' ^) E8 Q9 a: }: l7 G0 M. N% E; y
            (expanding_conv): Conv2d(32, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)( Y7 m/ W4 Z* u, P. y* b/ [
            (reduction_conv): Conv2d(96, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)0 {$ C( S: B6 I" P; |  h
          )
' h9 f5 G5 C$ B+ \        )
+ T9 h! _& R: W" M, d. A        (tcn): Sequential(  r* z3 g. F# B% k
          (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
& Y# e( {7 |5 x  B          (1): ReLU(inplace=True)# f6 Y+ ~5 O1 H% ~8 |% E
          (2): Conv2d(32, 32, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))
8 _0 c5 }* ?. x6 }5 ?8 ~" g. X          (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
0 g6 P, C' _1 R- D) }          (4): Dropout(p=0.3, inplace=True): ?% z% ~# u; p2 q2 @/ h  Q) f
        )
4 u" K; \  v6 }      )( X! u' K  y" F- ^! U: [
      (2): ConvBlock(# o3 ~' k, w9 l& j0 I
        (act): ReLU(inplace=True)
. N# s1 C; h: d. Z3 g" {        (gcn): PyGeoConv(
0 f' U' Z1 Y: `# l& x. ?# g& o          (g_conv): SAGC(" E' w3 f# q6 `. F, I, t, T
            (conv_a): ModuleList(' V& q6 _# T& r; g+ M, ?
              (0): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))
6 _( }# K; G- N) _              (1): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))+ J! k3 B: g% D
              (2): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1)), B8 d' L! {# a* D
            )
2 i) z1 q7 ?( o            (conv_b): ModuleList(
9 B6 F9 O2 L# ^, s/ V              (0): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))5 w/ B2 _" U( s7 G" P9 y6 b! b, n
              (1): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1)): L  s( `7 F3 ~  g9 K) Z
              (2): Conv2d(32, 8, kernel_size=(1, 1), stride=(1, 1))
4 x+ N# r( D0 h" r9 _            )
) r* g2 l% r" O* L0 `. p3 R  d            (gconv): ModuleList(
" ?4 ]" C6 @6 [  x              (0): GraphConvBR(
% U1 G- ~/ N2 {" ~                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)- J6 k* a# Z) O" f$ M* i
                (act): ReLU(inplace=True)
# s5 J7 N1 u$ t+ M# _' s  |8 ]              )$ P3 w7 h: w3 l' L" n8 r5 m  }
              (1): GraphConvBR(! b7 C4 P3 S0 H; E
                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  C  f$ C0 G4 f. e                (act): ReLU(inplace=True)
0 [$ |: E5 L9 H; O* T              )1 y; X; H7 @2 B% n1 V# q3 `
              (2): GraphConvBR(% O2 I0 A, w: f
                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
8 }  p- O2 C& p* h/ K. W6 I  ]                (act): ReLU(inplace=True)
0 a4 s/ n0 ^7 o4 g  I0 o7 Q' P              )
& N* b1 L( Q+ b+ U% ?- q8 P  b  ~9 u            )
' @" l% T) Q6 [/ n8 i& q4 D; k            (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)) v; L# A6 g0 V4 B
            (soft): Softmax(dim=-2)
/ c% Y, L, W. l% A5 O' W            (relu): CELU(alpha=0.01)7 v% ^* H& O- k9 T
            (expanding_conv): Conv2d(32, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)+ u% C( _* x: ~/ I- Q( @% \
            (reduction_conv): Conv2d(96, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
) v! M7 I+ B" x4 ~1 t1 w          )
! \0 V1 F/ S$ Z        )
4 Y) O6 P: G5 i' G        (tcn): Sequential(
- ^, N4 E, g. a( @+ s% G& c          (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
# X1 `) F  [( Q          (1): ReLU(inplace=True)
) N7 b# P/ w" O- ^          (2): Conv2d(32, 32, kernel_size=(9, 1), stride=(2, 1), padding=(4, 0))
4 f5 \) k# I5 y# ]& r7 E          (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)8 z0 E1 M# k( m! B
          (4): Dropout(p=0.3, inplace=True)
' [6 r9 O, s2 ?. I# h, R% D        )
1 Z% a1 w% K: ]" z( O        (residual): Sequential(
2 p* z6 i% C2 t9 U4 Z, k$ e+ y: O          (0): Conv2d(32, 32, kernel_size=(1, 1), stride=(2, 1))4 ]  d, E, G# m% c) C- N
          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)  L3 G; I8 p. R9 X* [
        )
8 c" ~& |5 `$ N# I' T+ W      )
' f. P8 l1 D0 _6 s! G! ?/ N      (3): ConvBlock(2 m  E% {. ~& P- E, p, N5 m
        (act): ReLU(inplace=True)
! ~4 G! F6 `, L: J- F        (gcn): PyGeoConv($ Z. N* O& g; X% b
          (g_conv): SAGC(
# X/ L: ~( R1 e) w8 s0 ?! @. c            (conv_a): ModuleList(
2 o9 C* H+ d5 A6 `8 O, X. Q              (0): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1)); x1 y7 G5 ~( K% W! M& q! v- i
              (1): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1))
) Q( F( e! E  S* s              (2): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1))
8 g2 }1 J; H- M* y, `# {9 P! D            )3 H/ ^) d0 n% s5 D# b
            (conv_b): ModuleList(: @4 a' z, i5 `1 A
              (0): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1))
" k8 p' ]- P  z! f8 l              (1): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1))
9 w  U/ e& ?" [& Y! J5 h              (2): Conv2d(32, 12, kernel_size=(1, 1), stride=(1, 1))4 E$ D6 B0 t% m1 R
            )1 m0 P1 w4 D3 m* P9 R( h( Q! j
            (gconv): ModuleList(
" ^' w* }% x( [# c! G* E, S% x( x              (0): GraphConvBR(
, {2 j: \& L0 X: V                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
5 e9 T1 @1 Y" S7 ?; i                (act): ReLU(inplace=True)* S& c8 o1 m4 _8 G3 y* H
              )
, m; m) G% \4 f2 n* X* v              (1): GraphConvBR(& e$ u8 F% u% L
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
' b- I3 a' r* t" c) m& m                (act): ReLU(inplace=True)
  g9 }7 ~. j# Y, t9 {# _4 Y3 q+ u              ): d5 ?: x2 H! E& ^' m
              (2): GraphConvBR(
% q* U8 m" ]2 O0 e                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ ]6 {3 J7 B. k& A+ ?4 k! a; i                (act): ReLU(inplace=True)  C, l- V; I: O3 E# E6 z
              )
# z0 t5 s) e! x) v* p            )
9 b: k1 f1 }* _+ y% ^+ z: P            (down): Sequential(
+ t- S( K/ @3 O6 v6 j$ O              (0): Conv2d(32, 48, kernel_size=(1, 1), stride=(1, 1))% N' V, Q$ u/ Z+ P' \5 x9 O
              (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
6 K9 [8 ^+ ?3 k1 y( U- e            )
) Q: O! E) |/ N8 h3 O            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True). Y. m  y' q/ ?# c- [
            (soft): Softmax(dim=-2)
+ i4 Q5 D! {3 r0 b4 ?            (relu): CELU(alpha=0.01)
1 m( e$ H$ R$ C3 H  C            (expanding_conv): Conv2d(32, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)
3 e% {7 q, i( v; n            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False); }$ K3 S& ?7 Q7 l% |! ?
          )
% C7 E% }2 ~0 h  h) @* ]        ): J3 C* ?% ?. P3 Y" x, Q7 w6 g
        (tcn): Sequential(8 e7 t) o) X. D5 y
          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- d8 n+ T) ?4 U5 Q* i( j6 y          (1): ReLU(inplace=True)8 {* h  |% S# E: s+ A- o/ G' u
          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))
- o. a. F7 R& y+ N          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ p, `  C. M% R  p# ~7 M- J          (4): Dropout(p=0.3, inplace=True)
* ?, c8 ~1 k/ [, W        )2 M& h) A$ h5 N$ b: x3 Y
        (residual): Sequential(  h8 V  T: B. }
          (0): Conv2d(32, 48, kernel_size=(1, 1), stride=(1, 1))
' ?7 W) d5 I/ q0 q# |( q7 c3 N          (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)- m( z7 v: _3 N( r
        )0 ?6 j6 F1 Q5 ]7 A
      )$ p) o: k* T7 L5 T+ w
      (4): ConvBlock(! e8 w5 s' m" W$ e- X
        (act): ReLU(inplace=True)
! c$ g' O; e: o. u        (gcn): PyGeoConv(
0 @& F( |( k  A* _# W          (g_conv): SAGC(
4 V2 w( p1 o/ r4 ]            (conv_a): ModuleList(+ y4 G7 b4 T9 i9 E
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
* A, O. R/ Q% J4 P9 s+ C              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
& ]5 u+ T: @1 J8 e; J5 d0 Y6 J              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
' t4 \' M) d9 E4 l' w            )' l. ]- X+ M2 ~: o: U
            (conv_b): ModuleList(
( s  Z# E6 F! V, C              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))* H0 e8 A3 X% ]4 r3 h( @5 C
              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))% v8 X2 ?! \7 x$ D9 K6 O# C) l! D/ o
              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
7 H9 N8 m$ @# z  i$ q+ q% Z- Q            )% J# G; C7 _; r% a
            (gconv): ModuleList(6 D! |/ N$ n% v5 L$ ^
              (0): GraphConvBR(& U/ V! Q* r  N, D  p
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
2 _3 f" p4 Y+ r- }                (act): ReLU(inplace=True)
& p7 A% ?9 a8 c; z$ M6 z9 Z              )& ]# Z: r9 a* J: A
              (1): GraphConvBR(6 W+ q& d* h4 s8 G4 G
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)! V- x# g' O8 s+ J" F' C( t
                (act): ReLU(inplace=True)
9 r3 W7 A3 @0 R% I: J              )
0 p1 J- c' @# N; g/ G1 V              (2): GraphConvBR(5 y8 A0 m$ g2 n. i5 f
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
) i* P9 Q1 ]& d# I                (act): ReLU(inplace=True)
! Z) ~: D; ?6 T: `& ]! I              ). o0 Q0 k3 ?0 k& H9 J
            ), V& X$ z6 E, M! v3 B; M2 _
            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
8 q3 B/ T0 H2 B4 h7 L# X) i# g: b            (soft): Softmax(dim=-2)
9 b, k" }- {) u+ F3 ~+ d8 @; T- P            (relu): CELU(alpha=0.01)9 f# U1 z0 ?3 v5 o6 b& c
            (expanding_conv): Conv2d(48, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)
7 B( _- {8 U3 x6 c9 Z# ~            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
9 j4 C0 X* d$ k9 P- j          )
- R+ z1 f/ Q( V- Z6 m7 t        )( y: `+ f! k2 e
        (tcn): Sequential(: i) _! q5 ]0 X( ?
          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)' H, p% c! L1 {/ r& L# d& e
          (1): ReLU(inplace=True)
: ~' q6 e+ P. @4 {) N& B          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))# P5 }5 L: v5 g& m# [
          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True). z3 l8 J0 I4 D6 _" E6 \
          (4): Dropout(p=0.3, inplace=True)4 d1 q7 \) j) q2 d6 H8 |
        )  B* F8 n* T8 R# H+ [. s# `
      )
5 I* b4 {( D/ v5 `      (5): ConvBlock(" h3 M+ J& C, d; |& P$ }, }
        (act): ReLU(inplace=True)
6 K( G/ |* ^0 U" i: B& Y3 |) v* f        (gcn): PyGeoConv() f# x% D) W) l
          (g_conv): SAGC(1 k  M* Y5 K  [( }  S- H
            (conv_a): ModuleList(5 Q5 ]5 u' O1 q& h- {: A, u; w1 ]
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))) v* x& K" J; l' |6 ]
              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
2 s% I5 S& l1 I; f. I$ I              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))) {3 i( Z" H8 `; e
            )
5 `4 j5 p7 g! b, M            (conv_b): ModuleList(# M: M$ f6 U7 l1 Y' H
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
9 U& a- k+ A3 ^" C8 O+ L              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
1 v' }& [  Y: u( a3 w              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
" S0 `8 l  r7 r2 j            )8 \* S+ p- e; r% j8 G7 Z6 ~* f
            (gconv): ModuleList(
; w, A) c2 ^8 @  [0 S2 M* [              (0): GraphConvBR(" }* K9 w* u3 e& G
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
. @7 x: m6 y7 B& y                (act): ReLU(inplace=True)1 x$ S4 W9 Y& `9 c
              )9 ^) [9 R4 h* t
              (1): GraphConvBR(. K) v5 O' M' s
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
2 ~7 u- m! p  m  b% ^                (act): ReLU(inplace=True)
2 w1 b5 @1 c3 _, T              )5 a" z, ^" E) t; q3 w( Y  q4 ?5 U
              (2): GraphConvBR(
) o3 q- Q9 f- o3 E                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
8 D7 i! B% I3 i" t                (act): ReLU(inplace=True)
! j8 r3 X0 t* [! z5 w              )  ~& `- q& n5 m- \
            )2 s7 I3 a# p" O  J6 h! r
            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
! R) K& `3 o% t% e$ b" g            (soft): Softmax(dim=-2). s% U' r0 [2 |! F& m0 s
            (relu): CELU(alpha=0.01)
' \! k- l( J2 i            (expanding_conv): Conv2d(48, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)- G, C! K3 c- b$ o! |" ~. u6 k
            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)( z' P6 ?9 a* F0 m; A+ f
          )$ J' K# e) s+ Q8 x, s0 U
        )* v' z# ?; J- X- c+ ^- Q5 D
        (tcn): Sequential(- r% i. c2 v* y5 e9 w
          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  p0 ?- R8 b) u$ F- C          (1): ReLU(inplace=True)
0 f: p# D4 r0 o8 S1 V6 Q          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(3, 1), padding=(4, 0))
' c' n" Q( Z4 Y5 w          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)" i% p3 B0 Z9 Y
          (4): Dropout(p=0.3, inplace=True)
, p* }2 e+ a( Q3 a3 i+ k        )
. s, [/ `& [) o* G  K& d" B) M3 m# L        (residual): Sequential(/ @" p# a2 i5 C3 l9 i. m
          (0): Conv2d(48, 48, kernel_size=(1, 1), stride=(3, 1))9 m& R! I' b( v! J/ {9 @+ A
          (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
0 t: Q. K! q9 r1 a1 M3 X9 n        )
! m8 I2 E; O8 v4 k: H      )
/ l* _" p) Q4 F' i      (6): ConvBlock(
( `4 o1 x. C! ~* c$ e3 r        (act): ReLU(inplace=True)
: [. C( I* O! |        (gcn): PyGeoConv(
: q, B  V2 ]: d0 U1 l+ E          (g_conv): SAGC(
2 b2 A$ L+ P  j. s+ m0 F            (conv_a): ModuleList(8 ?/ _( j% O" E4 n6 n
              (0): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))* ~" h! _; ^2 J1 C! }* Z
              (1): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))
. s: m8 Z* E  L0 C0 y              (2): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))
- g  F6 n& U& ~. G8 ?( ~5 o0 B            )
$ K$ @# u* k6 y5 s( L$ _4 q$ [) F            (conv_b): ModuleList(! b* d. s& I3 a: H
              (0): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))/ t- `. S+ Q7 o! L$ N
              (1): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))5 z( O+ c" W" l6 ~  W
              (2): Conv2d(48, 16, kernel_size=(1, 1), stride=(1, 1))8 f9 h! `; i. Y& d$ _
            )
7 [( ~" W' E. g: J+ @            (gconv): ModuleList(9 T6 `  ?, T/ V2 \/ R
              (0): GraphConvBR(
4 B) R8 ~4 y' r) @, `  o5 M                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)! }- N1 `& }7 S2 X) I# f- V
                (act): ReLU(inplace=True). G& u2 F/ W( [
              )1 r: O4 n+ L. p' }  [
              (1): GraphConvBR(
0 c; q7 @2 Y2 T, j                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)7 ^, n3 z5 O9 w
                (act): ReLU(inplace=True)
$ e  j- c+ T- R- h: m1 Y              )
( q  m5 |: E6 M0 {& J( g, P& y* c% ^              (2): GraphConvBR(3 S/ ~1 @) }% _5 G- J
                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)! ]* r- M% E7 v1 O: ?- N
                (act): ReLU(inplace=True)4 ^" j9 ]" ~5 G; {3 _8 h4 J  h
              )4 h7 j/ d5 ^, ?
            )4 q2 Y4 F- f% b/ N+ Q9 ~" J7 k" P
            (down): Sequential(
8 I1 M; `3 F9 M3 F# J( I              (0): Conv2d(48, 64, kernel_size=(1, 1), stride=(1, 1))
9 o; n$ j, F, M# }. X              (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
$ ?. a) ~( f9 u$ k! |            )8 h/ M% {6 G, g4 ]
            (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)/ o( p' a7 N- P; O( b  e$ Y
            (soft): Softmax(dim=-2)
7 t% F4 q9 H9 }( L! J& J            (relu): CELU(alpha=0.01)% T+ s" F7 }( j6 e2 G- w
            (expanding_conv): Conv2d(48, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
0 |; U, }* \3 [( i: I            (reduction_conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
% R' P. [  R5 |, `. q9 m          )1 {1 V0 A8 x# J/ q+ r7 p0 B
        )
  j; U$ D) W. V" C( I        (tcn): Sequential(
5 A& a! P5 D3 x% o: S; B! f          (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True), g1 v1 c. ]& V% e. d  D. r5 i  X
          (1): ReLU(inplace=True)3 ^: N' @  m/ ~, E* g+ `
          (2): Conv2d(64, 64, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))( Z* y  K+ j. O" W$ `
          (3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)$ |  B0 M. `: E9 _# o. p" }
          (4): Dropout(p=0.3, inplace=True)
4 e  X6 k; V  q+ d% W        )/ O# K# S  A1 c8 B2 G
        (residual): Sequential(
" y) r3 y  J8 }3 z4 G0 [5 R1 d          (0): Conv2d(48, 64, kernel_size=(1, 1), stride=(1, 1))
3 V% E# z& N+ x1 y7 j          (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  [3 h. p; |: K4 K1 a! ]8 {0 N        )! n/ L  Q4 _" R; U2 `: G
      )
9 v* p, N7 F, u6 @4 K      (7): ConvBlock(
4 O) u# Y7 b- h2 Q, z" K        (act): ReLU(inplace=True)# A% Y- I8 d, o4 Q; W2 B
        (gcn): PyGeoConv(
. n) ]1 v! d' M: o" s3 E          (g_conv): SAGC(
) V+ p5 V* u5 N3 V$ \            (conv_a): ModuleList($ A- n; N) R+ G/ e
              (0): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))) @6 n/ C* j3 V$ s
              (1): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))
2 u& y: W$ n8 W6 S8 P0 T; X% u              (2): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))
4 h* t7 z. r' U9 _6 x! G            )8 r) ?1 i2 r- w+ T2 P7 |
            (conv_b): ModuleList(
( F- `% X( {: \7 k: B              (0): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))2 }; h6 P- t, c$ {( O
              (1): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))
" \% |- k: U% k              (2): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))  U4 ^7 p( C  Z3 o2 f
            )
+ k! x% M8 F  Z6 q2 j            (gconv): ModuleList(
4 u* \" L3 w& E( X              (0): GraphConvBR(
) R$ H# m3 K) U! Q4 c; b! h1 \3 M                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)$ |5 b) [4 N2 G8 D
                (act): ReLU(inplace=True)
& t( {5 x' Z, `, V; _5 @: L: c              )( a& u3 z3 H% {* `$ }2 C/ E
              (1): GraphConvBR(
9 z& G1 T1 R; X7 A9 P8 r                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)" B9 G- O2 k9 g& S5 X1 H7 j
                (act): ReLU(inplace=True)* Z# F2 A! V% F! Q" u
              )
/ \/ F6 `4 y& H5 X3 Y              (2): GraphConvBR(
7 `1 p& N- u- N* n0 z                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)2 [; Q* v. \% }/ t; I7 _8 Q
                (act): ReLU(inplace=True)
2 Q- ]1 ~/ S  Y* m$ S. F2 {6 F6 l              )0 I0 ]' P( T2 J/ \& {% |
            )
. }2 C7 G" d! w4 ?- H            (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
% c( x# G, W/ D% J* e            (soft): Softmax(dim=-2)) I6 r- t4 J0 h" B- }$ X2 i
            (relu): CELU(alpha=0.01)* ^: O! ]" P3 K2 e) Z% k
            (expanding_conv): Conv2d(64, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)8 {& P7 R4 }7 A3 V8 i  A
            (reduction_conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
1 b4 L7 Q! Z8 }5 y          )7 Y  Q) C" p& g7 _9 s8 A
        )
9 g% @) S( J9 Z6 b        (tcn): Sequential(: V% V! e; F/ T, o
          (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
$ ]& m' X- L- q& z! `( |  H+ A4 ?8 h          (1): ReLU(inplace=True)9 J4 t. P$ q# Y5 N
          (2): Conv2d(64, 64, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))  D/ \% c8 q3 K& t/ _
          (3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)5 L  U$ m) c  {+ r7 q9 K! b
          (4): Dropout(p=0.3, inplace=True)
5 Q( Z: J0 O6 \; t        )
& A5 w$ w% M( w7 f4 w$ {4 s      )
4 N. \6 ~' @; m  l2 V9 i9 k$ K      (8): ConvBlock(  ^$ O6 T5 b2 c* g; ]4 U2 g
        (act): ReLU(inplace=True)
* x* v- P2 a+ G6 s  t        (gcn): PyGeoConv(( U1 q' R, Y. S. `# h; [
          (g_conv): SAGC(
+ q) D6 Z; ^5 _7 [( \            (conv_a): ModuleList(
3 q0 E' c& F3 ^# v0 B- Y' R$ y$ b              (0): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))
% C; r1 e  K+ h9 P              (1): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))
* K7 I$ y4 i* s              (2): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))
% R! D1 h; {, J4 d& T0 k            )
4 z% Q" N/ o- r) M( f            (conv_b): ModuleList(/ o" x$ N' m( d! m
              (0): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))
9 ^: m1 y5 c" h8 a3 E& }              (1): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))% N4 A7 }9 _! z7 O+ b% ^
              (2): Conv2d(64, 8, kernel_size=(1, 1), stride=(1, 1))7 E/ x7 z; Z# V/ b
            )
8 m! h, K* _; t) d& r' X            (gconv): ModuleList(: [* i1 H1 W1 D7 a  n2 ]) }6 i8 p
              (0): GraphConvBR(" L) M; B% I7 b' S9 U& r* I* E
                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)( ^7 Y, H% Y- f) \. |6 F
                (act): ReLU(inplace=True)
. L# u* {" s% x! g9 p1 r/ P6 C; K4 X+ z              )
% ]" h$ L9 `) b  W              (1): GraphConvBR(
9 m, ~5 p# T' n2 P. k) B0 A                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)6 r# `/ Q: G# H( D7 x( Y, m9 v
                (act): ReLU(inplace=True)9 A9 h6 b- ^/ q/ A, e: L2 B$ H
              )& i2 Q8 Z* M% F
              (2): GraphConvBR(
: E, y- c3 O2 l                (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
0 t/ r7 O3 x4 e                (act): ReLU(inplace=True)  H6 v+ J9 ?5 e. Q& e" k5 V
              )' d$ @) ?/ V& c2 _( ]
            )
4 W% Z- J  m2 U+ G4 d            (down): Sequential(' s8 Z# J3 G6 [( M, m3 W
              (0): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1))
/ Q  ]4 _! u; W" F              (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)0 w% U% _' k/ X4 P% p$ b6 }* q
            )- t4 U0 h8 g6 b  l- U* W' \
            (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ m& t  V! T) ]5 o) ^9 t            (soft): Softmax(dim=-2)
% Y% c6 T# T$ T# i( e+ y            (relu): CELU(alpha=0.01)
# }6 c, E; V/ u8 V            (expanding_conv): Conv2d(64, 288, kernel_size=(1, 1), stride=(1, 1), bias=False)
" x: q# z  ]" m            (reduction_conv): Conv2d(96, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)6 D( F5 \8 O' i8 N  p1 S" [8 o
          )
( l9 t9 \" P/ ]! I4 D- @        )
$ r' W" ~) m$ w, F. L4 W        (tcn): Sequential(5 l8 l2 O1 M$ S+ x
          (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)( d& s1 R# \9 G, f: ?- j& q; z; K" c
          (1): ReLU(inplace=True)* N* _( E1 [7 O+ C4 H
          (2): Conv2d(32, 32, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0)). h" D) f- l6 ]( Z& d
          (3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  I# K4 f" z/ Z2 N3 o  [          (4): Dropout(p=0.3, inplace=True)5 f" u9 _& h) ?9 B1 n# l
        )
4 [. F) B. F  D7 B; R        (residual): Sequential(6 N% F" x/ X% p( O
          (0): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1))6 _9 S+ I( |* T
          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)& V) ~4 V5 o9 O
        )  G3 I. l5 P& m. L9 g6 u4 c
      )
5 X- Q% X& T  W+ I6 R    )
4 F7 C" w2 p4 ^6 @" I# C4 Z' n    (dec_final_gcn): ConvBlock(
1 A3 f- j' v- M* V      (act): ReLU(inplace=True)
8 \7 g7 j# _* W9 i6 s- I      (gcn): PyGeoConv(# w, A$ J+ h' f1 A, r* _0 N
        (g_conv): ConvTemporalGraphical(
! q% i  G' O5 V          (conv): Conv2d(48, 9, kernel_size=(1, 1), stride=(1, 1))5 j% r" o9 ?* M& E$ \. ~3 Q
        )
5 ^. ]1 X7 X; b8 M+ S9 x      )
, O9 x' ^% R0 |% G- z      (tcn): Sequential(
; }) b3 R1 z6 m& o9 M( g( n        (0): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True); Q, Y1 _. n7 l# ~" t" g* x
        (1): ReLU(inplace=True)
0 l+ H" X+ c" T4 _* y* F        (2): Conv2d(3, 3, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0)), A- f: r) [  Q) f4 W2 H
        (3): Identity()
7 h: l$ U$ |: x# z7 A7 O        (4): Dropout(p=0.3, inplace=True)
9 G" u/ M" V4 c3 V! B      ); e8 Y; p5 a! [! W" E
    )
9 W) t0 K% ~: y  r& K; p/ ^    (st_gcn_dec): ModuleList(% S8 a+ Q' d( o% D5 I0 n
      (0): Upsample(scale_factor=(3.0, 1.0), mode=bilinear)6 p5 ?1 `1 V9 m4 L0 m. V/ {& ^
      (1): ConvBlock(' p8 k6 M: n' [5 R
        (act): ReLU(inplace=True)
; E- f: c/ K/ T! T! `  C* ^) G% r+ e8 O        (gcn): PyGeoConv(
+ Z* E( }) R3 z          (g_conv): SAGC(( J6 {, r6 U2 W( [' R
            (conv_a): ModuleList(
; l; X7 S" R2 Y. `+ G9 F              (0): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))8 @; l+ |! _' X+ D$ t8 D
              (1): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))5 D# R! ~: T5 L5 v, G. T: y
              (2): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))
2 P/ P: c) R' U            )) @% ~$ _- a+ m) C% q6 m$ H5 M% A6 g
            (conv_b): ModuleList(
, C) J! @& ~7 ?              (0): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))
6 n5 O0 b* \  d& e% t2 a" ^% v              (1): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))& X  e( u: Z; H% \: [  [
              (2): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1))
8 a) }) V* \/ h; z( @, R, x- ]            )
8 V, s% D, {2 y! B- n            (gconv): ModuleList(
' c! p4 `* i* C2 b5 w# E( `              (0): GraphConvBR(
' t5 \. M+ ]" N, C/ W6 j% ]( \                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)7 r  l; K4 A9 M/ P+ W
                (act): ReLU(inplace=True)
( l& P: a3 c. a- F; l2 [              )
  g# z4 p1 l# U$ B  Q. p6 w              (1): GraphConvBR(
2 c6 t3 x; J% j: K                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)$ X# }- R1 f7 }( T/ {- }
                (act): ReLU(inplace=True)# p8 E0 M, V6 E& z7 ^& V
              )
5 z; q6 t  e( X: U9 c' i/ P$ W              (2): GraphConvBR(- X/ f3 g, |% }- l0 P
                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)  L2 J$ [+ e2 Q8 C% I. q8 U) ?
                (act): ReLU(inplace=True)7 Y0 Z$ y2 u8 }3 \5 h% }* e
              )
* E# B- O( L- d  m/ N3 t/ }            )
$ F/ w8 R& l0 {* |1 @. p            (down): Sequential(& i' a- X; ?0 m6 u2 c
              (0): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1))' A7 S( w. X5 y4 O
              (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
: n! L0 l& m- W            )6 o  P  q% y  F# y7 U/ H1 T! P& D# Y: M
            (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ k: a8 y2 f6 L            (soft): Softmax(dim=-2)
: [. H( [, E, M/ D8 W            (relu): CELU(alpha=0.01)% s4 Q2 T. O5 R5 F- u* @. w5 B3 z$ b
            (expanding_conv): Conv2d(32, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
* P: A8 j/ f8 _+ j5 _            (reduction_conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)( {# C* m( e* d3 [( W, E
          )! O7 n5 R9 I9 s! m" L
        )
4 e. ]/ F+ a3 @0 b! U        (tcn): Sequential(; n, h$ q) K: p6 k3 \! h* m
          (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)8 A; w+ ?% W. v3 L% m  R! h) R! R
          (1): ReLU(inplace=True)
( u7 t/ f) F9 _" R4 F          (2): Conv2d(64, 64, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))2 p/ d( @$ V$ C
          (3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
( k4 z. J2 M/ |  U- I% T          (4): Dropout(p=0, inplace=True)
! b5 W& i/ F- l; n: L8 m" |6 F3 B        )/ J2 E! t( U' |' Y. w9 J; @
        (residual): Sequential(. A, F0 g' l/ V/ e
          (0): Conv2d(32, 64, kernel_size=(1, 1), stride=(1, 1)). Z+ r$ f' J/ F3 D# q  g9 Y6 v
          (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
8 x0 n$ Q. u5 W/ b- G        )
( o2 U- X$ y/ x! F2 Q4 _      )
' i7 ~( r7 j2 W+ `# }      (2): ConvBlock(6 Z8 d; b2 g8 m/ }
        (act): ReLU(inplace=True)+ _' H2 n# z0 q- \$ N
        (gcn): PyGeoConv(+ R9 G1 v6 N$ x* F0 w0 u; g
          (g_conv): SAGC(
8 k4 Z9 H$ R7 N8 a            (conv_a): ModuleList(/ z1 o! q8 ~" \8 j7 T9 {  F
              (0): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))! |2 Y  x2 ^& k( L( k+ r9 ^0 h
              (1): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))0 q" a! C0 s8 _2 z+ i$ R
              (2): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))4 [1 M, y+ \0 [) M; T, v# z) h5 r" c
            )
8 @) O! x  k* r            (conv_b): ModuleList(  q7 {6 D" ?) e: x& o' F* ~, q
              (0): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))( F9 x. ^% L* B
              (1): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))
0 E1 V+ ~3 k: I              (2): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))5 x2 o5 |/ z# k2 k
            )
1 w0 m, w( C9 P! X            (gconv): ModuleList(
- L+ L0 a) o4 ^8 x1 V              (0): GraphConvBR(
% {7 f+ O& T0 e! L& k# R6 r6 U* I, p# \                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ @2 h/ ]9 s. W# S                (act): ReLU(inplace=True)5 ?9 d3 Z* {( A# o5 Q& R
              )7 D6 q0 q. F. V& I- S$ X
              (1): GraphConvBR(. B; R0 E+ {2 w: u: ~0 T# o
                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
; B! N/ ?9 R/ A: i- V# ~% [% o                (act): ReLU(inplace=True)
' [% m3 s2 M" q) w! r7 g              )/ t5 A1 e' Q0 L# A! `, B; Q
              (2): GraphConvBR(
: U2 P2 i' P: W9 I/ h; M3 Y                (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)5 Z7 ~9 ?) M/ q  }- U9 A
                (act): ReLU(inplace=True)
# z5 }3 m8 s# H3 d              )& C& h5 D2 z" G! a9 J% h8 ?
            )
5 l# ?" O" T  I, E            (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
5 F/ S- ]8 m# b1 R; h            (soft): Softmax(dim=-2)9 V1 ^3 Z+ a  M* M1 L, Y
            (relu): CELU(alpha=0.01)
1 F( z8 i$ a% C! }; a/ J            (expanding_conv): Conv2d(64, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
5 M* ~8 O/ h' n            (reduction_conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)- `7 N) y% P, B4 z' N9 A# b
          )
4 }/ f# P* E- n+ B+ a3 M1 H, }        )
1 a1 F) x1 `2 l# D        (tcn): Sequential(
. O$ b2 ]! f5 L4 N/ ?7 I          (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ a: s3 g9 S2 v) Z          (1): ReLU(inplace=True)
1 f+ [# Q; Z( S          (2): Conv2d(64, 64, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))' n# Z( b5 q( D- W& }# P
          (3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
# |( S% _2 z4 W' n. D% |' v          (4): Dropout(p=0, inplace=True)
$ B' T$ f) Z$ q- W        )
( U# H: t  g+ L0 G* r  S8 s      )
. m+ J+ T$ }1 z/ M. F      (3): ConvBlock(
! ]( u* v' R% g7 U6 \        (act): ReLU(inplace=True)
0 `& F2 z7 I+ ]. Y2 S        (gcn): PyGeoConv(
; H/ v$ R6 }( F6 G: t) |/ l3 {* h8 n          (g_conv): SAGC(
. J$ @. I8 N# ]* H( B9 `: R+ o. T            (conv_a): ModuleList(
9 A- ?. H2 }+ n3 h5 J7 x$ h              (0): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))
; c0 ]  ~$ ~0 C! T- V  Z              (1): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))5 r. ?$ t( @% k* j$ M0 A; d8 P
              (2): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))
* V5 l9 g% Q  Z- d/ u3 m            )
3 x/ J' A% \! ~            (conv_b): ModuleList(
5 l: c: L! x% a5 O7 I, I              (0): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))+ g6 Y" a2 ^. h9 A! P* a' E  U
              (1): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))/ |% P) w% Z2 v. ?- Q; M: ^$ j
              (2): Conv2d(64, 12, kernel_size=(1, 1), stride=(1, 1))2 w! G3 r) d  ~2 Q! E+ ]9 N
            ): \: [) g; _% i
            (gconv): ModuleList(
+ S* \- U. y7 Q% h              (0): GraphConvBR(' D+ D8 K: K9 d9 N: @0 X0 a
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)% N) S" X  R# ?6 I4 m  k5 v
                (act): ReLU(inplace=True)
$ Z: P8 O7 T' P! V& \/ l9 I              )
( x/ g! P0 V7 M; o& d              (1): GraphConvBR() O! U/ Q+ s2 F3 w- b6 W
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
7 L- d( f( L  a2 e* t                (act): ReLU(inplace=True): w+ l* j* s* p
              )
( n7 M4 S2 Y/ D: s0 T$ S1 y; F" j              (2): GraphConvBR(" e2 w3 o8 R6 s  s2 i2 [. k
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)* o7 w0 U4 _% X( c
                (act): ReLU(inplace=True)+ [3 N0 ~; J& @. D. y1 E' c6 S
              ), I# f3 o& N7 n
            ): z5 }" w; @- h& J6 h8 P! h3 R
            (down): Sequential(
; Y4 H% j; }- F6 a3 L0 ?              (0): Conv2d(64, 48, kernel_size=(1, 1), stride=(1, 1))
. L( A( m- Q7 r" z3 a, `1 _              (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)& X: j" P& @$ T2 y7 S7 D' D4 S( G
            )
. Q2 w8 v' z5 m3 J' E" A7 F( `            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)2 x4 e: E1 y0 l& j* F) m
            (soft): Softmax(dim=-2)
( |( s4 f& w5 Q; U( X. m7 E            (relu): CELU(alpha=0.01)- i0 P3 E2 L% R- s0 N6 ~
            (expanding_conv): Conv2d(64, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)( v. i% q- |* H$ @0 m, ^( J
            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
8 G6 }. ~$ i# m( o. \0 ^          )
" \4 n# V; d' N  I) x. P5 e3 t        )
! a8 \6 U7 f6 k2 K+ T        (tcn): Sequential(
( |6 A' U; [4 g0 ]4 q) v) L          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
0 P5 N+ F" o; J. D- b( e9 A& Y          (1): ReLU(inplace=True)
# {( _7 _* |3 _& K1 H1 ^          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))
+ \' f3 j" I. q' z# Q! l& f          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
2 a8 E4 v' I, y8 T          (4): Dropout(p=0, inplace=True)
1 u# Q5 n2 u- [( c1 {0 v        )" E- K5 a9 Y* I5 U' R5 g) j5 G7 A) H, ~
        (residual): Sequential(5 y# c: q5 W' w: i/ h( b
          (0): Conv2d(64, 48, kernel_size=(1, 1), stride=(1, 1))5 @: j8 W2 X+ a! I: Y' K( R- Y
          (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
4 A# n# m( f. v" C! O1 _5 n; k        )% r4 I9 }6 b, L& M1 d+ o4 \
      )
. W3 H( x9 o. x( C6 c      (4): Upsample(scale_factor=(2.0, 1.0), mode=bilinear)
( f, x( H; W% g$ t8 x. S  H1 [      (5): ConvBlock(
* i# f5 ~% ?1 y7 ?  y        (act): ReLU(inplace=True)
% i" w8 Y  `( A- @8 {: O9 E# `- p( D        (gcn): PyGeoConv(
) N: ~5 l, r7 ?1 _          (g_conv): SAGC(
, W. Y) q9 b4 p' f+ V, b            (conv_a): ModuleList(3 P0 G  q7 ]& o. q! j7 M
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
: |$ b; W- x4 S' e4 x6 f              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
* |  Y. e4 e: `$ C) [+ z              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
; ]! e" m, J! ]5 G' n            )
: w# ]8 O2 O' ^% H            (conv_b): ModuleList(
7 w+ p) G$ E% m              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))9 S- i; y* n4 N( a% Q& }  ~
              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))( h; x4 B, J, F% L4 P" [
              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
& |6 ~! J* q& @) J' j& Q5 K% h6 v' b            )
4 z8 e' R/ ^& \% n& `            (gconv): ModuleList(
6 R6 p  l0 y) A# I              (0): GraphConvBR(
' J/ m& n- ]- q  x( I                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
$ T3 X& N4 Q( ]* [' U' l- D9 W                (act): ReLU(inplace=True)/ |) z9 e& X* T3 d+ i" y( z
              )! W; m7 o" N8 n8 ~) [4 H
              (1): GraphConvBR(
( q3 i" T" q( x( Z                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
/ e! N( L' p$ [" W' z1 A4 N                (act): ReLU(inplace=True)
6 a! P. k2 b1 z2 O6 c              )3 m' R; x9 A, |! V- \) B
              (2): GraphConvBR(
# ?& u. j- `5 b" l0 d5 a                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
. w4 K- M/ h! H, D6 B                (act): ReLU(inplace=True)9 `3 F* ^8 O: `9 ^& B0 }
              )- i9 {" y5 q& a9 L
            )# p. k3 R8 u$ `9 @1 B% I( g3 \
            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)/ w6 A% p% o% ?5 K* P4 H$ L! S6 `* b: \
            (soft): Softmax(dim=-2)' C4 u" A/ L8 c% L4 Z2 G7 q+ V
            (relu): CELU(alpha=0.01)
! u8 n  b; h4 u$ I            (expanding_conv): Conv2d(48, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)7 q$ @  a$ C; P! B( A0 l7 F: {
            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)8 ~( ?% v% y/ v& U
          )
6 t) }8 g  f0 `5 B4 f& b        )+ n  B) z; p, f" [% q4 Y  @5 y
        (tcn): Sequential(  |$ q! F% ]3 Y" |1 l) J
          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
, V  A% P8 d. i0 L3 N- b$ ^          (1): ReLU(inplace=True)
: q* C! w% K. @! s2 F) X3 y          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))' X0 P3 w% |8 m/ e" r3 \' ~
          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)% A; s4 w( d, [: P
          (4): Dropout(p=0, inplace=True)4 f1 E/ }, o1 I& ^9 |. N0 T
        )8 B7 x. s: F, q% @' }
      )% {  k3 N" z4 v) }3 K+ Q- a
      (6): ConvBlock(
3 o6 V( `! B, d/ V9 H! l        (act): ReLU(inplace=True)
/ t% y, e# S, z6 {5 ?5 N        (gcn): PyGeoConv(8 S2 e/ Y: x8 S* U/ Q7 G
          (g_conv): SAGC(3 _. l1 e2 N: P  U& }9 h$ V
            (conv_a): ModuleList(& ^" Z  s; i# H! N
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
1 D( C* f9 C7 Q5 N, ~2 d              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))/ K/ R% @$ k. p0 C; \4 p% }" ]
              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))  y' \+ D/ l% X
            )
  O! G) N) c# A& y- ~            (conv_b): ModuleList(7 n7 ~4 k5 C" @9 ], Q
              (0): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))/ s  c% k& R* y
              (1): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))
# c1 F2 E$ j# k3 m) O% G& p              (2): Conv2d(48, 12, kernel_size=(1, 1), stride=(1, 1))2 k3 z8 m, T' {! Q" u
            )
7 j& A/ D, \" w" D; J            (gconv): ModuleList(" O  H( n: Q4 C* d3 r$ Y; H
              (0): GraphConvBR(* X$ r$ Y* z: g% ]0 H8 k& f
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)2 h/ u; k  B+ h1 o" U
                (act): ReLU(inplace=True)
, t& e6 A. Z9 @" U              )# f4 \3 M2 m! y8 q2 V
              (1): GraphConvBR(0 z& g9 \. j8 d3 y. s
                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)0 I1 u9 W. U$ t/ F$ t
                (act): ReLU(inplace=True)/ P! o) V* p; E# `6 H: o; U
              )
' H  \' ?) j& s8 d              (2): GraphConvBR(
" o; H" i# K0 l% R, j, i* r                (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
& X9 ]( o+ D  }/ c                (act): ReLU(inplace=True)
( o: W$ K8 ]- [' r              )% H5 P2 V! E6 n/ y' ?
            )
- l. w: N" L6 x0 r8 z# s4 [            (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
' }5 b" ^+ [) z/ M4 T) R2 c" {5 i2 Z7 q            (soft): Softmax(dim=-2)! H9 p( F" q  x" B: \! q
            (relu): CELU(alpha=0.01)9 j  I6 {' U# ?0 Q2 @+ u$ O
            (expanding_conv): Conv2d(48, 432, kernel_size=(1, 1), stride=(1, 1), bias=False)
) B% L, D- ^: J+ ~            (reduction_conv): Conv2d(144, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
& |) s0 q3 R* R9 P" I/ }+ v          )& A+ s" a9 Z- R' J  A
        )0 j; l: F% }  W6 Q/ p' d8 ?4 ?
        (tcn): Sequential(% g, A1 H% s3 q! Y' L
          (0): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
! k2 Y" p  U! O; p          (1): ReLU(inplace=True)
4 a$ T- g. J# B# c: X; ^          (2): Conv2d(48, 48, kernel_size=(9, 1), stride=(1, 1), padding=(4, 0))
1 V, {1 L# d: h% A6 U          (3): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)7 Q9 d0 G$ H) @! _
          (4): Dropout(p=0, inplace=True)! o1 _- K" g4 q; _5 v  {5 O# L
        )
% I  N  a. z- _7 C' P+ w# e      )
0 x) ~: o) w7 K    )) T- P1 |- j5 Q; i0 W
  )
, V( V4 `/ F" j) T9 L/ p1 `)! X0 [$ V& u3 |9 H; O& |! G( L, P* P. r) {
————————————————: S# B* `" i% l4 a9 P! F$ O( r6 L
版权声明:本文为CSDN博主「FakeOccupational」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 {6 ^- c) Y1 U1 k6 d* k
原文链接:https://blog.csdn.net/ResumeProject/article/details/1266784966 X) k- ^! e7 G2 |1 \4 C. l

3 p) A! C& Y5 {! M! F* t/ J, I7 I* p
. ?  s& o/ f% F' n( V  E2 p




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5