QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3172|回复: 0
打印 上一主题 下一主题

[其他资源] 骨架图算法Graph Embedded Pose Clustering

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组: 2018美赛大象算法课程

    群组: 2018美赛护航培训课程

    群组: 2019年 数学中国站长建

    群组: 2019年数据分析师课程

    群组: 2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-5 15:49 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    骨架图算法Graph Embedded Pose Clustering
    . L/ B* W# o, v& i: B
    " {. U8 G# j/ l2 P4 a7 A骨架图算法& d' Z" X6 B! x- |" s

    . ]' Q, H7 F9 z* m. o8 [6 `$ V6 V  r6 O4 ?( G- i" |/ ]% \
    Graph Embedded Pose Clustering for Anomaly Detection. O; u3 G% A& P+ @1 N+ T
    paper        code) Q* c! c' |& ^$ t! X( j$ z) m
    https://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc# R; b' m$ E, Q/ E" P7 z
    我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。
    9 p& y7 a9 g1 t9 j- [$ Y" W1 n* [
    " t7 t4 u- _3 X" U. `9 j首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。
    $ e. b* J+ D5 d, K9 [& X: h* P) r+ t& v5 G$ b1 F1 c. r
    图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。
    ; b5 M  t6 f; Y为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算
    " o- q, |' u2 v% Z& n7 q6 @
    * f2 v/ p6 H: n6 X: k3 k! W我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。
    - t% [3 E! d" R+ u  l% T5 o9 `# a" I& U
    3.2. Spatial Attention Graph Convolution
    1 K- H9 `+ D& G/ ]- F+ j我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。
    ' {: j3 m# Q" \9 g4 ~) y9 b
    % S" H& t  H; a$ I9 O. X1 i! M1 KGCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。
    7 ]& }- Z) _, X7 |. i& I( L& j. n  {6 H0 H
    三个邻接矩阵捕捉了模型的不同方面:, O3 G9 R0 v! c5 R
    (i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。
    , M$ E: @0 u# z$ t, b5 \* x(ii)由全局邻接矩阵捕获的数据集级关键点关系,以及) [+ B6 i; ]: Z8 x/ z* t7 F) B3 f
    (iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权
    ; B5 ]- @4 {6 _) V4 d; I- K9 Q0 S/ ~3 ~

    - [' V7 N7 j" ^$ C后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。/ O. t$ Z; ]6 m! P
    3.3. Deep Embedded Clustering- F8 ]0 ~& {: V+ x% h8 N8 [! e
    为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。
    6 ]* N% w6 @* Q2 ]# h% F* y% p9 c2 x
    % @2 A9 S& ^" U$ u: |我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。
    * M; O1 _; K( Q
    , `( }0 I, Z4 d; g' D) E" C具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。
    . s$ ]% d2 @( M
    + A- n9 Y% w5 _; Q- k6 yST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。8 [! ~. R& J# q3 t7 ?. @1 @. C
    ' a% k3 O8 x. @% @
    符号        表示
    . c6 }. e# T9 L5 vx i x_ix + j0 y( g4 Y3 F! A3 ?: @: N
    i" W. s; S# S! n7 M5 x! M
    ​
    # p3 @1 M  q. I         输入示例# N9 x6 u( ]2 f( v% m
    z i z_iz
    ) O1 k; @8 p$ p7 e) x! s: ki
    9 O# J# G4 H1 B0 U+ }3 G& ^9 k& J​
    6 U( E3 i9 `: i5 o         编码器的潜在嵌入( R- [& f& C( r' ^2 O
    y i y_iy 3 Z7 v! U( T- X' ~
    i( Y9 d3 [! f# u, m* p  i
    ​2 N7 P# I- h5 u3 H! v, R
            使用聚类层计算的软聚类分配
    0 {  Z: r: x# ]+ v0 Q( IΘ ΘΘ        聚类层的参数2 @+ n+ \# E% a
    p i k p_{ik}p 7 Y0 Q9 @2 @$ w( W$ \9 S+ M
    ik
    : ~; k% Y  S) g# ~1 D​5 I6 C* i- D5 V4 K
            probability for the i-th sample to be assigned to the k-th cluster
    ; K8 t* R3 O: D2 L6 Y$ S0 o8 h! `* a3 P  D% E- _
    1 |: J) Y: I* D! N) q0 p& T
    我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:9 g% L9 T9 s4 [# p

    3 Q8 f( ~! I4 X) \  `& z( L/ g. M3 l& R' Q6 u
    目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:
    ' |' {- S8 ?- w6 T, h$ h: M8 x4 m# T: I9 _: ?

    ( P! Q. y! J* k+ I# A! R3 R聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。6 C( E- `% U. b0 D
    在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。
    5 T( Y8 |% M9 H4 E. B
    / l% q2 w3 ?" [9 q$ L1 }3 f6 n3.4. Normality Scoring
    % F3 N4 c) P( R& u; D  \该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。5 V8 O; ^0 g& d# W$ D6 C+ |; K
    软分配向量本身(捕获动作)也可以通过多模态分布建模。+ I9 i' i) q7 [7 d1 I6 b) C

    4 g: R# G  l* a& q& D) CDirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。
    ( t( h$ e) i; ~% C# `' }
    2 P# D1 u0 z9 Y8 pDirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:
    3 j/ J; X8 A! t; q(i) 估计(拟合)阶段,在此期间评估一组分布参数,以及! j, c( i1 e3 p& R$ C2 y& x
    (ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。
    4 A7 A4 F. G5 _3 I, p- S& V# y  M6 z2 i9 j0 V3 {3 X/ o
    DPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。/ L: G3 C6 m; X; {9 ~
    ' h3 j+ v( W" D" l  a
    3.5. Training+ v' k& z5 y" b  C3 D/ o+ V2 i
    该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:/ `" J5 J5 D0 Y

    / t6 L7 m, q, C2 Q5 M8 APre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失
    / W6 {( h& v2 K/ \
    9 W' e) Z$ h6 `  K3 \Fine-Tuning:) k2 j4 [" Y7 z% g$ \: \
    该模型优化了由重建损失和聚类损失组成的组合损失函数。
    3 I1 q0 k; E7 x: b' s$ ^/ k进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。6 e; @% g3 p& X% y! I3 P( Z
    集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。! q9 {0 r) U% s- o
    本阶段的综合损失为:
    + h. ~. `& z9 a: u# q# ]) |  E9 a; w, O) ?  `
    ; ~0 e5 g" H2 z' j7 Y: O. C
    3 k2 f/ V- q" ?/ Y$ r+ l0 U  u
    实现细节
    ! c0 H/ q8 D& z2 y4 l, c# P
    $ r- o% K, A! X0 J0 F; ?$ I
    5 T& f, N# o; w5 C9 W& T
    1 ~; }8 K/ r; O1 `! b3 Kdef calc_reg_loss(model, reg_type='l2', avg=True):
    2 m5 O( Y& _1 b    reg_loss = None' J. S0 F6 U: v! d  M8 W" O
        parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)
    ( t) x, |1 S/ e6 R' J3 @    num_params = len(parameters)
    / ?' l2 `3 a4 j' j9 T  B    if reg_type.lower() == 'l2':! c* ?9 }9 N! _% l
            for param in parameters:
    3 Z8 g# h1 p" o! U1 e0 u5 x' g            if reg_loss is None:7 r* B! Y/ H' q9 R5 N) ]! H% E
                    reg_loss = 0.5 * torch.sum(param ** 2)1 p9 ]  l5 s% g% ?3 k
                else:& L) e2 F3 q$ l
                    reg_loss = reg_loss + 0.5 * param.norm(2) ** 2
    0 q) W8 c0 r0 I7 f& K0 f' `
    & e$ S# c2 t9 {) P8 d. ^        if avg:
    8 i" x; A% r( K& z( I# i            reg_loss /= num_params
    2 Q( h' z1 H$ U" l7 T* e; g        return reg_loss* r3 @# F* R6 r( W5 K
        else:
    & g$ t5 F) s4 E! T# _' W        return torch.tensor(0.0, device=model.device)8 Z( w( S* N% h$ P- t0 W4 X$ R: W
    1, j8 m2 x) U& V9 B7 {
    2
    / Y7 }0 e$ Q8 ?" I$ w6 Q% q3) o6 |! ^. N. T7 o/ [
    40 A" R8 k/ {8 t/ ?3 }- T: \* M% j
    5
    ; Z! Q/ w8 p- S6
    0 X# ?8 H9 S* D' A- V) ~7
    / \+ u; G+ b3 g! p8 k7 B/ Q; E4 |) G8
    7 |" R* I$ ^7 S+ P0 \* |: X9
    % r" r- i3 ~1 E10
    $ _' f# A4 Y. Q+ y) m$ ~  H' |- Q11
    ( c2 t% V3 n. X( ~! q129 D1 n1 o6 Z, h2 X, ^& b& J
    13
    . ]4 Z( I/ O) i5 V& f+ w149 n4 u" S! {5 \0 i
    15
    2 q% c9 g/ s  y16! u3 K" e8 Y! \: {2 a1 m

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

    6 ^9 W2 x: r) `/ x1 O" s
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-9 11:37 , Processed in 0.303728 second(s), 50 queries .

    回顶部