数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-5 15:49
标题: 骨架图算法Graph Embedded Pose Clustering
骨架图算法Graph Embedded Pose Clustering
1 `8 Y7 D5 e* P0 f0 R3 A% T! E) F& X- A: z0 W- p" x: C! h
骨架图算法
* k* y+ c/ F# Z4 k  i9 C! r7 t7 U' a4 b- m6 u

; v/ S' c- @7 Z5 \* U2 CGraph Embedded Pose Clustering for Anomaly Detection3 X/ M+ l" g# @1 s0 `* C
paper        code
+ S  }0 K! P' khttps://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc
- s) _( D+ z) F$ g8 @5 C我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。
0 F5 Z& r, U6 o  M! K- o' d7 C# \! {( H
首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。
! H) {. D7 L4 n- g5 X5 J5 k; V1 `
! c# @4 t$ ^+ i! C+ u9 |图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。1 T. p: D; \1 q
为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算
- i) x: U. ~7 H7 @6 p1 ?0 z' D
6 w9 v4 O8 C7 i1 f我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。. G% V) D" r- [1 Z  O$ A/ |% F4 M6 \

; `! ^7 m1 k0 g' L+ d5 v/ g3.2. Spatial Attention Graph Convolution
3 w) A& t: j2 l# B; s我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。
7 ?; N7 t; |( [. f) O3 t2 p3 S1 t5 ]8 b
GCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。
6 d& h" Z* Z1 u+ p4 ]2 S5 A& U! I- w, n
三个邻接矩阵捕捉了模型的不同方面:
; U$ n' N2 K; Z3 `' `( s(i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。
& V2 }8 D5 M9 ]( |- x0 P(ii)由全局邻接矩阵捕获的数据集级关键点关系,以及
2 g# ?3 \( Y  j" g" `8 b0 g(iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权
2 Y' u9 L$ u9 n3 e
8 }! c4 N4 ?+ B1 g3 `+ m. w4 l0 U2 i) O* ~  l8 L+ @9 N8 F0 v
后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。
# a3 E# C' d" _5 z3.3. Deep Embedded Clustering
' m8 E- Z! }2 m; ]* I/ A为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。' {  s; d$ Q" u% C9 L( D' s

  _& B- C8 i& P* v) k7 {我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。7 S* v% I" ^! S  r
- Q9 |3 o2 l9 Y8 E7 F2 e
具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。
/ ?. L6 _) u3 I8 S3 t% {3 C; g* S6 x1 a
ST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。. O9 n: l" i7 \& S* n
2 T; k1 r! [/ r
符号        表示
) e" t0 {% D% n% z) O- O- B( Kx i x_ix
* c% s1 {  z7 e3 e9 P' D8 ni2 g+ U* Z- O+ c% x

; @" d5 S0 X; J/ A9 i1 i7 ~  i  O! O         输入示例
1 S. m' e0 H" N6 _: W; Wz i z_iz 3 M8 A; A! J  v) J) J" i
i5 ^7 y; S' H, E/ I
& l$ m$ S+ w& s+ ?  V. _
        编码器的潜在嵌入
' N* |# T) f( m% Cy i y_iy
9 e; a  r8 S7 d9 hi0 S( f3 a; D4 S9 x7 Z

, t1 d: I, g/ U  l' v8 A         使用聚类层计算的软聚类分配3 |  N! u5 H+ E# D* r9 B7 a7 L
Θ ΘΘ        聚类层的参数
, x0 _( ^7 [, P  ]p i k p_{ik}p : X; n$ G; d( W% [
ik8 s" z" d/ s/ k% F  z4 W: Q' g* B! v

4 i! W3 \6 D: p7 G6 k, ?: c1 }         probability for the i-th sample to be assigned to the k-th cluster9 U' M& T% _/ d$ A

& m6 b  o7 g- Y& q  S/ p" V/ @! t# G+ F: P1 z3 O& o- B( Y$ V
我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:& D& `# X& J" U- p
7 x- L7 V, p9 \' Q( a) k1 G
3 d' C  b+ I, d( O+ {- ^# e
目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:3 i. \9 g8 o# p; C
  E+ I$ y6 s8 T/ o, `* R
0 `. Q. q: A' @- c
聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。
1 g6 J* }5 z, t! w. u0 a/ ~) t" a8 ~在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。
! ^& \- R- _  |! Q" v  j5 A' }# L" t! v* p! H
3.4. Normality Scoring& g5 @0 s5 J9 j8 R8 t: J
该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。
5 H, c2 ^  U4 q8 d* M( |  O1 O软分配向量本身(捕获动作)也可以通过多模态分布建模。: V# ^  C) n1 X& D4 |6 P8 p

5 m$ o7 K! h! ]; M1 X8 R2 qDirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。
) t4 F0 d  o0 ?5 u& v
6 N8 i4 O/ h# V. u$ {$ ^, JDirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:
+ h" Z. A5 _7 @) a0 n' F7 U- d7 e* ~(i) 估计(拟合)阶段,在此期间评估一组分布参数,以及. ~7 r& v8 S7 l% N$ w+ N& [0 Q! d5 H4 i
(ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。/ Y' R$ ?2 q/ T! \

$ R8 h; _0 G  I4 j$ s6 M! T. IDPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。
$ D% c1 Z& Z! v# k* M" O  l4 B6 N/ w+ O+ C/ U  d& O" r
3.5. Training0 |6 v' U) _. o. K1 S' h
该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:4 U- J7 E! w. J% i

! k3 H: ?; S7 I" _# W& g9 {1 }Pre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失
7 y6 p% o+ e6 o0 L9 v3 j0 U8 U. a( ]  {% H6 L
Fine-Tuning:. f8 @1 z) e* i- Z( E4 _: s
该模型优化了由重建损失和聚类损失组成的组合损失函数。
- F* ^# f; W8 ]; _" u进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。
" o; _7 U# a; i3 u8 A集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。
5 A9 J" F1 Q, p, c/ i* l$ w( X# H- S本阶段的综合损失为:6 U0 {) h$ n8 l0 O3 F) i+ p  z
) s8 Y& V# H) e4 a/ M0 J
! \2 C2 g, d, m

1 E* K& h5 b0 Y3 n, S$ L) ~* H实现细节
. `2 t& K$ x# p) b8 I& A" f* P% o1 E8 |' {

7 o7 P6 Q! R4 Z$ E# q8 D) k! a$ Z1 \6 K' {  F
def calc_reg_loss(model, reg_type='l2', avg=True):! A; h1 j, b+ r! Z, z/ J: Y5 J; |
    reg_loss = None
& c  B) h/ ^# f0 v- b- W, b/ ~    parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)
# B: `8 n$ Z$ d* [: d. F6 ]    num_params = len(parameters)
8 J0 T5 u! l' U" \; ]    if reg_type.lower() == 'l2':3 Y/ c, s1 e+ ^: k* Q. @# L# f4 @; h
        for param in parameters:  ?! Z9 S$ n5 p
            if reg_loss is None:
