QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3065|回复: 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
    1 L2 @3 m$ m# }, c, I
    5 U$ ^" d% g! N* W) s5 }) d骨架图算法
    $ n0 ^  E! r  g  o1 o. u( o
    3 X2 i: l& ~$ J
    $ c7 m. `+ r1 Q( P9 I3 FGraph Embedded Pose Clustering for Anomaly Detection9 U9 x4 W) G$ |& G; [+ ?% N2 Y0 D
    paper        code* y: F+ R1 F1 o: W  D9 p
    https://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc4 }( s5 S7 ~, E3 |) Q; E0 b
    我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。
    3 e6 |0 c% m4 W6 b. q* w/ |  K
    " z- ~7 q, Q2 k) e首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。
    3 e7 j. s$ \0 _" \+ g" V: e2 F0 \" t2 ]0 [& Y) Y$ D% Y1 w* H
    图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。
    % |- J! Y0 S% G# O; Y! `4 Z  ^3 e为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算8 ]; x1 _2 f' ~1 |2 ]# y

    4 `5 ]8 ^; s" I- k9 v我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。; s4 Y/ Q: l6 ?' q

    * N7 B+ q, @, r- t$ @# V- X' A3.2. Spatial Attention Graph Convolution; b8 U2 Y. x6 c( N4 P7 {& _3 g! J
    我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。& P2 `$ x/ a. n, B6 g& |9 M

    4 a. g. Q6 B' z; _% yGCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。
    $ t& V: }5 n0 J8 a) V- ]
    . v% Y- C( v4 h三个邻接矩阵捕捉了模型的不同方面:
    8 k7 G2 n$ T( h" Z1 B) L# Z! J7 A(i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。: c! {3 r) r1 }
    (ii)由全局邻接矩阵捕获的数据集级关键点关系,以及
    . l, [$ J$ H6 u, u(iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权- z; U5 Z* I4 Q& E% J% G: _8 A+ M

    3 `, ~8 F& q# E" c, B2 o$ ~$ w  q# m* I
    后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。
    ; i9 k- [. O& r) B$ p3.3. Deep Embedded Clustering9 U& Z% c( w8 R: x0 C0 x4 x' r3 P
    为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。+ q  n7 N: e8 I5 S1 a2 H

    8 }3 J  F# W9 @$ D$ _我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。; _' z% g' L9 @( w1 X- L  F

    : D* {2 _0 W9 n: h! u- e具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。$ A: O& N0 K7 Y- e6 q: ~4 c* f: M7 d

    9 R, ^5 b' K/ p1 QST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。
    ' n5 n  a. A) @) f/ i! [
    2 O# Q; v( l8 i( w1 ^符号        表示
    5 d7 M% t; v' j" _  A+ yx i x_ix . \5 p7 ?! ?' Z2 ^" ^5 T8 a" n
    i
    & H$ e( F. A  d9 d' O4 V; B* C0 |2 Q0 {( I
            输入示例
    , m- P, t- }6 z, Wz i z_iz
    7 Z9 Z2 a: x! f# S" bi
    " y* n# d9 c6 w% {- w# e: j+ T' D  E: Z+ C4 z
            编码器的潜在嵌入; a% X. l: u9 x; K9 |
    y i y_iy
    7 G' w6 I* ^& P4 W0 vi/ k6 F; C/ Q6 p$ D+ N' L, k

    . t  i/ o$ |9 w         使用聚类层计算的软聚类分配
    3 r6 J/ }! K9 r1 G% v$ V& S7 D% j5 LΘ ΘΘ        聚类层的参数
    : z# K* p- b6 @. D1 h' vp i k p_{ik}p
    ) g( Z* A. q; [1 B( {" c2 ]* Dik
    + r" m# P2 j: E9 b3 a, |: N
    , X2 {" w% A( f5 s: `2 u         probability for the i-th sample to be assigned to the k-th cluster
    & U9 Z5 T: e8 P; w( G+ p* H. n9 a6 w, W7 x- F6 U$ J
    $ `+ p" a  G# J! S# R: q+ [* Q
    我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:
    + _0 q5 N& M1 ^) j2 H5 ~2 m' ]4 {7 g9 k7 J( w* \5 }3 ?$ E! h9 P+ R$ |% E

    5 A$ p* C/ e! {% z1 L9 _目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:
    7 x3 F' q! F+ u, H4 E
    8 e- W5 |3 k$ b9 B, E" ]4 h+ l
    / w- f7 H7 s; E& p7 d# L聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。6 O$ W4 M" Y5 R, h6 t8 y1 V
    在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。+ v7 q1 a7 U7 S: @
    , X: F# g3 t% q! d( C
    3.4. Normality Scoring
    # \9 Y  ^9 N; l/ c/ {; u0 V) f该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。
    - {2 I* b2 W! ~3 D0 G0 n0 d软分配向量本身(捕获动作)也可以通过多模态分布建模。* V- h) m& X; R! t
    + o/ M0 q7 @7 m) ], A
    Dirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。, ~! Y) T  d8 G( c' V6 t2 j5 u& r

    1 l7 ~* c# V& J) R" i( RDirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:9 b5 W6 U* N0 j- J2 z
    (i) 估计(拟合)阶段,在此期间评估一组分布参数,以及
    $ A6 }' [. @) N/ K& a! Q(ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。
    " l3 f4 j4 o5 l2 |
    4 e% e! W9 r% T2 F9 ]5 I2 Z: K1 BDPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。
    ; j& x0 u5 g8 X0 @& j- F# f6 l# Q- l, Q, ?
    3.5. Training
    0 |6 v0 E7 Z! ~9 s- W/ V9 b该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:/ ]/ P& _; [* C9 ]

    * k, @5 g$ E+ ?/ a6 T) Z1 KPre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失, B) I$ e  _1 i* P

    7 I' z+ p, U$ O* M) rFine-Tuning:
    . _+ A: l3 F. n9 l该模型优化了由重建损失和聚类损失组成的组合损失函数。
      s1 X8 r' w  y1 V# |1 h进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。) j. O8 Z0 \, H, U& T' a
    集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。
    # |5 Y. ~( P, B2 g1 z  ^( q! ?本阶段的综合损失为:
    : ^  Q2 a2 |) b
    $ w( p- I& M5 g2 A3 a% z0 Q, |$ o: U# p4 g/ ^( ]$ L) ]! Y
    2 R/ t) P$ ~$ j, t6 {
    实现细节* A3 z  [4 z/ b+ B) V  g$ n& A
    ' ?' D2 w% {! c. D( A
    ! A. D5 D" t9 D0 B* o
    " L/ {$ e5 i; }' _$ W) S! P
    def calc_reg_loss(model, reg_type='l2', avg=True):
    & A+ l6 Q4 h* A, R- W- [) E    reg_loss = None! x$ _% r8 M( i  G
        parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)
    , K9 H( ^" V& ~% \! A, L    num_params = len(parameters)6 F- y, t3 {# [4 R+ p1 d
        if reg_type.lower() == 'l2':1 s/ z% V3 Q: B" c$ E( F
            for param in parameters:4 C# l! _% j' \& Z6 \' Q* q# y# U' z
                if reg_loss is None:* b" W' v' j- x% t( w( Q
                    reg_loss = 0.5 * torch.sum(param ** 2)
    3 Z) a% o$ J: c            else:
    * C; x: L; D0 o5 a                reg_loss = reg_loss + 0.5 * param.norm(2) ** 2
    0 t% \" ~8 @2 d/ q5 L! I
    1 J* ~6 ~8 n8 G3 b" V% h& y8 {        if avg:
    4 t# p4 ^9 g5 d* J5 y8 e4 u# r" l1 n            reg_loss /= num_params' J( j; l, v9 C: O) U! S( P
            return reg_loss
    ' o9 |# [6 o% ^7 R    else:
    * z, y/ `2 C% y  G9 `! U        return torch.tensor(0.0, device=model.device)
    / ^$ r$ E5 Z4 ^7 y% w$ X- g; K1' w. z: y8 V8 `* X9 h4 X
    2
    % A- w. d/ f# o6 l; ?$ D3; w7 [: d0 D- C6 J* [$ c
    4
    - v1 x( G& v' U; c7 [5& B1 ^$ O% e- ]" V9 l! ~
    6
    ( H& {3 |" p/ n7. W5 o0 W/ i6 \3 B
    86 {2 T0 X7 l) K8 _1 W% ~
    9" K$ |+ V$ V5 g
    10! _" E% W& o3 d" \
    11
    6 H6 h  L; `5 |* ^' z9 d12: y9 F8 ~' ]: C" J6 u, E7 R8 H7 ~
    134 n, N3 ^+ c& a2 m
    14& n" J* Z0 p) v; |! z: S
    15( u+ k- x) _& m4 H
    163 f. T" ]$ @" k7 {/ ^+ }# J

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

    . ?  ~  B/ v) ]7 L
    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-6-14 06:21 , Processed in 0.436062 second(s), 50 queries .

    回顶部