数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-5 15:49
标题: 骨架图算法Graph Embedded Pose Clustering
骨架图算法Graph Embedded Pose Clustering
9 F3 k, r" T+ k1 g; ]  s: s0 x$ w5 I* p# s) N+ `
骨架图算法$ M. U1 k+ a0 l% l$ m1 P

# Z) ~+ ^+ }$ X. L; E6 A. `4 ^, x  y" s0 p3 c' K* ^& T
Graph Embedded Pose Clustering for Anomaly Detection
, X* i/ F# L2 Epaper        code  \, H2 s6 ?7 f* ?& R+ w, r
https://arxiv.org/abs/1912.11850        https://github.com/amirmk89/gepc' n/ Y7 j1 ?- L& @- R" p, S, w
我们提出了一种用于人类行为异常检测的新方法。我们的方法直接适用于可以从输入视频序列计算的人体姿势图。这使得分析独立于扰动参数,如视点或照明。我们将这些图映射到一个潜在空间并将它们聚类。然后,每个操作都由其对每个聚类的软赋值来表示。这为数据提供了一种“词袋”表示,其中每个动作都由其与一组基本动作词的相似性来表示。然后,我们使用基于狄利克雷过程的混合物,这对于处理比例数据(例如我们的软赋值向量)很有用,以确定一个动作是否正常。
4 M! r3 n' q3 I: x7 I
1 S/ {. u8 Z  Y% y1 m4 v首先,我们对输入数据使用人体姿态检测器。这抽象了问题,并防止下一步处理诸如视点或照明变化等有害参数。人的行为被表示为时空图,我们将其嵌入(第3.1、3.2小节)并聚类(第3.3小节)到一些潜在空间中。现在,每个动作都表示为一组基本动作的软分配向量。这抽象了动作的基本类型(即细粒度或粗粒度),从而进入学习其分布的最后阶段。我们用于学习软分配向量分布的工具是Dirichlet过程混合(第3.4小节),我们将模型拟合到数据中。然后使用该模型确定动作是否正常。
4 T* D2 h: E# G/ i+ l2 q& r+ M2 O, e+ b0 e% z
图的每个节点对应于一个关键点、一个身体关节,每个边表示两个节点之间的某种关系。 存在许多"关键点关系",如解剖学上定义的物理关系(例如,左手腕和肘部连接)和由运动定义的动作关系,这些运动往往在特定动作的上下文中高度相关(例如,跑步时左右膝盖倾向于朝相反方向移动)。图的方向来自于这样一个事实,即一些关系是在优化过程中学习的,并且不是对称的。这种表示的一个好处是紧凑,这对于高效的视频分析非常重要。
4 R! R. L3 I1 y1 @; b3 M8 [为了在时间上扩展,将从视频序列中提取的姿势关键点表示为姿势图的时间序列。 时间姿势图是人体关节位置的时间序列。时域邻接可以类似地通过连接连续帧中的关节来定义,允许我们利用姿势图序列的空间和时间维度执行图卷积运算7 ?" d4 S+ w* h, f

2 p/ E1 V- i! r1 J我们提出了一种基于深度时态图自动编码器的结构,用于嵌入时态姿态图。 基于图2所示ST-GCN的基本块设计,我们将基本GCN算子替换为新的空间注意力图卷积,如下所示。
! ~+ m4 w; W( f$ @" P+ |1 T% Z4 ^% P& w  w; u
3.2. Spatial Attention Graph Convolution
) x8 }9 U7 W! i8 ]. g我们提出了一个新的图算子,如图3所示,它使用三种类型的邻接矩阵:静态、全局学习和推断(基于注意力)。每个邻接类型使用单独的权重应用其自己的GCN。
, b% o3 \3 K& d) j3 M, m; [7 z
! }2 z5 ^3 _: n. PGCN的输出按通道维度堆叠。采用1×1卷积作为加权叠加输出的可学习缩减度量,并提供所需的输出信道数。9 Y1 r5 K+ o- S2 w) _, c

