QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3064|回复: 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- [; Q% T+ h" k% b' t; D7 d
    " Y+ h2 R: Z) G- a, z
    骨架图算法! k1 w; s% G8 C1 A

    % n) |, b2 B6 T: y" O) a7 G6 D: _
    8 m3 L* k$ s9 v5 s4 Z" ]  z$ P* wGraph Embedded Pose Clustering for Anomaly Detection+ L' E2 o! {- M- ]( x
    paper        code
    5 H  W9 z) c8 u4 l6 ~6 N2 Ghttps://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc
    * ~# \' J, s( ?2 y& q我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。
    % Z* C$ p0 w9 }4 a! t8 i. s# @2 z+ k9 |$ o/ {: G
    首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。
    0 e) U5 E3 M- z4 |+ `# Z; a
      |# k5 G+ I1 g# D" i& f9 f' n  c- \图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。
    # ?6 l2 j/ m3 k# M为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算! t3 J5 U) G3 l3 @+ B

    - p0 q+ ~8 D  e) B; `3 f/ A0 H我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。
    ! N$ }; p9 j/ d  }' z( L. W( b% ~$ ?" |7 q& m; ?$ b
    3.2. Spatial Attention Graph Convolution7 i* n# S, A  T% h- j( x
    我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。
    * h4 g  ]: K- z! q2 H8 F+ W) i" {* b8 X7 C
    GCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。
    % ~4 z. ^% T2 m  Z
    " K$ g! J2 j! D三个邻接矩阵捕捉了模型的不同方面:
    + K- F  ]: y4 _- |( r$ E1 N$ g! _(i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。
    2 E" |- [8 ?1 H6 i; z8 m# K( w(ii)由全局邻接矩阵捕获的数据集级关键点关系,以及. y- h( o: |  }' U
    (iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权) a5 G1 g( v2 J) d
    . x' R/ G* @+ U' ~7 ?' s
    $ r$ |) R( B: _, V5 X6 o, Y
    后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。
    - h. `8 u% B& h3.3. Deep Embedded Clustering# b/ v0 O. g  X
    为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。7 {- s, S: A( u1 m

    4 `8 Z$ s% U% {+ P, w8 U我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。
    # K) q. P* A7 Q. E' p) q/ w9 {; H# x* c7 Z# j- X
    具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。
    7 l; ^  ~, ]" b
    ( v0 u1 p9 E2 OST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。
    / m, d# [1 r9 H" R8 o
    ) K& a, U* j' g/ l* u* e. [符号        表示
    . I; s: ^2 M2 L8 h- i# ~x i x_ix
    ; G  w" k) H5 S/ s' pi3 l5 V* E. {0 a3 n0 q7 i
    ; V/ g5 ^3 I$ G! g+ ]6 e; G
            输入示例
    ' r" _% |6 ?! W0 Uz i z_iz ! `0 a2 |2 `5 w& z) s
    i
    8 v: ~) k) b5 @) R4 e' p! f, [8 z
    6 }# O% i' ?; k$ V' T         编码器的潜在嵌入" F8 X8 Z, y3 `: u: N. N; x; v/ _
    y i y_iy ( W+ D* f( R. r. O% W) X
    i
    . O  I- G* z7 c1 b, M% S
    / J. o0 F% j; W; R$ v         使用聚类层计算的软聚类分配
    & f+ I$ f8 d4 FΘ ΘΘ        聚类层的参数
    9 D: E0 h) {0 M0 C5 _( tp i k p_{ik}p
    7 w/ o" s7 e1 Y0 [1 J3 u* H  _ik- p1 l$ X+ f3 }8 \2 @

    + t8 U9 U8 y& z" E# ?' f6 W         probability for the i-th sample to be assigned to the k-th cluster
    ! M( t9 @& G" [2 v: z. }' M  V3 z" Q2 R' b

    8 X* @; G0 x5 I; E我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:
    ) H$ q8 q& q6 I  [0 L" [1 |
    ( z; g* y  I$ o; v, c1 e. M7 L7 N7 O0 n, S/ F0 Z' V. e
    目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:. s, n/ X* h+ o1 ]2 e; S

    ; i7 |( T, V) E! P+ n0 O* p1 h9 ~2 P, n, n/ I5 f" D
    聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。
    ! e3 i, S4 q- A  s在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。" F: F1 Q! f$ w5 O# T' x

    * o; M  u- f4 i( J- {9 `. A( k3.4. Normality Scoring8 d  ?: U4 \. E4 B
    该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。7 i& h/ d5 T% X7 U* g
    软分配向量本身(捕获动作)也可以通过多模态分布建模。9 x, d( W' ^, F

    0 r( E1 |0 E# K# D5 ^! @6 LDirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。
    . L2 K$ G8 J$ l3 @" V, T/ O3 v9 N% V& S* n3 y7 G' ?0 S& R
    Dirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:
    ) n/ |3 M; `* n, e(i) 估计(拟合)阶段,在此期间评估一组分布参数,以及
    ) ~) z7 Z8 C( d6 C. n" G3 v(ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。
    % p- I+ ?+ [! B" Y$ s% l. U, z' q0 v, |3 D/ {- h, p$ @
    DPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。0 G. K- |' v% @
    2 k$ U8 j# @2 r. L
    3.5. Training
    - L; ~& O5 o" p+ A. z& R该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:# h& i; Q7 ^& F6 B' q
    % T# Q- p* f$ Z! j% r( b3 ?
    Pre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失
    8 ]5 \1 m) u6 H6 |* E/ ^: |! C% m: g# @% v: P: \6 }
    Fine-Tuning:; M3 a2 o2 e7 j
    该模型优化了由重建损失和聚类损失组成的组合损失函数。( z. v4 [( i; ~$ y
    进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。
    4 A1 \7 i& h6 _% @  y集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。( P- {' {/ x# _! S$ I4 @! b& h
    本阶段的综合损失为:
    0 T) X/ g. R- K5 y( X
    " w( d- K, K8 K& ]! J
    3 ?" X# u/ R# a5 O( B+ I* I
    8 l# M( D' ?' Q6 U实现细节
    1 g. G7 x2 J0 Z6 i' R+ T7 @1 A" J9 |: i6 B
    - i# z6 d, r# m' k6 z; F; ]
    4 t9 k: P( X# r: J" s& j$ f
    def calc_reg_loss(model, reg_type='l2', avg=True):
    ; _- _7 w- a! Y1 q3 a    reg_loss = None1 `3 t8 I5 L) s0 u+ z) s* ~
        parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)
    ( a. D4 t3 z) F" b! a4 A' k' A    num_params = len(parameters)6 \% i$ O2 |% }5 o+ B7 U$ T
        if reg_type.lower() == 'l2':
    " \% ?- m- ~; Z. {        for param in parameters:* ^. @/ e* p! u( I4 u+ ]" g
                if reg_loss is None:
    * C6 u% f% Z1 b" u0 |. U( T) [                reg_loss = 0.5 * torch.sum(param ** 2)
    ! h8 H4 W; [( h& `' n            else:
    5 z4 j6 y2 f& W6 R7 [* g+ D                reg_loss = reg_loss + 0.5 * param.norm(2) ** 2
    + ^, t7 z* W9 k! c$ t5 L4 D. n" w
    " p: ^' m  }/ w        if avg:( D* [  [: d' x: q$ w* Z, x* T
                reg_loss /= num_params
    7 {$ N* u+ v( b( C! B        return reg_loss9 Y$ q  V/ i- G; C
        else:2 ^& y' H  Y2 w! m5 e2 ^
            return torch.tensor(0.0, device=model.device)$ b( Y8 Y! _6 M' T
    1
    - d! e' {/ Z4 t5 e: D  l5 p2$ G3 D2 ^1 z8 _& d9 S2 i8 u
    35 q6 C9 y3 u& c( |) t
    4/ z( g) u- w& H4 Q% `" P9 t
    5+ l) L+ M8 @5 B/ c( N5 A
    6& [& c& O( {5 x( \
    7& F* M9 K6 ^" P. c3 }% Q
    8
    : _. a$ }/ \5 g$ T  D/ B9
    : H7 h  r! b" Z10
    & J) z* `7 a6 p, G9 R11
    ! `3 G5 F9 h6 d' |: E12) L4 V+ O& h7 y0 h4 ]+ ^6 f
    13
    3 j" `7 j" Q- s5 `- M8 y142 m; p! S5 z4 U) g
    15
    / y6 \5 ~) u9 Z+ P# G16
    . F1 y$ u/ Q& e: T% I) t1 I8 J& Z3 U2 z3 W! v2 s- m3 y

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

    回顶部