{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n\n#from tensorflow import keras\n#from tensorflow.keras import layers\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\n\n#eegs = pd.read_parquet('/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/1000913311.parquet')\n# training meta data\ntrainMD = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/train.csv')\ntrainMD.head()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-07T02:48:04.26745Z","iopub.execute_input":"2024-03-07T02:48:04.268166Z","iopub.status.idle":"2024-03-07T02:48:04.542205Z","shell.execute_reply.started":"2024-03-07T02:48:04.268123Z","shell.execute_reply":"2024-03-07T02:48:04.54005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"specPATH = \"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms/\"\neegPATH  = \"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/\"\ndef getSpectrogram(row):\n    spectrogram = pd.read_parquet(specPATH+str(row.spectrogram_id)+'.parquet')\n    spectrogram = spectrogram.fillna(0)\n    #print(spectrogram.shape)\n    return getDataSpec(spectrogram, row)\n\ndef getEEG(row):\n    eeg = pd.read_parquet(eegPATH + str(row.eeg_id) + '.parquet')\n    #print(f\"eeg shape:{eeg.shape}\")\n    return getDataEEG(eeg, row)\n\ndef getDataSpec(spec, row):\n    # returns the cropped specrogram \n    spec = spec.fillna(0)\n    start = int(row.spectrogram_label_offset_seconds)\n    end = start + 600\n    #print(f\"\\tstart:{start}, end:{end}\")\n    #print(\"\\t\\t\", spec.shape)\n    #print(spec.iloc[-1,:])\n    spectrogram = spec.loc[(spec.time>=start)&(spec.time<end)]\n    spectrogram = spectrogram.iloc[:,1:]\n    #print(\"\\t\\t\", spectrogram.shape)\n    return spectrogram\n\ndef getDataEEG(eeg, row):\n    eegStart = int(row.eeg_label_offset_seconds)*200\n    eegEnd = eegStart + 200*50\n    eeg = eeg.iloc[eegStart:eegEnd]\n    return eeg\n    \n\nrow = trainMD.loc[(trainMD.eeg_id==356835670) & (trainMD.eeg_label_offset_seconds==118)].iloc[0]# & (trainMD.spectrogram_id==1730458) & (trainMD.spectrogram_label_offset_seconds==270)].iloc[0]\n\n#print(row)\n#print(row.iloc[-1])\n#print(getEEG(row).head())\n\neeg = pd.read_parquet(eegPATH + str(row.eeg_id) + '.parquet')\nprint(eeg.head())\n#print(getSpectrogram(row).shape)\n#print(getEEG(row).shape)","metadata":{"execution":{"iopub.status.busy":"2024-03-07T02:48:07.16708Z","iopub.execute_input":"2024-03-07T02:48:07.16759Z","iopub.status.idle":"2024-03-07T02:48:07.22595Z","shell.execute_reply.started":"2024-03-07T02:48:07.167553Z","shell.execute_reply":"2024-03-07T02:48:07.22458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# toy network\nclass Net(nn.Module):\n    def __init__(self, inlayer):\n        #print(inlayer)\n        super(Net, self).__init__()\n        self.fcl = nn.Linear(inlayer, 1000)\n        self.fc2 = nn.Linear(1000,6)\n\n    def forward(self, x):\n        #print(x.shape)\n        y = torch.flatten(x, start_dim=1)\n        #print(y.shape)\n        y = F.relu(self.fcl(y))\n        y = F.log_softmax(self.fc2(y), dim=1)\n        return y\n\n\nif get_spec_data:\n    net = Net(300*400)\nelse:\n    net = Net(20*10000)\nprint(\"network init\")","metadata":{"execution":{"iopub.status.busy":"2024-03-07T02:48:11.285546Z","iopub.execute_input":"2024-03-07T02:48:11.286598Z","iopub.status.idle":"2024-03-07T02:48:12.803964Z","shell.execute_reply.started":"2024-03-07T02:48:11.286548Z","shell.execute_reply":"2024-03-07T02:48:12.802556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training loop for encoders\ncriterion = nn.KLDivLoss(reduction=\"batchmean\")\noptimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9)\n\nBATCH_SIZE = 320\nMAX_EPOCHS = 2\nFREQ = trainMD.shape[0] / 10\nimport time\ndef classTrainer(net, optimizer, criterion, eeg=True):\n    n = trainMD.shape[0]\n    n_batchs = n // BATCH_SIZE \n    print(\"Number of Batchs:\", n_batchs)\n    if eeg:\n        batch_tensor = torch.tensor(np.zeros((BATCH_SIZE, 10000, 20))).float()\n    else:\n        batch_tensor = torch.tensor(np.zeros((BATCH_SIZE, 300, 400))).float()\n    for epoch in range(MAX_EPOCHS):\n        trainMD.sample(frac=1)\n        print(f\"Epoch:{epoch+1}\")\n        for i in range(n_batchs):\n            #print(i * BATCH_SIZE, (i+1) * BATCH_SIZE)\n            batch_rows = trainMD.iloc[BATCH_SIZE * i: BATCH_SIZE * (i+1), :]\n            #print(batch_rows.shape)\n            \n            #print(torch.tensor(batch_rows.iloc[:, 9:15].values))\n            #labels = F.normalize(torch.tensor(batch_rows.iloc[:, 9:15].values).float(), dim=1)\n            #labels = F.softmax(torch.tensor(batch_rows.iloc[:, 9:15].values).float(), dim=1)\n            labels = torch.tensor(batch_rows.iloc[:,9:15].values).float()\n            #print(labels)\n            for j in range(batch_rows.shape[0]):\n                row = batch_rows.iloc[j,:]\n                if eeg:\n                    data_id = row.eeg_id\n                    batch_tensor[j] = torch.tensor(getEEG(row).values).float()\n                else:\n                    data_id = row.spectrogram_id\n                    batch_tensor[j] = torch.tensor( getSpectrogram(row).values).float()\n\n            #print(f\"\\tLoaded Batch {i} Data\")\n            \n            # zero the parameter gradients\n            optimizer.zero_grad()\n\n            # forward + backward + optimize\n            outputs = net(batch_tensor)\n            #print(f\"\\t{outputs[0]}\")\n            #print(f\"\\t{labels[0]}\")\n            loss = criterion(outputs, labels)\n            print(f\"\\tBatch:{i+1}, Loss:{loss}\")\n            loss.backward()\n            optimizer.step()\n            #if i % FREQ == FREQ - 1:\nclassTrainer(net, optimizer, criterion, not get_spec_data)\nprint('Finished Training')","metadata":{"execution":{"iopub.status.busy":"2024-03-07T02:48:26.76251Z","iopub.execute_input":"2024-03-07T02:48:26.763375Z","iopub.status.idle":"2024-03-07T06:14:53.124776Z","shell.execute_reply.started":"2024-03-07T02:48:26.763315Z","shell.execute_reply":"2024-03-07T06:14:53.12053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"####### DO NOT RUN THIS ############\n\n# Load All Spectrograms or all eegs\nget_spec_data = True\n\n\nid_type = \"spectrogram_id\"\nif not get_spec_data:\n    id_type=\"eeg_id\"\ntrainMD = trainMD[:1000]\ntrain_spec_ids = trainMD[id_type].unique()\nprint(f\"Total {id_type} is {len(train_spec_ids)}\")\ntrain_raw = {}\ncount = -1\nfor did in train_spec_ids:\n    if get_spec_data:\n        train_raw[did] = pd.read_parquet(specPATH+str(row.spectrogram_id)+'.parquet')\n        print(train_raw[did].shape)\n        if id == 1628180742:\n            print(train_raw[did].shape)\n            print(train_raw[did].iloc[-1,:])\n    else:\n        train_raw[did] = pd.read_parquet(eegPATH+str(row.eeg_id)+'.parquet')\n        #if id == 374504640:\n        if not train_raw[did].shape[0] == 31200:\n            print(did, train_raw[did].shape)\n        if id == 1543976471:\n            print(train_raw[did].shape)\n        #print(train_raw[id].shape)\n        #    print(train_raw[id].iloc[-1,:])\n    count += 1\n    if count % (len(train_spec_ids)//10) == 0:\n        print(f\"\\tLoaded {round(100*count/len(train_spec_ids),1)}% of {id_type}\")\n        #print(f\"\\t\\tShape:{train_raw[id].shape}\")\n        #print(f\"\\t\\tShape2:{getDataSpec(train_raw[id], trainMD.iloc[1]).shape}\")\nprint(\"Data Loaded\")","metadata":{"execution":{"iopub.status.busy":"2024-03-07T02:47:56.808714Z","iopub.status.idle":"2024-03-07T02:47:56.80924Z","shell.execute_reply.started":"2024-03-07T02:47:56.808995Z","shell.execute_reply":"2024-03-07T02:47:56.809015Z"},"trusted":true},"execution_count":null,"outputs":[]}]}