7 |' a3 A: G* |) b' [                reg_loss = 0.5 * torch.sum(param ** 2)+ h- R- E) ^/ u7 L# L1 h
            else:! s* {; _0 j2 ?/ e  E& ]
                reg_loss = reg_loss + 0.5 * param.norm(2) ** 2/ k, u! w6 e6 Q
; V# \9 }9 K. H
        if avg:
2 h9 a" w" t8 P$ z3 G            reg_loss /= num_params
2 ?( q1 I: A2 M# l0 E- V# g        return reg_loss
5 t4 s$ f7 K5 Y8 N; C    else:
' \- f2 q1 S) b/ K6 |+ i6 F. w/ ^        return torch.tensor(0.0, device=model.device): n* s( v) u% u3 v8 L9 F( t
12 E& b. }2 M  K3 w
2+ _. i1 f# `) n8 }% n
3
+ C& B% I/ a( |% b1 X4
* l1 `( [9 n. Y' T. ], P5
& X# C- {! d. j' m1 W0 M6+ P% t) N9 F+ t
7; v0 k8 c; |$ `' Z
8
" ~% L0 F) f) O! ?% G9
3 Z3 r2 ^& ]& \" M! b! }  i! l10) y2 O. l) J  u. |
11
/ i, b5 Z) G  R7 J- u12
& v5 h& v: `3 T13
2 K  Q( ~' e  \# y( n4 k14
8 @, C! D: M% M! U# f  v15
# O8 v: f- _, ], P1 [( Y9 }16- C5 h' [5 p: B
, z& H! k7 _* \# x) j

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

; D' [' \) _' o( J% ]" x- c
7 @9 L$ \3 |5 w. Q: ?5 t; x




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