{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Environment Sanity Check #\n\nClick the _Runtime_ dropdown at the top of the page, then _Change Runtime Type_ and confirm the instance type is _GPU_.\n\nCheck the output of `!nvidia-smi` to make sure you've been allocated a Tesla T4, P4, or P100.","metadata":{}},{"cell_type":"code","source":"!nvidia-smi","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### setup base on https://www.kaggle.com/code/josmariatrindademota/rapids-first-steps/notebook","metadata":{}},{"cell_type":"code","source":"%%time\nimport sys\n\n!cp ../input/rapids/rapids.0.17.0 /opt/conda/envs/rapids.tar.gz\n!cd /opt/conda/envs/ && tar -xzvf rapids.tar.gz > /dev/null\n!rm /opt/conda/envs/rapids.tar.gz\n\nsys.path += [\"/opt/conda/envs/rapids/lib/python3.7/site-packages\"]\nsys.path += [\"/opt/conda/envs/rapids/lib/python3.7\"]\nsys.path += [\"/opt/conda/envs/rapids/lib\"]\n!cp /opt/conda/envs/rapids/lib/libxgboost.so /opt/conda/lib/","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Actual seizureCNN","metadata":{}},{"cell_type":"code","source":"%%time\nimport tensorflow as tf\n\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D\n\nimport random\nimport numpy as np\nimport cupy as cp # NVIDIA equivalent of numpy\n\nimport scipy.io\nfrom cusignal import spectrogram as spectrogram_cu # NVIDIA equivalent of numpy scipy.signal.spectrogram\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preproces the data","metadata":{}},{"cell_type":"code","source":"%%time\nbatch_size = 128\nnum_classes = 2\nepochs = 30\nimg_rows, img_cols = 256, 22","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nall_X_gpu = []\nall_Y_gpu = []\n\ntypes = ['Patient_1_interictal_segment', 'Patient_1_preictal_segment']\n\nfor i,typ in enumerate(types):\n    # Looking at 18 files for each event for a balanced dataset\n    for j in range(18):\n        fl = '/kaggle/input/seizure-prediction/Patient_1/Patient_1/{}_{}.mat'.format(typ, str(j + 1).zfill(4))\n        data = scipy.io.loadmat(fl) # no equivalent from the NVIDIA Rapids, the output is numpy array\n        k = typ.replace('Patient_1_', '') + '_'\n        d_array = data[k + str(j + 1)][0][0][0]\n        lst = list(range(3000000))  # 10 minutes\n        for m in lst[::5000]:\n            # Create a spectrogram every 1 second\n            p_secs = d_array[0][m:m+5000]\n            p_f, p_t, p_Sxx = spectrogram_cu(p_secs, fs=5000, return_onesided=False)\n            p_SS = cp.log1p(p_Sxx)\n            arr = p_SS[:] / cp.max(p_SS)\n            all_X_gpu.append(arr)\n            all_Y_gpu.append(i)\n            \n%%time\n# Shuffling the data\ndataset_gpu = list(zip(all_X_gpu, all_Y_gpu))\nrandom.shuffle(dataset_gpu)\nall_X_gpu,all_Y_gpu = zip(*dataset_gpu)\n\n%%time\n# Splitting data into train/test, leaving only 600 samples for testing\nx_train_gpu = cp.array(all_X_gpu[:21000])\nx_test_gpu = cp.array(all_X_gpu[21000:])\ny_train_gpu = cp.array(all_Y_gpu[:21000])\ny_test_gpu = cp.array(all_Y_gpu[21000:])\n# make hot map\ny_train_gpu = tf.keras.utils.to_categorical(y_train_gpu.get(), num_classes) # need to use get() because it don't work with cupy array\ny_test_gpu = tf.keras.utils.to_categorical(y_test_gpu.get, num_classes)\n# need to convert back to cupy\ny_train_gpu = cupy.asarray(y_train_gpu)\ny_test_gpu = cupy.asarray(y_test_gpu)\n\n%%time\nx_train_gpu = x_train_gpu.reshape(x_train_gpu.shape[0], img_rows, img_cols, 1)\nx_test_gpu = x_test_gpu.reshape(x_test_gpu.shape[0], img_rows, img_cols, 1)\ninput_shape_gpu = (img_rows, img_cols, 1)\nx_train_gpu = x_train_gpu.astype('float32')\nx_test_gpu = x_test_gpu.astype('float32')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create and fit model","metadata":{}},{"cell_type":"code","source":"%%time\nmodel_gpu = Sequential()\n\nmodel_gpu.add(Conv2D(32, kernel_size=(5, 5),\n                 activation='relu',\n                 input_shape_gpu=input_shape))\nmodel_gpu.add(Conv2D(32, (3, 3), activation='relu'))\nmodel_gpu.add(MaxPooling2D(pool_size=(2, 2)))\nmodel_gpu.add(Dropout(0.25))\nmodel_gpu.add(Flatten())\nmodel_gpu.add(Dense(32, activation='relu'))\nmodel_gpu.add(Dropout(0.5))\nmodel_gpu.add(Dense(num_classes, activation='sigmoid'))\n\nmodel_gpu.compile(loss=tf.keras.losses.binary_crossentropy,\n              optimizer=tf.keras.optimizers.RMSprop(),\n              metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nmodel_gpu.fit(x_train_gpu, y_train_gpu,\n          batch_size=batch_size,\n          epochs=epochs,\n          verbose=1,\n          validation_data=(x_test_gpu, y_test_gpu))\nscore_gpu = model_gpu.evaluate(x_test_gpu, y_test_gpu, verbose=0)\nprint('Test loss:', score_gpu[0])\nprint('Test accuracy:', score_gpu[1])","metadata":{},"execution_count":null,"outputs":[]}]}