6 @. X* F; x& V三个邻接矩阵捕捉了模型的不同方面:) }2 R7 p8 T2 x2 ?
(i)使用身体部位连通性作为优先于节点关系,使用静态邻接矩阵表示。) K% i! J, p. ~$ {7 q  K
(ii)由全局邻接矩阵捕获的数据集级关键点关系,以及! a3 m, S7 N. U5 }$ @3 a) t; X
(iii)由推断邻接矩阵获取的样本特定关系。最后,可学习约简度量对不同的输出进行加权5 J- N$ u) ^0 Q- O
! g: f3 `4 Z; S! X
* g; g1 v$ i: i4 T! u) y
后续段落介绍了静态、全局学习和推断的邻接矩阵的设置方法,即图3中的A,B和C,在此略过。& c) P3 M" i0 M6 C  B
3.3. Deep Embedded Clustering! t( e* |+ d0 F, m2 P* R- @$ k8 {
为了构建我们的底层动作词典,我们采用训练集样本,并将它们联合嵌入和聚类到一些潜在空间中。然后,每个样本由其分配给每个底层聚类的概率表示。选择目标是为了提供不同的潜在集群,这些集群上存在动作。
4 ?, O- n* x% E
. n9 x% y4 d! R( [8 c我们采用了深嵌入聚类的概念[32],用我们的ST-GCAE架构对时间图进行聚类。所提出的聚类模型由编码器、解码器和软聚类层三部分组成。3 ~; g7 {; y, b/ R, \$ j  P

! ]) g& p8 I8 [/ c: o. {6 n具体地说,我们的ST-GCAE模型保持了图的结构,但使用了较大的时间步长和不断增加的通道数来将输入序列压缩为潜在向量。解码器使用时间上采样层和额外的图卷积块,用于逐渐恢复原始信道计数和时间维度。- c* N8 G  n  K9 K

+ i( Y% p3 V) I9 M6 O" E* rST-GCAE的嵌入是数据聚类的起点。在我们的聚类优化阶段,对基于重构的初始嵌入进行微调,以达到最终的聚类优化嵌入。
& y, B& G# m% V8 l
8 ?; j" ]0 k* O/ N6 T1 V/ d- R符号        表示5 m' w1 ~7 g/ P2 G+ }  h5 n
x i x_ix - x* C( Y+ S$ w1 q
i. g$ ~: e0 O+ p* b
  }* q0 L( q' Z
        输入示例5 ^2 d6 i/ p1 t7 c
z i z_iz & r+ s1 Y. l( @" g6 e( E  S
i7 C6 ]- I% X* E2 f6 N% N8 N

" k$ j3 q7 ]( K) n! Y" \+ S         编码器的潜在嵌入# X5 e( w; z" E  K4 s% i
y i y_iy
/ e8 V  R" Q) R  r4 Z8 l# Ui! [) l* @, A, _) s& {# y; N5 `, t; o
9 b9 ^! n9 b1 R$ J' F2 [
        使用聚类层计算的软聚类分配; b6 l6 \4 F" o. E/ u; u
