{"cells":[{"metadata":{},"cell_type":"markdown","source":"[Next notebook](https://www.kaggle.com/keremt/05-sequence-model)"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"from fastai.vision.all import *","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"datapath = Path(\"/kaggle/input/rsna-str-pulmonary-embolism-detection/\")\ntrain_df = pd.read_csv(datapath/'train.csv')\ntest_df = pd.read_csv(datapath/'test.csv')\nimagepath = Path(\"/kaggle/input/rsna-str-pe-detection-jpeg-256/\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Image Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_files = get_image_files(imagepath)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sids = [o.parent.parent.name for o in trn_files]\nsopids = [o.stem.split(\"_\")[1] for o in trn_files]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_df = pd.DataFrame({\"StudyInstanceUID\":sids, \"SOPInstanceUID\":sopids, \"fname\":trn_files})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = train_df.merge(img_df, on=['StudyInstanceUID', 'SOPInstanceUID'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"assert train_df['fname'].isna().sum() == 0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Load Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_dls(files, size=256, bs=128):\n    tfms = [[PILImage.create, ToTensor, RandomResizedCrop(size, min_scale=0.9)], \n            [lambda o: 0, Categorize()]]\n\n    dsets = Datasets(files, tfms=tfms, splits=([0,1], [2,3]))\n\n    batch_tfms = [IntToFloatTensor]\n    dls = dsets.dataloaders(bs=bs, after_batch=batch_tfms, num_workers=2)\n    return dls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dls = get_dls(trn_files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dls.c = 2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = cnn_learner(dls, xresnet34, pretrained=True)\nlearn.path = Path(\"/kaggle/input/rsnastrpecnnmodel/\")\nlearn.load('xresnet34-256_3');","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Generate Embeddings"},{"metadata":{"trusted":true},"cell_type":"code","source":"class EmbeddingHook:\n    def __init__(self, m, csz=500000, n_init=0):\n        self.embeddings = tensor([])\n        self.m = m\n        if len(m._forward_hooks) > 0: self.reset()\n        self.hook = Hook(m, self.hook_fn, cpu=True)\n        self.save_iter = n_init\n        self.chunk_size = csz\n    \n    def hook_fn(self, m, inp, out): \n        \"Stack and save computed embeddings\"\n        self.embeddings = torch.cat([self.embeddings, out])\n        if self.embeddings.shape[0] > self.chunk_size:\n            self.save()\n            self.embeddings = tensor([])\n    \n    def reset(self): \n        self.m._forward_hooks = OrderedDict()\n        \n    def save(self): \n        torch.save(self.embeddings.to(torch.float16), f\"train_embs-{self.save_iter}.pkl\")\n        self.save_iter += 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"emb_hook = EmbeddingHook(learn.model[1][1], n_init=0)\ntest_dl = learn.dls.test_dl(train_df['fname'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dl.show_batch(max_n=16)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, _ = learn.get_preds(dl=test_dl)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"torch.save(emb_hook.embeddings.to(torch.float16), \"train_embs-final.pkl\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.to_csv(\"train.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}