-yg-ddlmZddlZddlZddlmZmZmZm Z ddl Z Gddej Z Gddej Z dS)N)Accuracy PrecisionRecallF1ScorecHeZdZdZd fd ZdZdZd Zd Zd Z d Z xZ S)timm_backbonesaB PyTorch Lightning model for image classification using a ResNet-18 architecture. This model uses a pre-trained ResNet-18 model and fine-tunes it for a specific number of classes. Args: num_classes (int, optional): The number of classes in the dataset. Defaults to 2. optimizer_cfg (DictConfig, optional): A Hydra configuration object for the optimizer. Methods: forward(x): Computes the forward pass of the model. configure_optimizers(): Configures the optimizer for the model. training_step(batch, batch_idx): Performs a training step on the model. validation_step(batch, batch_idx): Performs a validation step on the model. on_validation_epoch_end(): Called at the end of each validation epoch. test_step(batch, batch_idx): Performs a test step on the model. Example: model = ResNet18(num_classes=2, optimizer_cfg=cfg.model.optimizer) trainer.fit(model, train_dataloaders=train_dataloader, val_dataloaders=val_dataloader) trainer.test(model, dataloaders=test_dataloader) resnet18Nct||_tj|d|_|jjdddkrktj d|jj j |jj j |jj j |jj jd|j_ td| |_t#d| |_t'd| |_t+d| |_||_t1|jd r<|jjj}tj|||j_nt1|jd r<|jjj}tj|||j_nct1|jd r<|jjj}tj|||j_nt=d |||j}|j }|j!}|dkr0tEj#|$|||_%dS|dkr0tEj&|$|||_%dSt=d|d|_%dS)NT) pretrained input_sizeF) in_channels out_channels kernel_sizestridepaddingbias multiclasstask num_classesfc classifierheadz,Unsupported model architecture for encoder: Adamlr weight_decaySGDUnsupported optimizer: )'super__init__encodertimm create_modelmodel default_cfgtorchnnConv2dconv1rrrrraccuracyr precisionrrecallrf1 l1_lambdahasattrr in_featuresLinearrr ValueErrornamer r!optimr parameters optimizerr") selfr&r optimizer_cfgr3r5optimizer_name optimizer_lroptimizer_weight_decay __class__s 3D:\Train-Custom-Classification\encoders\encoders.pyr%ztimm_backbones.__init__ sx  &w4@@@ : !, / 2a 7 $x!Z-: J,8z'. (0 /  DJ !l LLL " +NNN,KHHH |EEE" 4:t $ $ W*-3K!HOOKEEDJMM TZ . . W*/;K$)HOOK$M$MDJ ! ! TZ ( ( W*/5K#hook;GGDJOOUGUUVV V  "*/N(+L%2%? "' M!&DOO,=,=,]s!t!t!t5( M!&4??+<+<\r!s!s!s !K>!K!KLLL!DNNNc,||SN)r)r<xs rBforwardztimm_backbones.forwardOszz!}}rCcd|j}tj|dddd}||ddSNming?g-C6 ?)modefactorpatiencemin_lrval_loss)r; lr_schedulermonitorr;r9rRReduceLROnPlateaur<r; schedulers rBconfigure_optimizersz#timm_backbones.configure_optimizersR=N &88WZegpt8uu & jYYYrCc>|\}}|}||}tjj||}t d|D}||j|zz }|d|dddd|S)Nc3bK|]*}|V+dSrE)abssum).0params rB z/timm_backbones.training_step..`s4GGEeiikkoo''GGGGGGrC train_lossTF)prog_baron_epochon_steplogger) longr+r, functional cross_entropyr]r:r3log)r<batch batch_idxrGylogitslossl1_norms rB training_stepztimm_backbones.training_stepWs1 FFHHax"00;;GGT__5F5FGGGGG (( tdT5Y]^^^ rCcx|\}}|}||}tjj||}tj|d}|||}|||} |||} | ||} | d|ddd| d|ddd| d| ddd| d| ddd| d | ddd|S) NrdimrQTrbrcrdval_acc val_precision val_recallval_f1 rfr+r,rgrhargmaxr/r0r1r2ri r<rjrkrGrlrmrnpredsr/r0r1r2s rBvalidation_stepztimm_backbones.validation_stepgs11 FFHHax"00;; V+++==E**NN1e,, Q&& WWQ   TD4NNN HtdDQQQ )dTSWXXX vtTRRR 2tTJJJ rCc|jjd}|jjd}|d|dd|d|dd||dSNval_loss_epoch val_acc_epochrQT)rbrcru)z Average Loss:z Accuracy:trainerlogged_metricsrir<avg_lossr/s rBon_validation_epoch_endz&timm_backbones.on_validation_epoch_end|c<./?@<.? XtDDD HtdCCC!)AAArCcz|\}}|}||}tjj||}tj|d}|||}|||} |||} | ||} | d|dd| d|dd| d| dd| d| dd| d | dd||| | | d S) Nrrr test_lossTrbretest_acctest_precision test_recalltest_f1r test_accuracyrrrryr{s rB test_stepztimm_backbones.test_stepsD1 FFHHax"00;; V+++==E**NN1e,, Q&& WWQ   dT$??? XTBBB !9tDIII dCCC Bd;;;!HPYjp}AA ArC)r r Nr ) __name__ __module__ __qualname____doc__r%rHrXrpr}rr __classcell__rAs@rBrr s,-"-"-"-"-"-"^ZZZ  *BBBAAAAAAArCrcHeZdZfdZdZdZdZdZdZdZ dZ xZ S) CTCEncoderPLctt|||_tjdd|_||_td||_ td||_ td||_td||_||j}|j}|j}|dkr0t)j||||_dS|dkr0t)j||||_dSt3d |d|_dS) NrT)blank zero_infinityrrrrr"r#)r$rr% ctc_encoderr+r,CTCLossctc_lossr=rr/rr0rr1rr2r8r r!r9rr:r;r"r7)r<rrr=r>r?r@rAs rBr%zCTCEncoderPL.__init__sJ lD!!**,,,&((q(EE * l LLL " +NNN,KHHH |EEE  "*/N(+L%2%? "' M!&DOO,=,=,]s!t!t!t5( M!&4??+<+<\r!s!s!s !K>!K!KLLL!DNNNrCc,||SrE)rrFs rBrHzCTCEncoderPL.forwards"""rCc|\}}}}|||\}}tjj|d}|||||} |d|dks7Jd|dd|ddtj|d} |d| d | S) Nrrrzinput_lengths size (z) must match batch size ()raT)rc) rr+r,rg log_softmaxrsizerzri) r<rjrkrGrl input_lengthstarget_lengthsrm log_probsrnr|s rBrpzCTCEncoderPL.training_steps(.3+1m^ $ 0 0M B B H'33F3CC }}Y=.II!!!$$q 1 G G4G-J\J\]^J_J_4G4Gz{{A{ABC{D{D4G4G4G G G G YB/// td333 rCc|\}}}}|||\}}tjj|d}|d|dks Jd|||||} tj|d} ||| } | || } | || } | || }| d| ddd| d| ddd| d | ddd| d | ddd| d |ddd| S) Nrrrrz-Mismatch between input_lengths and batch sizerQTrtrurvrwrx) rr+r,rgrrrrzr/r0r1r2rir<rjrkrGrlrrrmrrnr|r/r0r1r2s rBr}zCTCEncoderPL.validation_steps.3+1m^!% 0 0M B B H'33F3CC !!!$$ A6gg8gggg}}Y=.II YB///==E**NN1e,, Q&& WWQ   TD4NNN HtdDQQQ )dTSWXXX vtTRRR 2tTJJJ rCc|jjd}|jjd}|d|dd|d|dd||dSrrrs rBrz$CTCEncoderPL.on_validation_epoch_endrrCc|\}}}}||}tjj|d}|||||} tj|d} ||| } ||| } ||| } | || }| d| dd| d| dd| d| dd| d| dd| d |dd| | | | |d S) NrrrrTrrrrrr) r+r,rgrrrzr/r0r1r2rirs rBrzCTCEncoderPL.test_stepsT.3+1m^aH'33F3CC }}Y=.II YB///==E**NN1e,, Q&& WWQ   dT$??? XTBBB !9tDIII dCCC Bd;;;!HPYjp}AA ArCcd|j}tj|dddd}||ddSrJrTrVs rBrXz!CTCEncoderPL.configure_optimizersrYrCc2tj|d}|S)zT Perform greedy decoding to get predictions from log probabilities. rrr)r+rz)r<rr|s rB greedy_decodezCTCEncoderPL.greedy_decodes YB/// rC) rrrr%rHrpr}rrrXrrrs@rBrrs"""""0###   :BBBAAA(ZZZ rCr) torch.optimr9pytorch_lightningplr' torchmetricsrrrrr+LightningModulerrrCrBrs ============ OAOAOAOAOAR'OAOAOAfkkkkk2%kkkkkrC