From 3ee8d630b768c82b3224ba9c58ffb4a46f75b830 Mon Sep 17 00:00:00 2001 From: tanxing Date: Fri, 27 Jun 2025 21:49:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84MyLSTM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- MyLSTM.py | 175 +- TryBatch.py | 6 +- __pycache__/BucketManager.cpython-312.pyc | Bin 0 -> 19547 bytes __pycache__/MyDataset.cpython-312.pyc | Bin 0 -> 4922 bytes __pycache__/MyLSTM.cpython-312.pyc | Bin 0 -> 13702 bytes __pycache__/MyLayer.cpython-312.pyc | Bin 0 -> 12322 bytes __pycache__/MyTokenizer.cpython-312.pyc | Bin 0 -> 4606 bytes __pycache__/TryBatch.cpython-312.pyc | Bin 0 -> 7701 bytes inference.py | 2 +- model/checkpoints/latest_checkpoint.pt | 3 - model/checkpoints/latest_model.pt | 3 - results/translation_comparison.txt | 7944 ++++++++++----------- train.py | 82 +- training.log | 1457 ++-- 15 files changed, 4702 insertions(+), 4972 deletions(-) create mode 100644 __pycache__/BucketManager.cpython-312.pyc create mode 100644 __pycache__/MyDataset.cpython-312.pyc create mode 100644 __pycache__/MyLSTM.cpython-312.pyc create mode 100644 __pycache__/MyLayer.cpython-312.pyc create mode 100644 __pycache__/MyTokenizer.cpython-312.pyc create mode 100644 __pycache__/TryBatch.cpython-312.pyc delete mode 100644 model/checkpoints/latest_checkpoint.pt delete mode 100644 model/checkpoints/latest_model.pt diff --git a/.gitignore b/.gitignore index 975098f..7f9d9f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -_pycache__/ +_pycache__ *.pt !latest_checkpoint.pt !latest_model.pt diff --git a/MyLSTM.py b/MyLSTM.py index 40a4fa2..94d6117 100644 --- a/MyLSTM.py +++ b/MyLSTM.py @@ -1,7 +1,6 @@ import torch import torch.nn as nn from MyLayer import SoftTanh, SoftSigmoid, AdaptiveSoftTanh -import random from typing import Tuple, List, Optional @@ -32,12 +31,14 @@ class MyLSTM(nn.Module): def init_hidden( self, batch_size: int, device: torch.device, - h_state: torch.Tensor = Optional[None], c_state: torch.Tensor = Optional[None] + h_state: Optional[torch.Tensor] = None, c_state: Optional[torch.Tensor] = None ) -> None: - self.h_state = torch.zeros(batch_size, self.hidden_size, device=device) \ - if h_state is not None else h_state - self.c_state = torch.zeros(batch_size, self.hidden_size, device=device) \ - if c_state is not None else c_state + self.h_state = h_state if h_state is not None else torch.zeros( + batch_size, self.hidden_size, device=device + ) + self.c_state = c_state if c_state is not None else torch.zeros( + batch_size, self.hidden_size, device=device + ) self.initialized = True def _forward_seq(self, x: torch.Tensor) \ @@ -46,10 +47,11 @@ class MyLSTM(nn.Module): # 存储所有时间步的输出 output = [] - normed = self.norm(x) + x_o = x + x = self.norm(x) # 遍历序列的每个时间步 for t in range(T): - x_t = normed[:, t, :] # 当前时间步输入 (B, C) + x_t = x[:, t, :] # 当前时间步输入 (B, C) # 合并计算所有门的线性变换 (batch_size, 4*hidden_size) gates = x_t @ self.W_i.t() + self.h_state @ self.W_h.t() + self.bias @@ -62,17 +64,12 @@ class MyLSTM(nn.Module): g_t = SoftTanh(g_gate) # 候选门 o_t = SoftSigmoid(o_gate) # 输出门 - # i_t = torch.sigmoid(i_gate) # 输入门 - # f_t = torch.sigmoid(f_gate) # 遗忘门 - # g_t = torch.tanh(g_gate) # 候选门 - # o_t = torch.sigmoid(o_gate) # 输出门 # 更新细胞状态 self.c_state = f_t * self.c_state + i_t * g_t # 更新隐藏状态 self.h_state = o_t * SoftTanh(self.c_state) - # self.h_state = o_t * torch.tanh(self.c_state) # 当前时间步输出 output.append(self.h_state) @@ -82,7 +79,7 @@ class MyLSTM(nn.Module): # 添加残差连接 if self.input_size == self.hidden_size: - output = output + x + output = output + x_o else: output = output @@ -90,9 +87,10 @@ class MyLSTM(nn.Module): def _forward_step(self, x: torch.Tensor) \ -> torch.Tensor: - normed = self.norm(x) + x_o = x + x = self.norm(x) # 合并计算所有门的线性变换 (batch_size, 4*hidden_size) - gates = normed @ self.W_i.t() + self.h_state @ self.W_h.t() + self.bias + gates = x @ self.W_i.t() + self.h_state @ self.W_h.t() + self.bias # 分割为四个门 (每个都是batch_size, hidden_size) i_gate, f_gate, g_gate, o_gate = gates.chunk(4, dim=-1) @@ -101,35 +99,29 @@ class MyLSTM(nn.Module): f_t = SoftSigmoid(f_gate) # 遗忘门 g_t = SoftTanh(g_gate) # 候选门 o_t = SoftSigmoid(o_gate) # 输出门 - - # i_t = torch.sigmoid(i_gate) # 输入门 - # f_t = torch.sigmoid(f_gate) # 遗忘门 - # g_t = torch.tanh(g_gate) # 候选门 - # o_t = torch.sigmoid(o_gate) # 输出门 # 更新细胞状态 self.c_state = f_t * self.c_state + i_t * g_t # 更新隐藏状态 self.h_state = o_t * SoftTanh(self.c_state) - # self.h_state = o_t * torch.tanh(self.c_state) # 当前时间步输出 output = self.h_state # 添加残差连接 if self.input_size == self.hidden_size: - output = output + x + output = output + x_o else: output = output return self.dropout(output) def forward(self, x) -> torch.Tensor: - if not self.initialized: - B = x.size(0) - self.init_hidden(B, x.device) - self.initialized = True + if self.initialized is False: + batch_size = x.size(0) + device = x.device + self.init_hidden(batch_size, device) if x.dim() == 2: return self._forward_step(x) @@ -188,8 +180,6 @@ class LSTMDecoder(nn.Module): for _ in range(num_layers) ]) self.fc = nn.Linear(embedding_dim, vocab_size) - - self.initialized = False def init_hidden( self, batch_size: int, device: torch.device, @@ -197,40 +187,16 @@ class LSTMDecoder(nn.Module): ) -> None: for i, layer in enumerate(self.layers): layer.init_hidden(batch_size, device, h[i], c[i]) - self.initialized = True - - def _forward_step(self, x: torch.Tensor) -> torch.Tensor: - output = x - for i, layer in enumerate(self.layers): - output = layer(output) - return output - def _forward_seq(self, x: torch.Tensor, tfr: float = 0.0) -> torch.Tensor: - _, T, _ = x.shape - outputs = [] - for t in range(T): - if t == 0 or random.random() < tfr: - outputs.append(self._forward_step(x[:, t, :])) - else: - logits = torch.argmax(self.fc(outputs[-1].clone().detach()), dim=-1) - previous = self.embedding(logits) - outputs.append(self._forward_step(previous)) - outputs = torch.stack(outputs, dim=1) - return outputs - - def forward(self, x: torch.Tensor, tfr: float = 0.0): + def forward(self, x: torch.Tensor): x = self.embedding(x) - if x.dim() == 3: - return self.fc(self._forward_seq(x, tfr=tfr)) - elif x.dim() == 2: - return self.fc(self._forward_step(x)) - else: - raise ValueError("input dim must be 2(step) or 3(sequence)") + for layer in self.layers: + x = layer(x) + return self.fc(x) def reset(self): for layer in self.layers: layer.reset() - self.initialized = True class Seq2SeqLSTM(nn.Module): @@ -248,13 +214,13 @@ class Seq2SeqLSTM(nn.Module): padding_idx=padding_idx, num_layers=num_layers, dropout=dropout ) - def forward(self, src: torch.Tensor, tgt: torch.Tensor, tfr: float = 0) -> torch.Tensor: + def forward(self, src: torch.Tensor, tgt: torch.Tensor) -> torch.Tensor: self.reset() h, c = self.encoder(src) batch_size = src.size(0) device = src.device self.decoder.init_hidden(batch_size, device, h, c) - return self.decoder(tgt, tfr=tfr) + return self.decoder(tgt) def reset(self): self.encoder.reset() @@ -268,69 +234,46 @@ class Seq2SeqLSTM(nn.Module): pad_token_id: int, max_length: int ) -> torch.Tensor: - """ - 推理阶段的序列生成方法(支持批处理) - Args: - src: 已添加BOS/EOS并填充的源序列 (batch_size, src_len) - bos_token_id: 起始符token ID - eos_token_id: 结束符token ID - pad_token_id: 填充符token ID - max_length: 最大生成长度 - Returns: - 生成的序列 (batch_size, tgt_len) - """ - self.reset() batch_size = src.size(0) device = src.device - # 编码源序列 - h, c = self.encoder(src) - - # 初始化解码器状态 - self.decoder.init_hidden(batch_size, device, h, c) - - # 准备输出序列张量(全部初始化为pad_token_id) - sequences = torch.full( - (batch_size, max_length), - pad_token_id, - dtype=torch.long, - device=device - ) + # 初始化输出序列 (全部填充为pad_token_id) + output_seq = torch.full((batch_size, max_length), pad_token_id, dtype=torch.long, device=device) - # 初始输入为BOS - current_input = torch.full( - (batch_size,), - bos_token_id, - dtype=torch.long, - device=device - ) + # 初始化第一个解码输入为BOS标记 + decoder_input = torch.full((batch_size, 1), bos_token_id, dtype=torch.long, device=device) - # 标记序列是否已结束(初始全为False) + # 初始化已完成序列的掩码 finished = torch.zeros(batch_size, dtype=torch.bool, device=device) - # 自回归生成序列 - for t in range(max_length): - # 跳过已结束序列的计算 - if finished.all(): - break + # 编码源序列 + self.reset() + h, c = self.encoder(src) + self.decoder.init_hidden(batch_size, device, h, c) + + with torch.no_grad(): + for step in range(max_length): + # 执行单步解码 + logits = self.decoder(decoder_input) # (batch_size, 1, vocab_size) - # 获取当前时间步输出 - logits = self.decoder(current_input) # (batch_size, vocab_size) - next_tokens = logits.argmax(dim=-1) # 贪心选择 (batch_size,) - - # 更新未结束序列的输出 - sequences[~finished, t] = next_tokens[~finished] - - # 检测EOS标记 - eos_mask = (next_tokens == eos_token_id) - finished = finished | eos_mask # 更新结束标志 - - # 准备下一步输入:未结束序列用新token,已结束序列用PAD - current_input = torch.where( - ~finished, - next_tokens, - torch.full_like(next_tokens, pad_token_id) - ) + # 获取当前步的预测标记 + next_tokens = logits.argmax(dim=-1) # (batch_size, 1) + + # 将预测结果写入输出序列 + output_seq[:, step] = next_tokens.squeeze(1) + + # 更新已完成序列的掩码 + finished = finished | (next_tokens.squeeze(1) == eos_token_id) + + # 如果所有序列都已完成则提前终止 + if finished.all(): + break + + # 准备下一步的输入: + # 未完成序列使用预测标记,已完成序列使用pad_token_id + decoder_input = next_tokens.masked_fill( + finished.unsqueeze(1), + pad_token_id + ) - return sequences - + return output_seq diff --git a/TryBatch.py b/TryBatch.py index 47609c9..2cd8fca 100644 --- a/TryBatch.py +++ b/TryBatch.py @@ -36,11 +36,7 @@ def try_batch(config: dict, src_max: int, tgt_max: int, batch_size: int, max_bat # training loop for i in range(max_batch_iter): with autocast(config["device"], enabled=config["use_amp"]): - if i % 2 == 0: - tfr = random.random() - else: - tfr = 1 - output = model(srcs, tgts, tfr) + output = model(srcs, tgts) loss = nn.CrossEntropyLoss()( output.reshape(-1, output.size(-1)), labels.contiguous().view(-1) diff --git a/__pycache__/BucketManager.cpython-312.pyc b/__pycache__/BucketManager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5b935c0407c06b7b6caac7a58d1d824112f220d GIT binary patch literal 19547 zcmbt+Yj9Ipn%KR1OV-PlY)i5&OMc4+KL8tW8-p7IjR6A<4Absr72zv`!7r|49_p(Z zGS$0L&$u#TCmBRPGNNWGEw($gp4zR%U7M|CsK&pnUteCPGO&Ug50gF#2Z)Af@p*Z*;ZqW%YdNRJ{L*$zVFA;nM( zJwr|4TQ)<_$|hv9@(KB@VnQ*ioKViHCR8-$$!FBFnhDLUc0xiI6WN*W;ACPg46SJ zzL|{ngn!P@`hxRpMlm`)8O$gzE-uXYJ+e#%^&IB1uRUe&SoD2F{51mn*^98TN zTYKi-s4wUX_=A&TOJZoqer$h0V`u%;1kF$rGA$+jV;UKmU(U$=3Pu4xCHz!=rC;S& z+o3A{7`0zBrDrrBC?~X}Y`J_Dqy0cJq4QTTI;g84^$=DCeChoFc}gb1n^H0Q4-}tg z5rY9Uyjmt(ub^fjlmb`^#t7{i2@Hbql#DS!iit6QKuwsLN(d_fng-IVAiWCW7QdCD z8G1^N7(u!P(yJjIaAd3yuVJbQ=ISX0Qv=_%jEkv-w+-Glc-yn^>=1V_ZpPuSW9s}G z0zt*p!#LGLJUfB_vjNIAFiyb436tNHF}%4rdD9;}FU&3$O*7H7Sai@`v~xWLX&`U3$!<7HsVGlr>ocGB-<{Z|*KXP8NK zc4YCTgr6LK+i_Tb4=Iki0n4ED;b>0DsXoVY@X%B+8>1+W{ybZrqrBM_45UORY-ZHq`v4Y-xfkK z7Uh|wFHZR{Kjl;bH;jZ^O3S~cMafn|esexuib?r2b&ujy>_I4%>$y~hqHeV2<5Enj z$u?pn{8dn2rW&ev141-lpSeXALo@y%Xk ze8ZuR;ykZ+dTu)C^>z=<%uo7e0>cmyOV$DWKm`Q%sW0C6^I)=T=sv|FO<@tgi$Jv1 z3qEKKwyef~7jW{<-waia&%4NecTE8eXI#FZ%VW<}dvE(@reQbx#nzynZ#KZ<;%9Ls zvy~X&DrU_XkbbJK5;_vd7)WJr?lU+a^v&c5M@4|0%;i-CuLW}-HDbYecKX^haGzX_ zN@hAR>0=onFcK*;h(#BC31W?3(nv4&jm7O@2o%QLz3hr-3??c-kEtH z%3mGGza@(JW zQh9uO#y>tEJdUGyjAiFpk2<3W_-CfX0n3jS8M-PQHC#*qBt0(iVI2_9Xrvhq)s&xk zoZ>(WtiJoyW)-D1q%=)}rYSy{_`yneO>^dj!x;-D9i0)yk|}L-!OM`YYl|q>G&bq| zqP9tB9!l08f=qq7p%F73=?16xu4~8^7T+6f?fBiCb~oYMnJd@ag5R!<3OirX`ZpF= z{9>wgP-q=oYaL3PttoSdVD5Ns?)(SL`ON#+n`(VSXnkX?_0YQ2@$k%pGx3(sdLH+z zS@%Hcho%Rnl(|(fwxjP85BnMFTYU*c};gvQxk2s{cFshzmm^2-Z* zi>r&QE!GKNq2`ihRc@>AgMxuE2<}ra^_1DMURBRG986XX^7=tC;qE89|5C9!kvwuP zb>y;ek9)NA; z4=%EElR4T6jUlTgQ}YR+jp9K-c8$7FKxw%g(+5yo0Se~C2PA;W#^i9}x z?ASFbtO({jA&|UPys>>^gFkV^7w?cc_D_=ig2Zxqts7zlQ3eFvMW}=R~O8Q z8B7lPHJSri6Y&qh5`G|Cs!>qk3MiWsS6%}Za1ZMk`71CC07DNs3a)|?Wo^X}w2+6% z&^f5t`G#@*634W#Ob|&Ud8F}^aFxUc=?%4GP}`8N%^9Fqz@I>X$hYtTlreG@oDt_i zDuMBGBXbkPAC_LKgV`hH!=~&!0#vM%okMeRYPgb7gsTehFcx7@3m90Sh6N$O`jK%e z60>quTqUO>7+Y~BLNNZ}swF$jd>MSXDx9%!HCGL}N`$}}FvRs1pqCa4({bcEBd3?j z;rG%XDX687;P)2(y@L~&fEWY_2mAQXocoR*`*hOiRG zTXAy~#`Fx#rWkuGj}^8Jb7O=Y?1K_8R^EIMXJD@XJ7=K$E;4cE!d(OqvumOV8&wV) zdg(3LkJZ@@6}%)u4nivI!buqozp(C3LCm8Z{~E==jC^`->g)dt50SAv6)cjFj4CkC z2K`J%anpY!&!~J03;sDKqhx(^*Fesg0-+?Bk%OiMf$wfc&H8Wq z*?`|u!}bF-B5P#~BHi>(qNWWx*W%pttwp~#OHJ8EY?hwRsKkVfG7$8!02JGy=Q6Z6 zBLksDCCYyp`bLJnnbC^^npZ5U%YI=EDUR4wW@Ri81haw~beg%FQ4&npHfT6d0|7Fb zS07QNsrJr;MPU|1vpxp&N;Wu+_Jvm%QMp1#5dQy!C32to2UAVjQXM(@!qym9Cv6=O z!@9jOZb-TI2(CRz*S@5^KVp1QVT}ABS>cR#JgewT*VrN_)*IU5KS(wVY*BKN^}R)&-N$DZ|!Md#w@6P1rIJ*(;B&wY=7XF@nP5tXOSwGWLC zjB#Z=5aXVkcWtTx%%+C2)HAO_@qMUyQCSnc6?4aYk6M4$xJ6mDp2*00wIkN|$z{h(*(PG^9G1RH5^h8I}wf30%!D8%uyz!cx&r=V+)KG{qg%SsMV+F zm>dhq1^2#~D(%{xm=aw5F=g83N!(Z&5V}WJFA2NH1RMN$VECZIrjBZDkKcNHEa6W0 zp0qwb&F>u*T1KO1HfmeqY{LC`F>(I!-DGV~y16$di}gKHLiaW4_Kuh;cI%Ng?*2&s zvK4yuQV!kSl*5>8?xOTY7_R=P?Zd;L_~XYuo`D6hUTurj{_MS9?Tz302T-OH7NeNO}=Ps>loKOB#pPIU5h{cHMxw8a|r0U&?m zR%B$;L;f) zz{)AOOio-PdONmR@&L&$YYC8;F<3xywF=;Z<>rQ}1QdK0YU*JB$>ULM9mqkn8m<6gi_9vgos`{`5iwQ^X=E0&f{0I3c#$9)0f3XBh`jc>VwhI=h(e0 z$L=BKQI8Y;&VnjHg}RUWW+oSBd_hpkTv?vw61isptSGDt3>>a3WA5(m4jJ$}n?LCK z?&@F?DXNa&x#}KmM!CRF&js1bfQx8{X~I}D28SWYD5rydFxDKx1RN-jQPd2-kC_V0 z%n%z)7R3y)!AKv*tQa5}T6B49O-7eD*5pJ4kZ>|;ECT>CYAk>el?a7(VUy}CtN>b$ zibVubJgD+cvVOER?O`NaP{{RWp;5Z~)e=7hV1aF71$n8V%vK^AY;^T}Rnr^a7Y)Wn zes+hi>5WuCkS?40LSx{K!)uzu>AJ>LUB6J*zkG9b-+w>!n?uRE^TYzOt}#RnF(&2g z7M$IDLl1B4UDNdabL(x`>mtUq!p=ajKmrBUmltX!7o9@;v%B($33;O!ViRk6Dy#at=uu%Zn;E1Zy7G(DaR_f4jzHvlRb^`ZWFi{fMbagU;i zDdubl9I!`ZiUrIN%pZkpO=61@5y&$H$RT7@%9)Y@TXc!6v!GPYSOn}X$E1J|A!9Ci z3N&~HrvRLkld@^l)S)b}73DSRXR;+Vw4e$r8F^R@KMnjqmjcrF@b!3u_MUIO1oJRx z1ISpswtiuBy8MF)9 zoOrT!BWDN64=R_lXuy%DDy+{kBRy#Fv86|f0->Sc&`3-4?ZV?B4a{6_wg4;2n-fR! zOa_iiv*QbG$-~vfheQQBu>wvdsV}sWuo14|YDTFjePuuNxt6QN5r1X$Ra`C6g>40M zXp`Ct+k-j%6pk?Lu(nXwDtT}m#nIm(AKJ~~^6D0da1v#O8*^T(ZDru^X)sCua{g&N;uMjB^JFfI+yCvvE$Y(Lse>1+(CiunN0_c(y{GV1pC`cxX;7d89g= zt8g824PR7zo?T}kLKm!X(o;F-X7rz^!c73Pj1W_H{WnQ10laF?O?FT9Qd|M+jo1&X zVJ+ui6|7}LK@ZEeCc!NhehVNNx$5G)dy-`&FElAZXflmw`Dl3BMnMP7!lK+Ol4$rMq*@H8WEar3 zP8t$LHXGCde+2q&06}K$;5eP3{t^+R+&Ryyr)=v`HGuW+Q!Bnz`b%cD@5^hex1Lu1 zCiryZH+T3$XYY%rZqTS4q@!z46rPR49%bG(pV6YoB-($pC^TiGf$MP0m1PScM3SXlIO~$xf0#*{h_@EQ&;+ z&S=O{B8s=BtFUOj1ruVL@xgJbID0r3EQ@%PdD9Y%a85I7z=%Y2Vo8LT$;QPQl-iq{ znh&5rUo0(`{Sps$x}oqZ_Ox;f`qxk}a2o-g($ zg3HIAyr1lP z^rM^66GaiV;Or5T#Mp+_9lxBoBeV_()`94mw6#64fBCY|H6&Pvcx!vw>WYsD*4F6h z4QpfEo;bm~_ATFAZRZEZc-NRbR8hN<)o}GIGx<= zf)4(+n`&x}U;L##@t)v5m_09rqgXs&Z63h4i|7w~*EIXY;mMx9zCcr^u=nhm{anPj z;po_=c58QmXn*jipdS$QuE;wvwa_#WKbW`%r?~NuP`4*?dcD>WgJax|$XhR*ZZHO3 zU$&SK>17?oT&$iEnpjx@lK>*KVlw(x7gvidJlzsmkh`8R3 znFm1ih{LMudSKW(2z}XXh6&hwkEWbmWcpAUH2q2*A5FCk2rUCi*M7e70B=0FrWqtz zaYO8fys_uGruUnzdos#)mi`8mrP{;9BjXR7$Mz|HW73TsR1|SGB%rVtsqJULoRG8K zfREA#QbB+#eL#hvvo^jS5Mk(GR=j}2A2{Gc*-B#MML9)k4U{BKXYeM+cJLMtmuQ9@ zQ!(mKRG|2PWdsgD&|@Yi9Otot)H0ScNJSm3Y4vTDwCEU4~Cx2Tha)|(OKIy&@ zn4kL^F$8%-H9g0Ge^03DOxE!Q*!^uk;|k8ZJf?z1a3Fq%mIznR=cMNy(?AMCDe5h;}3~6xKj;1LPJlw ztuxhz6g2H_O}Y0A?)~XpR&#r*`3<4@jhF69vo508Y@@2}56?b0%eNgAtOq07w5Bqp zsTVZ$pIrRK#G{FXV)^`9!~QkR0U!~)xhZ}y-o+ccpKE%)*=h$o0=Q>C+IO@?Rh}xC zfi~wq-(MLERr zLCS%WCTtDfX7OEijZ_w3E@!H+BxCtRB|!np`eiW3AT=WoV+}S-ahUBgR9C9`F~w99 z?Y%PojG2 zsS@>^KL!vPCAty@GFq@)Ga_-6U-Jh=BKzG$T*O5**9Xz1UevVEW-mE%{Tvbfw;22z z2ui4_2a-bW5^DOYb7KdRRHQ8+?OSbylxp2%`Dy6GP|TBZ>=qomlMb-H_C^#)cr}kS zaYy2O($*vT4mSScz@r24Gt2u@dyfixk0$FzQ6K_m!ksc2+`st#qwmM(mv1E-hz#u5 zXzTp!`s3?-&xxm%$+lBiAN&bhKeIiy@tucOZYA9#mPvRKB{2&S72A#fM5zs?O*sJnt(DRmqv}uOvC&k0w@}{=qr=zsE*n?wt=!~| zW6w3GL{CE)>)eA2kw|xV*7tfkegn&uJQ9@#i-t^G^Wag8)RFCk;0a9>?Lw2l*YEMbjmq?SdBzW9pnH}^W(>BG=R1Ug`p(6VD+uj91q31Rbpe%cX zjNBuUn+p^{8AcuVWqG{SUOeyuw5veF_gd_K8R*O>MkJbWMfRI*{4! z79C;a){P4)?zC<=BI9RKWaCg0@FX6fzk+xGVPr+GOoi7AqzR1}fTz6_&s^5&Jg#Yz zC1r98CU?A5Fm>>nj#rn20vaG=+6$4LkOW2r3_A=838)q_+y>}?K-^zN>s$bmijXI? zt`K=M>jwj2ft{;#g_q`^#cnhKTv#Qb=2bQemCaiet?dK?(E+|Qys_n(zV)RXQp8?i zYtn;Eo%HHI0+fdo9QhZxLA-voKwtkfYu}fH7o0*=!r*L2A(|$^Jpit?fCGRU&KYF4 zDRw`21Cl#JP(qGllULNhlTr@$Z%6|ss4DOSeeHUMvTB5dEEwXNPYcd1md+MH*Zwo1 z>poR7;C~3P^_&Vq!>0sCX}{nFGrYW$RU%d5`wOEazQMT?4s%A|RLxl`dRhA+@;XUBoQ>E!`8cx>!Hj8C}GD>O$iim`G_| zsN;g)$4*`^I@w1HD=9(__pcHS1`4}EN-!nDfxgNGwnca=Twu6{O^7Gc?0syvirfY$ zY6Psn!`?3iZnHfQz&3N#M@;K>Fwmr$ z`-SHIq#c~?EZS4_hbJQ=k=x*H7kgi@bwy4V#Ohk&)4ZcMa%#imh|LS8-RZs~t93%( znW&1d-7T2A*Ui;2b)1fmJXXf;#C>1L(UvqU>>5sX9Om1P@JBB4m)_;yV}(lr{$h|1 z-sWrWteNko&9)c%%5>G>O5e(@FZ);8S1bQ=?`kl0;vM0{JISLH{G0Fc@4m;IucWJL zW7_EZ@wS9LQL(&_Hy;3!PhzlZ9Wci2-XA&6 zTReikGu_q4?|Dn;IvF_|J0<8lpiSP|7QYQ*gwTGBZ#%wvm9IMaTtBwijsvmTN$zRX z37Wd+nuga9(?OW0LI#ER)XI~cQA%3$()J^A!Yh1lFF+)GPh#6wK)C>84&1vWqB@Ny zct58f(jcfCfi}yKReR(tq0C4c$60cOBFo6Sdqq*SfINSz9l8crMDH%J!=dhyb%Qry zB*)K!a}=rkEG{6FL=r6{^mBL!{mxRat4cyd?L{%!u2j zRCa(1hXqZA>RyA#3^t1WCj1zhK=bBlVes@?)tRK}46ivuCMRPE_@?~9d)_IyQUsS@ zwG2DI;6)?iaVE|0!P7lPK z=u+z(TnPycC!@LzJ($XYlz=DCrX3pEtf$N_Ueow0bpQm#W#)j$PNG(!B>1XyjU5M9 z_4!iiT1x*B4g%^HFbI&;I~1jqN?Nc*9-9Sj8u^3gLVwbN)Pn5+ z+XK2i(C7S{p@JNRerSbhhO%^l05M`q6MlgDny@&*2d1z2jOeiV(A4q)f(KEDI( z3Mh{=R`L+xtZYts_-I9B3`lSo>IAilkdiC zz6-xUttbnl5OU6O2YU9JwG6Cbwn%Mo6Shn&ZZMZkAPkEs%_O}UU1(rbyi!(7 zDJ`o4D6Lo)ln({dmW2f0&_X+;bYKdBiUPWal+@yxI;WYHy9e){d+v2s7X5wZ;X^!DTfo?#V8CL4 zQVrbA%Bx#0Om$;`{7gJ=Yr$A62JILS9~e~CJUUS=vx~xoIE3Oo@a(W=^w|iw@qqMF zMloZj01#XYBOPE-q#-V>k_02kFcrkJ8!u!91Eq$Vf~-G8X8j?Ecp$`T43T*-oZ|VC z(Y>Z=!i4KfCV0L6v|1rvo8lYy^2U8@ntlXe?vR`V_>Mu|_{N%MXoqCt!_cy(Y0Wo> z$6KKP4GYb~eA8jxcw|j8LTWeTk@=v|GRQZ-v9f1{Ney2VhA;A$-%VX+1^63g`Ng}! z@Lm2M#~%vw;U8{NlxalvTeuGVrfj37Bh@k_v<$5TQ-{wB@Yix4P~)mdZW$>ZV}j*ws*Vre;_!-l<;3dIl|xVIr)~WC3s37vr~d`- zWB5yczG~{Z{@P0u_KC=>9_2IzjBc8uG}PB9H;f+#YsdgbJoIr-BieZ9e6xP9H>2}< zXXly48I0?_-dpg$Hi$XwZQLkut1`#}D2hc<6K+1?e=?-FIzKx0e(Loun5(qSk?z@>b~e8>wJX~t1HYtd%93`*S(WliD|9-6h`0K!n|#{RAG~& zdzB3v#;Rz4%o3Z7*&ZAgjLn-$NQ6dp#)v<9EY=(g#5x|FjbBRaU6v;fJodtsI>Fd4 zXa}~{SdgKw(8|6Pg%HFMByYe)>IY29q(D9aS3g4S5TG6fZX zrE9r$lY-akD0%UhzQ2v1n{BkR2|Uk&j{qr%ZmXJ<*>y`M(qm@Hv7QP{XJGv!3r}2v z`DKG^EK@N#KQrT>6g5;-L&Yn<@L#J0ug^?h75`U;E=>Om3_#iyS4zneg8$$}+yTRE z3W~rAq5@cJQ%=+L-%=HSPaS+t9sGN0*WXdLzoiV2@^@6@|5ja5(bwrMioD2r{C^9O BkkJ4D literal 0 HcmV?d00001 diff --git a/__pycache__/MyDataset.cpython-312.pyc b/__pycache__/MyDataset.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a34377460a27ef3ae91e7813dc77b43ecffc2d5 GIT binary patch literal 4922 zcmcgwZ)_7s7N7P0v3LC^aU2tp5aJ{d<6x3PLMf%qDMvzp(r^W?Rehv;i+7XQ_)pl~ z0EsrI=)_6sfz(8*l%P9Q^XY;>YEVBE>ArBSdQ`eEw#*T0$>}Oxzi^*i!U@5rd$ac1 zhK6#gs@vcM1XyOI}8N~-P$jxf+DHm!iWNO7AtFqfmuKj!p?*&EHeK@yJ(R}k(4Nj zu7^I@D41fvlod=_M;u^^4%tNZ0t&Gr2b2S|4xN2_vS@Hf=fXmGOyb7{bxe1S%gL~$ zD3ZvF;E>KLa+sHe#HggR>Zoe6%9tRFd_+92b5n{c@-gYG6boC6?&5-lAD;c%zkx0w zjnoj2<;JH`P$Nn;25Od4%>uPz++ae4Mv4|ZwLd^qfv1W*tx*+n%9LNROHS7bF5b$wrYy*O`qO!b(p>-Q9G zrXRb}v`zJzy`vjUu3TO(veT@_MsbLq`!t(r7j$uIquCtYWOC(F~Op_dvvR*rCdG}M@K~*+sl1SZvA*@4zP3;gVlg8?ph?t*b|Qs12Wa&^BH-`Rx97?C(K+II`6OCje(C2gkRK?>1Jy&i z-M|x(H=qNbB%R`T0e-8w^vE;bd&8x?n{S&Pt+BP+#{2yfOw186%bqR|Asqnb$2zMW+l*q@u}4LdIKL zXQcBHMTLgsxRlT-jD31_2xz|)PR7S&K+dGBI~7%ygg6gGlw_S5kAzRhB%O*S1ySeT z6=D<8fGk5tdR&eqRNaL&?En7wb83c|uCgt(*=BcLm+p4XY8XH*#1xU%aC21j4z_q4TZEE$)& zR3UL5qTTiOWS=Z01SpI5N9XvYZsYk#BBJvAR83iK%CIZS9a#Svl&?VzZL`!RSFXO* zC>pjvQI*>qoTcvC8o$}lk_s&KT@9u-FP&MgzqRw`re)VH>Gq+og})rR-J5>rSo-+M z^za9n<9zzquhX@{EW6sU=@b8D|0luA!JK15u4?1#>BYKKeagP{TH4XGMw5*kw(y8U z4%bI}KHT$B?}xpMTR!Q!+;!L9vFi5Di3`d3WJ=AtgLyLQ9AJZ^CZ$nN`&goup z`Z7*m+PQ7DW>dO(_pn_jqLVQxVVr{iA!9gJ@OYoR11LZaD-8%jPnVAwMmSMiO~RQte8&Xl#&9}iz_&E07Ql5 zv-A9@q+&TNp|^4gOJZzBi36EIIrB87x-(V&S?XKQ#uZOn#?zMSU-DjkE9-e>#j`u( z*`4+5S^a?~Z^MdrYsR}ZB`)o`8qa!rR=j&N-o07xzVED5HJ3*e%gMX&?C7Cu78&o7 z0_iom2l!42*fBn00Oom}zxsw;L*sWLoP=R)3%Yk2g-V+28OTVoiyFloc4?id$DUQM2c zvlS6_7ryf2!g+kwM)7L`U-#vDxH3V*H?47yeh-1e2dN)@M1?J*aNLIBAWTz`;2Xzd z-g1eh&@>H__4*hazu1R)K_6pF7yDSD4-K~9$!6Gs&_Z%uf|~V!Mze{OX3=a>9Omaf zkus0U6kK#87LB+;n+Y6Pd<8sbL4WCJM@x^BvLcN&bwK*g{0QI3AMG3WQr}9CfoV>& z{$G8wztp$V<6zpZu^Ok@MFv9>evF4L)6}^i;%ueXXSjfM=sD~%&NR*^&*H>Q-UI6v zpmpMaPQu=Y6f80&$*+M>rxjHQpN7XZeM(TnWAY&o%7-y|3zIi6c@`FRLe)8ZWfW%>IN!J!%DT7B9R7)PoFoL|o<~T( z``*WW3j^~5i!F;nYV&f-=j}J!Z@E7UWLoy6o8Gv6T~WUz-|Wv*iAD}9=0HR#}l0kJkcFHo;+kw%?HGjhc>gQJw+%!i0JPe z{eEh}(I2F)Ir?`}f9~#omHLA1?%zj!S=T*)sDMkxFLHS^5S@iL0X$dWzei;J$S&-R zYUA4LoKPb%r4zqmWQ=^eryx!wI!7iFVKtIW2r=D~NWlGAs>?%IivjY3n8V8~;|#2P z1w6IAQMglj-DNg_Z literal 0 HcmV?d00001 diff --git a/__pycache__/MyLSTM.cpython-312.pyc b/__pycache__/MyLSTM.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cca2a60ca2fd9efaef66ed845e9f91b0979a4fe5 GIT binary patch literal 13702 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 a9Flk1A1XW}d1nW|kJocP;V8|%^?v|ez~egr literal 0 HcmV?d00001 diff --git a/__pycache__/MyLayer.cpython-312.pyc b/__pycache__/MyLayer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18dc67768768fee07921921800f4be0304792f43 GIT binary patch literal 12322 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 BVh#WR literal 0 HcmV?d00001 diff --git a/__pycache__/MyTokenizer.cpython-312.pyc b/__pycache__/MyTokenizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e227ec808ec7f7a4d80571d760c5285dbf351946 GIT binary patch literal 4606 zcmbtX>u(#!5x*mk^IvxY7 zKpzKkXLfdOc4l|yH+z5d`#lUiqd&T|a3H`if1w@o;dhv=NgKnw&q$2K=9vPUW(&5o ztzb{v3tXBjIMR-SGwm$6(k__9FkLVN&Iat?UUTd zFL~hag})C4=6K2fLoOYZ0?0pSlY+p9P*@5r9$*;!XB&fpQdo*eQ7LwB&t0zVSvq3K zd!$||{uOx?b4!0%UE!cRzyWi%`nJgR9Kso_-yt%LKqP-)6bsWqcdv@G-@8xIZDAAe6jGoRB zwdCm`!}lRH^j}1pMA2O%9s18AUA8aVQ^FV2-IR;)63VI)!WwZFfaW#gRa9IM^KzLA z14WE7y1IyzcAwX=C@XZtJ!?vdr-;=o(lixoDVFqJz-ZRck~%7-QF#SP0vlg zDt3v7x!oqpUUO8q+zXanldCZEY{hZUWBSN4`b*|mZkLG6d0=1qO+Cvq$xF}SHD{N^ zXGmOn2mNxp;9bQDIpD9jK43nyTf7u7_@E(oRh$sP*UdRCTIuY?oUP*eH##nJUFK}_ zwtJzwG?U?hC_1M`Khc&kjI>7zS2&rqqPW9C)r!DwMsM5ius>$6@%j!fL#|Jn?^(3M z!rI5IHLdWuX=~KvDy-=h%T)M_Osc1x%wi}%tfFem4c zQ1%Lnstf3cakFI_};SS(5pcPS8hPRAaHB51X_zSXt z%&D^{iSMG0<>HBK7Ad+$>@%mPi2EG%gStUHRwcwv`nu=a3$l*dEAG7jA?PI|2;!VF zwuZPTmvwXwEulQ|f2DF_S}KTVvba+kG2!yC-Nd;h=1Z{R4r9eJJh5}1SH-9AOe9e{czn9tLZi3PQQCUjA`3Z6}TWBCL|iU@Sp zydE4XE|X9@AuKDHCK4?}+CL!$tIT$Q@da)kxpCy?@f*iiMmN0sHUr7kv9-6>3J+dc z7f#m$Z>;lgJPP&Q-uKbLpB&tb2&?_I$oRJ1*6-Y6Y++aR%r?&q>~Hi>)cPkj`DlZW z*Z6pyPZ+#VCTuF{MhF+=-y|l^q zH2A$Wes7(B&fte@{BWHgF?jm+eQtwqYtb2+gL|7jiEW47?Pa}R7sn4a+`jI+nt>>F;`fj;uYTMnQtC(|?7j3*(OEid$|Gut7?;dEF@NL0lJ8%pgnhW&5RfXpNysCM- zuWBY-cVE$R#-|rd)b&_bJpgsvOnHA+R1Bn^15CESd`u|j%YumUy999byy3K544KNg%J97h#%j_zVcY1AmR)A*#%#*WbyLkqvJW z@?>2&QxCkk&cC_o9d3A^uX&%p|6<*Hbe%hjPf?3}CR2c0dnQwkNTM!I=vVcLb^$ts zlycO#_fK^4Uz9RF}?p0yQX7emlfSW zI%5;*J}6=VWikXJw6KtXb6q_b9Ya@j;swTB2I44UFh-n)r|_}Xt`Wp7E5(uyWdMpc zwL;(X$cn5(<%iQlxST30P;0U!um=jJJxni!#_2E)-BbQmI0dCVI*z{w1N1a%2-=pN zW!W!nJZt-sf#wNq{t;o=!=EzlPZ=NNd!(-!j<VH?8fb-HV-wAAtYruKSs>hU z00qrpq~)R<&xB)JZpuyB?Ci0X=oSN{w;eE~Uo@O)-s2For z&pq)mv60>60VX!QK76DeJz72YFuK=d>4dMd)zc3nLn~M6k^R-P4>|YsLo1_=#8@pc zR!HEj4r<+`?I^E!6H7>Tn^)v(Fn+rD< hZk2D9-Y>sbUfo~sJy;Kn{*SYK0<*lra0yJ4^k3)!N7euU literal 0 HcmV?d00001 diff --git a/__pycache__/TryBatch.cpython-312.pyc b/__pycache__/TryBatch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf70d936d8c831b81645c1ecc937f5e5e49fcd8f GIT binary patch literal 7701 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 jVJ%zA7Q|Vx#^y4OI0myh%SaBgWG2fKJ8