Θ ΘΘ        聚类层的参数0 A3 m3 V5 p: W# ]  `* l
p i k p_{ik}p ! H* B3 z6 ?+ z6 L* [6 v" Z  J; s& V
ik5 b# T% X. D$ S$ L

) R6 t3 U8 f4 u7 I  ?         probability for the i-th sample to be assigned to the k-th cluster
, N# j' v" q% c) P0 H6 D' w
5 \  U6 e; S8 U$ X$ h/ n* `% F0 V* o
我们采用[32]提出的聚类目标和优化算法。聚类目标是最小化当前模型概率聚类预测P和目标分布Q之间的KL散度:
+ e% x' T$ G# \9 P- [. [  P; W3 n0 p- F* m" |

2 V$ G0 s4 T0 R$ g- Y目标分布旨在通过标准化和将每个值推到更接近0或1的值来加强当前的群集分配。反复应用将P转换为Q的函数将最终导致硬分配向量。使用以下等式计算目标分布的每个成员:% l" n. {1 V- J
# d$ m7 H3 Y. u4 K+ ^( D; _# z: P) |

; j0 n+ t6 @; B; w* C# S聚类层由为编码训练集计算的K均值质心初始化。优化以期望最大化(EM)的方式进行。- S" f  [1 Z4 t! j" T
在期望步骤期间,整个模型是固定的,并且目标分布Q被更新。在最大化阶段,优化模型以最小化聚类损失Lcluster。7 ?0 y8 [. X- j' p1 |6 \% m8 Y

+ y& P+ p4 @# R- i3.4. Normality Scoring
4 O3 F4 P- B- K$ i9 ~该模型支持两种类型的多模分布。一个是集群分配级别;另一个是在软分配向量级别。例如,一个动作可能被分配给多个集群(集群级分配),导致多模式软分配向量。
( U+ {1 m# J4 f. @软分配向量本身(捕获动作)也可以通过多模态分布建模。
! U( m4 r5 s, H& M/ u8 ]- E3 b' `  E+ G4 u( {
Dirichlet过程混合模型(DPMM)是评估比例数据分布的一种有效方法。它满足我们所需的设置:(i)估计(拟合)阶段,在此阶段,一组分布参数为评估,和(ii)推理阶段,为每个嵌入样本使用拟合模型。彻底的Blei和Jordan[4]给出了该模型的概述。6 j6 F& x" C  g0 p' Q; H8 t

% {1 }  r( j1 p8 F7 O1 PDirichlet过程混合模型(DPMM)是评估比例数据分布的有效方法。它符合我们要求的设置:5 a: ^$ ^* @, D$ Y) r7 P
(i) 估计(拟合)阶段,在此期间评估一组分布参数,以及: Y. p: R% |2 J' |
(ii)推理阶段,使用拟合模型为每个嵌入样本提供分数。Blei和Jordan[4]对模型进行了全面概述。
- \* z  G4 K$ g5 x* h! U; t, G1 e
, Q# P. ]9 [  h; m* Y% i! WDPMM是单峰Dirichlet分布的常见混合扩展,并使用Dirichllet过程,这DirichletDistribution的无限维扩展。该模型是多模态的,能够将每个模式捕获为混合成分。拟合模型具有多个模式,每个模式表示对应于一个正常行为的一组比例。在测试时,使用拟合模型通过其对数概率对每个样本进行评分。[4,8]中提供了关于DPMM使用的进一步解释和讨论。
& h  j4 k9 ]' ?( _6 S
! }: n- h' |( J3.5. Training
% p/ ]4 T. }+ e/ D. e/ `该模型的训练阶段包括两个阶段,一个是自动编码器的预训练阶段,其中网络的聚类分支保持不变,另一个是微调阶段,其中嵌入和聚类都得到优化。具体而言:  \/ K! d4 I) J* W5 m; s
  R7 G: ^2 p& f  R" ~2 }
Pre-Training: 该模型通过最小化重建损失(表示为Lrec)来学习编码和重建序列,Lrec是原始瞬时位姿图和ST-GCAE重建的位姿图之间的L2损失
) [/ X. F1 L1 j7 F. _- L2 Y- F* N; \" ]# `4 J
Fine-Tuning:- M; X: v; c: t' y
该模型优化了由重建损失和聚类损失组成的组合损失函数。0 G) Q& U( \& j8 I2 @* n- L$ L
进行优化,使得聚类层优化为w.r.t.Lcluster,解码器优化为w.r.t.Lrec,编码器优化为w.r.t.两者。# Q. w0 B, Z% ^6 u4 a& p* l
集群层的初始化是通过Kmeans完成的。如[9]所示,当编码器针对这两种损失进行优化时,解码器保持不变,并充当正则化器,以保持编码器的嵌入质量。
1 v4 T9 Z8 L& H6 Q. P. W1 |5 W. B本阶段的综合损失为:
6 ]; @0 g/ K. }$ j4 n1 H. B9 [5 Z+ ?9 a# u2 e3 i, {% b) Q

& `0 q3 E, C6 g+ Y$ D2 x
4 q# w- z  z3 A, j7 E8 X1 s! P实现细节  t" |5 O. T3 R+ u, F9 B+ V- @

8 v1 Y5 ?1 x  n4 c% l# b
* \, a0 u. L; d0 [! ]
% i/ @! ?' K4 K7 c& udef calc_reg_loss(model, reg_type='l2', avg=True):9 a8 O! @  P# M% _, r0 c( z7 W
    reg_loss = None6 p% Z" R$ Z& F
    parameters = list(param for name, param in model.named_parameters() if 'bias' not in name)
" \5 j5 _. E  G( C* v    num_params = len(parameters)3 U5 o: @8 u$ u5 e; W& ~
    if reg_type.lower() == 'l2':
3 r1 S2 T7 o; }3 h$ h. C) _4 Z        for param in parameters:' }4 c+ f  y9 y3 y
            if reg_loss is None:" `5 ^; p7 }! @8 U6 e  P
                reg_loss = 0.5 * torch.sum(param ** 2); V/ G' y. `3 I) ?7 d' u
            else:
) b; e2 k& x% ?6 T' a                reg_loss = reg_loss + 0.5 * param.norm(2) ** 2
( @5 n4 W  B/ ~8 V3 X) v$ s" B. {1 F$ z  w) G3 g8 e- [
        if avg:2 P# |  _  @$ T
            reg_loss /= num_params
; [. ]" N5 u" Z4 M& P6 ^        return reg_loss
) `* w4 {2 s( g' W    else:* R& o" R) f( X$ b4 m6 S
        return torch.tensor(0.0, device=model.device)
+ |6 l- m2 c: \$ }5 l. c/ r6 {1$ D7 i6 H* D9 w
2* ]2 {0 Y- P4 X- b& D* b0 N) E
3
1 J& H9 V# D" W2 r3 ^4
7 \2 y( C" L" \! q9 {. r5
- x% Y" z7 T0 n69 e* T+ c6 d' t7 C/ l
7
$ b, A; ?& ]- @5 B: i$ Z2 U" ]: d% h88 Q% l& `1 Z. y' h( R& I" [% t
9
) o, D; M2 d- @4 b' ^( @8 X; l10
! D/ N. q# k, }$ L6 H11* J: e+ f: a8 Y
12
+ E- Z  G" d" ~0 g1 s13
0 m# z- I: U  G1 T2 ^# R7 T0 M14
3 W  J4 x5 ?! w' U15
5 b; d6 \1 k/ E$ s16
; _  Y! ?" h' D2 t. v9 i  Q+ U9 _& }4 x- {
4 Y9 C7 c- i' B

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





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