{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"},{"sourceId":6632733,"sourceType":"datasetVersion","datasetId":3785250,"isSourceIdPinned":true},{"sourceId":7094186,"sourceType":"datasetVersion","datasetId":4088466},{"sourceId":7094455,"sourceType":"datasetVersion","datasetId":4088632},{"sourceId":144358840,"sourceType":"kernelVersion"},{"sourceId":149254949,"sourceType":"kernelVersion"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Code modified from below orginal notebook and codes\n## https://www.kaggle.com/code/tubotubo/cmi-submit\n## https://github.com/tubo213/kaggle-child-mind-institute-detect-sleep-states/tree/main","metadata":{}},{"cell_type":"code","source":"!pip install hydra-core segmentation_models_pytorch==0.3.3 --no-index --find-links=/kaggle/input/ex-library -q","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install jupyter_black -q","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd /kaggle/working/","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -r /kaggle/input/cmi-code ./\n!cp -r /kaggle/input/cmi-model ./\n!cp -r /kaggle/input/cmidssv2/exp003 ./cmi-model/exp0001","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp -r /kaggle/input/cmidssv1/dummy ./cmi-model/exp0002\n!cp -r /kaggle/input/cmidssv1/exp001 ./cmi-model/exp0003\n!cp -r /kaggle/input/cmidssv1/exp002 ./cmi-model/exp0004","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/run/conf/dir/kaggle.yaml\ndata_dir: /kaggle/input/child-mind-institute-detect-sleep-states\nprocessed_dir: /kaggle/working/processed_data\noutput_dir: /kaggle/working/output\nmodel_dir: /kaggle/working/cmi-model\nsub_dir: /kaggle/working","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp018\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!python -m run.prepare_data dir=kaggle phase=$PHASE","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %cd /kaggle/input/cmi-code/kaggle-child-mind-institute-detect-sleep-states/","metadata":{"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/src/modelmodule/seg.py\nfrom typing import Optional\n\nimport numpy as np\nimport polars as pl\nimport torch\nimport torch.optim as optim\nfrom omegaconf import DictConfig\nfrom pytorch_lightning import LightningModule\nfrom torchvision.transforms.functional import resize\nfrom transformers import get_cosine_schedule_with_warmup\n\nfrom src.datamodule.seg import nearest_valid_size\nfrom src.models.common import get_model\nfrom src.utils.metrics import event_detection_ap\nfrom src.utils.post_process import post_process_for_seg\nfrom pathlib import Path\n\n\nclass SegModel(LightningModule):\n    def __init__(\n        self,\n        cfg: DictConfig,\n        val_event_df: pl.DataFrame,\n        feature_dim: int,\n        num_classes: int,\n        duration: int,\n    ):\n        super().__init__()\n        self.cfg = cfg\n        self.val_event_df = val_event_df\n        num_timesteps = nearest_valid_size(int(duration * cfg.upsample_rate), cfg.downsample_rate)\n        model = get_model(\n            cfg,\n            feature_dim=feature_dim,\n            n_classes=num_classes,\n            num_timesteps=num_timesteps // cfg.downsample_rate,\n        )\n        weight_path = (\n                    Path(cfg.dir.model_dir)\n                            / cfg[\"exp_name\"]\n                            / 'single'\n                            / \"best_model.pth\"\n                        )\n        model.load_state_dict(torch.load(weight_path))\n        self.model = model\n        self.duration = duration\n        self.validation_step_outputs: list = []\n        self.test_step_outputs: list = []\n        self.__best_loss = np.inf\n\n    def forward(\n        self, x: torch.Tensor, labels: Optional[torch.Tensor] = None\n    ) -> dict[str, Optional[torch.Tensor]]:\n        return self.model(x, labels)\n\n    def training_step(self, batch, batch_idx):\n        return self.__share_step(batch, \"train\")\n\n    def validation_step(self, batch, batch_idx):\n        return self.__share_step(batch, \"val\")\n    \n    def test_step(self, batch, batch_idx):\n        return self.__share_step(batch, \"test\")\n\n    def __share_step(self, batch, mode: str) -> torch.Tensor:\n        if mode == \"train\":\n            do_mixup = np.random.rand() < self.cfg.augmentation.mixup_prob\n            do_cutmix = np.random.rand() < self.cfg.augmentation.cutmix_prob\n        elif mode == \"val\" or mode == \"test\" :\n            do_mixup = False\n            do_cutmix = False\n\n        output = self.model(batch[\"feature\"], batch[\"label\"], do_mixup, do_cutmix)\n        loss: torch.Tensor = output[\"loss\"]\n        logits = output[\"logits\"]  # (batch_size, n_timesteps, n_classes)\n\n        if mode == \"train\":\n            self.log(\n                f\"{mode}_loss\",\n                loss.detach().item(),\n                on_step=False,\n                on_epoch=True,\n                logger=True,\n                prog_bar=True,\n            )\n        elif mode == \"val\":\n            resized_logits = resize(\n                logits.sigmoid().detach().cpu(),\n                size=[self.duration, logits.shape[2]],\n                antialias=False,\n            )\n            resized_labels = resize(\n                batch[\"label\"].detach().cpu(),\n                size=[self.duration, logits.shape[2]],\n                antialias=False,\n            )\n            self.validation_step_outputs.append(\n                (\n                    batch[\"key\"],\n                    resized_labels.numpy(),\n                    resized_logits.numpy(),\n                    loss.detach().item(),\n                )\n            )\n            self.log(\n                f\"{mode}_loss\",\n                loss.detach().item(),\n                on_step=False,\n                on_epoch=True,\n                logger=True,\n                prog_bar=True,\n            )\n            \n        elif mode == \"test\":\n            resized_logits = resize(\n                logits.sigmoid().detach().cpu(),\n                size=[self.duration, logits.shape[2]],\n                antialias=False,\n            )\n            resized_labels = resize(\n                batch[\"label\"].detach().cpu(),\n                size=[self.duration, logits.shape[2]],\n                antialias=False,\n            )\n            self.test_step_outputs.append(\n                (\n                    batch[\"key\"],\n                    resized_labels.numpy(),\n                    resized_logits.numpy(),\n                    loss.detach().item(),\n                )\n            )\n            self.log(\n                f\"{mode}_loss\",\n                loss.detach().item(),\n                on_step=False,\n                on_epoch=True,\n                logger=True,\n                prog_bar=True,sync_dist=True\n            )\n\n        return loss\n\n    def on_validation_epoch_end(self):\n        keys = []\n        for x in self.validation_step_outputs:\n            keys.extend(x[0])\n        labels = np.concatenate([x[1] for x in self.validation_step_outputs])\n        preds = np.concatenate([x[2] for x in self.validation_step_outputs])\n        losses = np.array([x[3] for x in self.validation_step_outputs])\n        loss = losses.mean()\n\n        val_pred_df = post_process_for_seg(\n            keys=keys,\n            preds=preds[:, :, [1, 2]],\n            score_th=self.cfg.post_process.score_th,\n            distance=self.cfg.post_process.distance,\n        )\n        score = event_detection_ap(self.val_event_df.to_pandas(), val_pred_df.to_pandas())\n        self.log(\"val_score\", score, on_step=False, on_epoch=True, logger=True, prog_bar=True)\n\n        if loss < self.__best_loss:\n            np.save(\"keys.npy\", np.array(keys))\n            np.save(\"labels.npy\", labels)\n            np.save(\"preds.npy\", preds)\n            val_pred_df.write_csv(\"val_pred_df.csv\")\n            torch.save(self.model.state_dict(), \"best_model.pth\")\n            print(f\"Saved best model {self.__best_loss} -> {loss}\")\n            self.__best_loss = loss\n\n        self.validation_step_outputs.clear()\n        \n    def on_test_epoch_end(self):\n        keys = []\n        for x in self.test_step_outputs:\n            keys.extend(x[0])\n        labels = np.concatenate([x[1] for x in self.test_step_outputs])\n        preds = np.concatenate([x[2] for x in self.test_step_outputs])\n        losses = np.array([x[3] for x in self.test_step_outputs])\n        loss = losses.mean()\n\n        val_pred_df = post_process_for_seg(\n            keys=keys,\n            preds=preds[:, :, [1, 2]],\n            score_th=self.cfg.post_process.score_th,\n            distance=self.cfg.post_process.distance,\n        )\n        score = event_detection_ap(self.val_event_df.to_pandas(), val_pred_df.to_pandas())\n        self.log(\"test_score\", score, on_step=False, on_epoch=True, logger=True, prog_bar=True,sync_dist=True)\n\n        if loss < self.__best_loss:\n            np.save(\"keys.npy\", np.array(keys))\n            np.save(\"labels.npy\", labels)\n            np.save(\"preds.npy\", preds)\n            val_pred_df.write_csv(\"val_pred_df.csv\")\n           # torch.save(self.model.state_dict(), \"best_model.pth\")\n            print(f\"Saved best model {self.__best_loss} -> {loss}\")\n            self.__best_loss = loss\n\n        self.test_step_outputs.clear()\n\n    def configure_optimizers(self):\n        optimizer = optim.AdamW(self.parameters(), lr=self.cfg.optimizer.lr)\n        scheduler = get_cosine_schedule_with_warmup(\n            optimizer, num_training_steps=self.trainer.max_steps, **self.cfg.scheduler\n        )\n        return [optimizer], [{\"scheduler\": scheduler, \"interval\": \"step\"}]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/run/train.py\nimport logging\nfrom pathlib import Path\n\nimport hydra\nimport torch\nimport torch.nn as nn\nfrom src.datamodule.seg import TestDataset, load_chunk_features, nearest_valid_size\nfrom omegaconf import DictConfig\nfrom pytorch_lightning import Trainer, seed_everything\nfrom pytorch_lightning.callbacks import (\n    LearningRateMonitor,\n    ModelCheckpoint,\n    RichModelSummary,\n    RichProgressBar,\n)\nfrom pytorch_lightning.loggers import WandbLogger, CSVLogger\n\nfrom src.datamodule.seg import SegDataModule\nfrom src.modelmodule.seg import SegModel\n\nfrom src.models.common import get_model\n# from src.utils.common import trace\n# from src.utils.post_process import post_process_for_seg\n\n\ndef load_model(cfg: DictConfig) -> nn.Module:\n    num_timesteps = nearest_valid_size(int(cfg.duration * cfg.upsample_rate), cfg.downsample_rate)\n    model = get_model(\n        cfg,\n        feature_dim=len(cfg.features),\n        n_classes=len(cfg.labels),\n        num_timesteps=num_timesteps // cfg.downsample_rate,\n    )\n\n    # load weights\n   # if cfg.weight is not None:\n    weight_path = (\n        Path(cfg.dir.model_dir)\n        / cfg['exp_name']\n        / 'single'\n        / \"best_model.pth\"\n    )\n    model.load_state_dict(torch.load(weight_path))\n    print('load weight from \"{}\"'.format(weight_path))\n    return model\n\nlogging.basicConfig(\n    level=logging.INFO, format=\"%(asctime)s - %(levelname)s:%(name)s - %(message)s\"\n)\nLOGGER = logging.getLogger(Path(__file__).name)\n\n\n@hydra.main(config_path=\"conf\", config_name=\"train\", version_base=\"1.2\")\ndef main(cfg: DictConfig):  # type: ignore\n    seed_everything(cfg.seed)\n#     cfg.model.name = 'Spec2DCNN'\n#     cfg.decoder.name = 'UNet1DDecoder'\n#     cfg.exp_name = 'exp018'\n\n    # init lightning model\n   # print(cfg)\n    datamodule = SegDataModule(cfg)\n    LOGGER.info(\"Set Up DataModule\")\n    model = SegModel(\n        cfg, datamodule.valid_event_df, len(cfg.features), len(cfg.labels), cfg.duration\n    )\n\n    # set callbacks\n    checkpoint_cb = ModelCheckpoint(\n        verbose=True,\n        monitor=cfg.monitor,\n        mode=cfg.monitor_mode,\n        save_top_k=1,\n        save_last=False,\n    )\n    lr_monitor = LearningRateMonitor(\"epoch\")\n    progress_bar = RichProgressBar()\n    model_summary = RichModelSummary(max_depth=2)\n\n    # init experiment logger\n#     pl_logger = WandbLogger(\n#         name=cfg.exp_name,\n#         project=\"child-mind-institute-detect-sleep-states\",\n#     )\n\n    pl_logger = CSVLogger(\"logs\", name=cfg.exp_name\n    )\n\n    trainer = Trainer(\n        # env\n        default_root_dir=Path.cwd(),\n        # num_nodes=cfg.training.num_gpus,\n        accelerator=cfg.accelerator,\n        precision=16 if cfg.use_amp else 32,\n        # training\n        fast_dev_run=cfg.debug,  # run only 1 train batch and 1 val batch\n        max_epochs=cfg.epoch,\n        max_steps=cfg.epoch * len(datamodule.train_dataloader()),\n        gradient_clip_val=cfg.gradient_clip_val,\n        accumulate_grad_batches=cfg.accumulate_grad_batches,\n        callbacks=[checkpoint_cb, lr_monitor, progress_bar, model_summary],\n        logger=pl_logger,\n        #resume_from_checkpoint='/kaggle/input/cmi-model/exp018/single/best_model.pth',\n        num_sanity_val_steps=0,\n        log_every_n_steps=int(len(datamodule.train_dataloader()) * 0.1),\n        sync_batchnorm=True,\n        check_val_every_n_epoch=cfg.check_val_every_n_epoch,\n    )\n\n\n   # trainer.fit(model, datamodule=datamodule)\n\n    # load best weights\n#     model = model.load_from_checkpoint(\n#         '/kaggle/input/cmi-model/exp018/single/best_model.pth',\n#         cfg=cfg,\n#         val_event_df=datamodule.valid_event_df,\n#         feature_dim=len(cfg.features),\n#         num_classes=len(cfg.labels),\n#         duration=cfg.duration,\n#     )\n  #  print(cfg)\n   # model = load_model(cfg)\n    trainer.test(model=model,dataloaders=datamodule.val_dataloader())\n\n#     # load best weights\n#     model = model.load_from_checkpoint(\n#         checkpoint_cb.best_model_path,\n#         cfg=cfg,\n#         val_event_df=datamodule.valid_event_df,\n#         feature_dim=len(cfg.features),\n#         num_classes=len(cfg.labels),\n#         duration=cfg.duration,\n#     )\n#     weights_path = str(\"model_weights.pth\")  # type: ignore\n#     LOGGER.info(f\"Extracting and saving best weights: {weights_path}\")\n#     torch.save(model.model.state_dict(), weights_path)\n\n    return\n\n\nif __name__ == \"__main__\":\n    main()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp018\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp0001\"\nmodel_encoder = 'resnext101_32x4d'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp0004\"\nmodel_encoder = 'resnext101_32x4d'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp0003\"\nmodel_encoder = 'efficientnet-b0'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp0002\"\nmodel_encoder = 'resnet18'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 11520\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp016\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp017\"\nmodel_encoder = 'tu-resnest269e'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp019\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp020\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp021\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp015\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp014\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 5760\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp013\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 2880\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp012\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 2880\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp011\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 34560\nDOWNSAMPLE_RATE = 4\nPHASE = \"train\"\nEXP_NAME = \"exp010\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 17280\nDOWNSAMPLE_RATE = 2\nPHASE = \"train\"\nEXP_NAME = \"exp009\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 18048\nDOWNSAMPLE_RATE = 4\nPHASE = \"train\"\nEXP_NAME = \"exp008\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 36096\nDOWNSAMPLE_RATE = 12\nPHASE = \"train\"\nEXP_NAME = \"exp007\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output\n\nDURATION = 28800\nDOWNSAMPLE_RATE = 6\nPHASE = \"train\"\nEXP_NAME = \"exp006\"\nmodel_encoder = 'resnet34'\n\n!python -m run.train\\\n    dir=kaggle\\\n    model.encoder_name=$model_encoder\\\n    model.name=Spec2DCNN\\\n    decoder.name=UNet1DDecoder\\\n    model.encoder_weights=null\\\n    num_workers=3\\\n    exp_name=$EXP_NAME\\\n    duration=$DURATION\\\n    downsample_rate=$DOWNSAMPLE_RATE\\\n    post_process.score_th=0.005\\\n    post_process.distance=40\n\n!rm -r /kaggle/working/output","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%cd /kaggle/working/\n!rm -r /kaggle/working/processed_data\n!rm -r /kaggle/working/cmi-code\n!rm -r /kaggle/working/cmi-model","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# DURATION = 28800\n# DOWNSAMPLE_RATE = 6\n# PHASE = \"train\"\n# EXP_NAME = \"exp006\"\n# model_encoder = 'resnet34'\n\n# !python -m run.train\\\n#     dir=kaggle\\\n#     model.encoder_name=$model_encoder\\\n#     model.name=Spec2DCNN\\\n#     decoder.name=UNet1DDecoder\\\n#     model.encoder_weights=null\\\n#     num_workers=3\\\n#     exp_name=$EXP_NAME\\\n#     duration=$DURATION\\\n#     downsample_rate=$DOWNSAMPLE_RATE\\\n#     post_process.score_th=0.005\\\n#     post_process.distance=40","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %cd /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %cd /kaggle/working/cmi-code/kaggle-child-mind-institute-detect-sleep-states/\n# import pandas as pd\n# import torch\n# from pathlib import Path\n# from hydra import initialize, compose\n# from hydra.core.global_hydra import GlobalHydra\n\n# from src.utils.metrics import event_detection_ap\n\n# from src.utils.post_process import post_process_for_seg\n# import jupyter_black\n# import numpy as np\n# import polars as pl\n# import matplotlib.pyplot as plt\n# import seaborn as sns\n\n# jupyter_black.load()\n# plt.style.use(\"ggplot\")\n\n# EXP_NAME = \"exp0001\"\n# RUN_NAME = \"single\"\n# # RESULT_DIR = Path(\"/kaggle/working/\") / EXP_NAME / RUN_NAME\n# RESULT_DIR = Path(\"cmi-model/\") / EXP_NAME / RUN_NAME\n\n\n# def load_config(result_dir: Path):\n#     # clear previous initialization\n#     GlobalHydra.instance().clear()\n\n#     # initialize hydra\n#     config_path = result_dir.as_posix() + \"/.hydra\"\n#     initialize(config_path=config_path)\n#     # load the config\n#     cfg = compose(config_name=\"config\")\n\n#     return cfg","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %cd /kaggle\n# cfg = load_config(RESULT_DIR)\n","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %cd /kaggle/working\n# preds = np.load(RESULT_DIR / \"preds.npy\")\n# labels = np.load(RESULT_DIR / \"labels.npy\")\n# keys = np.load(RESULT_DIR / \"keys.npy\")\n\n# gt_df = pd.read_csv(Path(cfg.dir.data_dir) / \"train_events.csv\")\n# gt_df = gt_df[gt_df[\"series_id\"].isin(cfg.split.valid_series_ids)].dropna().reset_index(drop=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cfg.model","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# preds.shape","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def nms(predictions, scores, nms_threshold):\n#     order = np.argsort(scores)[::-1]\n#     keep = []\n\n#     while order.size > 0:\n#         i = order[0]\n#         keep.append(i)\n#         keep_pred = predictions[[i]]\n#         other_preds = predictions[order]\n#         enough_far = np.abs(other_preds - keep_pred) > nms_threshold\n#         order = order[enough_far]\n#     return keep","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n# import polars as pl\n# from scipy.signal import find_peaks\n\n\n# def post_process_for_seg(\n#     keys: list[str], preds: np.ndarray, score_th: float = 0.01, distance: int = 5000\n# ) -> pl.DataFrame:\n#     \"\"\"make submission dataframe for segmentation task\n\n#     Args:\n#         keys (list[str]): list of keys. key is \"{series_id}_{chunk_id}\"\n#         preds (np.ndarray): (num_series * num_chunks, duration, 2)\n#         score_th (float, optional): threshold for score. Defaults to 0.5.\n\n#     Returns:\n#         pl.DataFrame: submission dataframe\n#     \"\"\"\n#     series_ids = np.array(list(map(lambda x: x.split(\"_\")[0], keys)))\n#     unique_series_ids = np.unique(series_ids)\n\n#     records = []\n#     for series_id in unique_series_ids:\n#         series_idx = np.where(series_ids == series_id)[0]\n#         this_series_preds = preds[series_idx].reshape(-1, 2)\n\n#         for i, event_name in enumerate([\"onset\", \"wakeup\"]):\n#             this_event_preds = this_series_preds[:, i]\n#             steps = np.where(this_event_preds > score_th)[0]\n#             scores = this_event_preds[steps]\n\n#             keep = nms(steps, scores, distance)\n#             steps = steps[keep]\n#             scores = scores[keep]\n\n#             for step, score in zip(steps, scores):\n#                 records.append(\n#                     {\n#                         \"series_id\": series_id,\n#                         \"step\": step,\n#                         \"event\": event_name,\n#                         \"score\": score,\n#                     }\n#                 )\n\n#     if len(records) == 0:  # 一つも予測がない場合はdummyを入れる\n#         records.append(\n#             {\n#                 \"series_id\": series_id,\n#                 \"step\": 0,\n#                 \"event\": \"onset\",\n#                 \"score\": 0,\n#             }\n#         )\n\n#     sub_df = pl.DataFrame(records).sort(by=[\"series_id\", \"step\"])\n#     row_ids = pl.Series(name=\"row_id\", values=np.arange(len(sub_df)))\n#     sub_df = sub_df.with_columns(row_ids).select([\"row_id\", \"series_id\", \"step\", \"event\", \"score\"])\n#     return sub_df","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import optuna\n\n\n# def objective(trial: optuna.Trial):\n#     score_th = 0.005\n#    # score_th = trial.suggest_float(\"score_th\", 0.0001, 0.01,step=0.0001)\n#     distance = trial.suggest_int(\"distance\", 1, 200)\n\n#     pred_df: pl.DataFrame = post_process_for_seg(\n#         keys, preds[:, :, [1, 2]], score_th=score_th, distance=distance\n#     )\n#     score = event_detection_ap(gt_df, pred_df.to_pandas())\n\n#     return score\n\n\n# study = optuna.create_study(direction=\"maximize\")\n# study.optimize(objective, n_trials=200,n_jobs=16)\n\n# print(study.best_params)","metadata":{"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for score_th in [0.01]:\n#     pred_df: pl.DataFrame = post_process_for_seg(\n#         keys, preds[:, :, [1, 2]], score_th=score_th, distance=100\n#     )\n#     score = event_detection_ap(gt_df, pred_df.to_pandas())\n\n#     print(f\"score_th: {score_th}, score: {score}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def plot_random_sample(keys, preds, labels, num_samples=1, num_chunks=10):\n#     # get series ids\n#     series_ids = np.array(list(map(lambda x: x.split(\"_\")[0], keys)))\n#     unique_series_ids = np.unique(series_ids)\n\n#     # get random series\n#     random_series_ids = np.random.choice(unique_series_ids, num_samples)\n\n#     for i, random_series_id in enumerate(random_series_ids):\n#         # get random series\n#         series_idx = np.where(series_ids == random_series_id)[0]\n#         this_series_preds = preds[series_idx].reshape(-1, 3)\n#         this_series_labels = labels[series_idx].reshape(-1, 3)\n\n#         # split series\n#         this_series_preds = np.split(this_series_preds, num_chunks)\n#         this_series_labels = np.split(this_series_labels, num_chunks)\n\n#         fig, axs = plt.subplots(num_chunks, 1, figsize=(20, 5 * num_chunks))\n#         if num_chunks == 1:\n#             axs = [axs]\n#         for j in range(num_chunks):\n#             this_series_preds_chunk = this_series_preds[j]\n#             this_series_labels_chunk = this_series_labels[j]\n\n#             # get onset and wakeup idx\n#             onset_idx = np.nonzero(this_series_labels_chunk[:, 1])[0]\n#             wakeup_idx = np.nonzero(this_series_labels_chunk[:, 2])[0]\n\n#             axs[j].plot(this_series_preds_chunk[:, 0], label=\"pred_sleep\")\n#             axs[j].plot(this_series_preds_chunk[:, 1], label=\"pred_onset\")\n#             axs[j].plot(this_series_preds_chunk[:, 2], label=\"pred_wakeup\")\n#             axs[j].vlines(onset_idx, 0, 1, label=\"onset\", linestyles=\"dashed\", color=\"C1\")\n#             axs[j].vlines(wakeup_idx, 0, 1, label=\"wakeup\", linestyles=\"dashed\", color=\"C2\")\n#             axs[j].set_ylim(0, 1)\n#             axs[j].set_title(f\"series_id: {random_series_id} chunk_id: {j}\")\n#             axs[j].legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0)\n\n#     plt.tight_layout()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_random_sample(keys, preds, labels, num_chunks=10)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}