{"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":"code","source":"#import libraries\n\n#general libraries \nimport numpy as np \nimport pandas as pd \nimport os\nimport random\nfrom sklearn.utils import shuffle\nimport shutil\n\n#visualizations\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.express as px\nimport matplotlib.patches as patches\n\n# work with images\nfrom skimage.transform import rotate\nfrom skimage import io\nimport cv2 as cv\n\n# model development\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import RandomFlip, RandomZoom, RandomRotation\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow.keras.optimizers import Adam\n\nimport warnings\nwarnings.simplefilter(\"ignore\", category=DeprecationWarning)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:20:22.777123Z","iopub.execute_input":"2023-01-20T04:20:22.778853Z","iopub.status.idle":"2023-01-20T04:20:22.787376Z","shell.execute_reply.started":"2023-01-20T04:20:22.778811Z","shell.execute_reply":"2023-01-20T04:20:22.786405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.__version__","metadata":{"execution":{"iopub.status.busy":"2023-01-19T15:10:35.3269Z","iopub.execute_input":"2023-01-19T15:10:35.32727Z","iopub.status.idle":"2023-01-19T15:10:35.336845Z","shell.execute_reply.started":"2023-01-19T15:10:35.327237Z","shell.execute_reply":"2023-01-19T15:10:35.335806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#get files\ntest_path = '/kaggle/input/subject1data/test'\ntrain_path = '/kaggle/input/subject1data/train'\n#sample_submission = pd.read_csv('../input/histopathologic-cancer-detection/sample_submission.csv')\ntrain_data = pd.read_csv('/kaggle/input/subject1data/train.csv')","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:22:17.819356Z","iopub.execute_input":"2023-01-20T04:22:17.81974Z","iopub.status.idle":"2023-01-20T04:22:17.828702Z","shell.execute_reply.started":"2023-01-20T04:22:17.819709Z","shell.execute_reply":"2023-01-20T04:22:17.827634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:22:20.920919Z","iopub.execute_input":"2023-01-20T04:22:20.921892Z","iopub.status.idle":"2023-01-20T04:22:20.942125Z","shell.execute_reply.started":"2023-01-20T04:22:20.921857Z","shell.execute_reply":"2023-01-20T04:22:20.941254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# have a look at the format of the data\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:22:30.196877Z","iopub.execute_input":"2023-01-20T04:22:30.197246Z","iopub.status.idle":"2023-01-20T04:22:30.209294Z","shell.execute_reply.started":"2023-01-20T04:22:30.197215Z","shell.execute_reply":"2023-01-20T04:22:30.207148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# take a look at the data further\ntrain_data.describe()","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:22:33.132894Z","iopub.execute_input":"2023-01-20T04:22:33.133255Z","iopub.status.idle":"2023-01-20T04:22:33.159204Z","shell.execute_reply.started":"2023-01-20T04:22:33.133224Z","shell.execute_reply":"2023-01-20T04:22:33.158258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check information, data types, and for missing data\ntrain_data.info()","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:22:37.064727Z","iopub.execute_input":"2023-01-20T04:22:37.065082Z","iopub.status.idle":"2023-01-20T04:22:37.079545Z","shell.execute_reply.started":"2023-01-20T04:22:37.06505Z","shell.execute_reply":"2023-01-20T04:22:37.078508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create histogram\nprint(pd.DataFrame(data={'Label Counts': train_data['label'].value_counts()}))\nsns.countplot(x=train_data['label'], palette='colorblind').set(title='Label Counts Histogram');","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-01-20T04:22:39.910977Z","iopub.execute_input":"2023-01-20T04:22:39.911363Z","iopub.status.idle":"2023-01-20T04:22:40.113053Z","shell.execute_reply.started":"2023-01-20T04:22:39.911332Z","shell.execute_reply":"2023-01-20T04:22:40.112243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create pie chart\nfig = px.pie(train_data, \n             values = train_data['label'].value_counts().values, \n             names = train_data['label'].unique())\nfig.update_layout(\n    title={\n        'text': \"Label Percentage Pie Chart\",\n        'y':.99,\n        'x':0.5,\n        'xanchor': 'center',\n        'yanchor': 'top'})\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-01-20T04:22:44.044778Z","iopub.execute_input":"2023-01-20T04:22:44.050743Z","iopub.status.idle":"2023-01-20T04:22:44.939975Z","shell.execute_reply.started":"2023-01-20T04:22:44.050697Z","shell.execute_reply":"2023-01-20T04:22:44.939077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#visualize a few images\nfig, ax = plt.subplots(2, 2, figsize=(5, 5))\nfor i, axis in enumerate(ax.flat):\n    file = '/kaggle/input/subject1data/train/1.png'\n    image = io.imread(file)\n    axis.imshow(image)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-01-20T04:22:57.84471Z","iopub.execute_input":"2023-01-20T04:22:57.845063Z","iopub.status.idle":"2023-01-20T04:22:58.428065Z","shell.execute_reply.started":"2023-01-20T04:22:57.845035Z","shell.execute_reply":"2023-01-20T04:22:58.42713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:01.823756Z","iopub.execute_input":"2023-01-20T04:23:01.824414Z","iopub.status.idle":"2023-01-20T04:23:01.830867Z","shell.execute_reply.started":"2023-01-20T04:23:01.824378Z","shell.execute_reply":"2023-01-20T04:23:01.829824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# set model constants\nBATCH_SIZE = 64","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:18.699168Z","iopub.execute_input":"2023-01-20T04:23:18.699859Z","iopub.status.idle":"2023-01-20T04:23:18.704421Z","shell.execute_reply.started":"2023-01-20T04:23:18.699825Z","shell.execute_reply":"2023-01-20T04:23:18.703214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# modify training data by normalizing it \n# and split data into training and validation sets\ndatagen = ImageDataGenerator(rescale=1./255.,\n                            validation_split=0.15)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:21.134851Z","iopub.execute_input":"2023-01-20T04:23:21.135199Z","iopub.status.idle":"2023-01-20T04:23:21.139907Z","shell.execute_reply.started":"2023-01-20T04:23:21.135168Z","shell.execute_reply":"2023-01-20T04:23:21.13893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def append_ext(fn):\n    return fn+\".png\"\ntraindf=pd.read_csv('/kaggle/input/subject1data/train.csv',dtype=str)\ntestdf=pd.read_csv('/kaggle/input/subject1data/test.csv',dtype=str)\ntraindf[\"id\"]=traindf[\"id\"].apply(append_ext)\ntestdf[\"id\"]=testdf[\"id\"].apply(append_ext)\ndatagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:25.076607Z","iopub.execute_input":"2023-01-20T04:23:25.076974Z","iopub.status.idle":"2023-01-20T04:23:25.096336Z","shell.execute_reply.started":"2023-01-20T04:23:25.076938Z","shell.execute_reply":"2023-01-20T04:23:25.095484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testdf","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:42.084294Z","iopub.execute_input":"2023-01-20T04:23:42.084655Z","iopub.status.idle":"2023-01-20T04:23:42.098012Z","shell.execute_reply.started":"2023-01-20T04:23:42.084625Z","shell.execute_reply":"2023-01-20T04:23:42.09689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def append_ext(fn):\n    return fn+\".png\"\ntraindf=pd.read_csv('/kaggle/input/subject1data/train.csv',dtype=str)\n#testdf=pd.read_csv(\"./sampleSubmission.csv\",dtype=str)\ntraindf[\"id\"]=traindf[\"id\"].apply(append_ext)\n#testdf[\"id\"]=testdf[\"id\"].apply(append_ext)\ndatagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:48.97438Z","iopub.execute_input":"2023-01-20T04:23:48.974732Z","iopub.status.idle":"2023-01-20T04:23:48.984577Z","shell.execute_reply.started":"2023-01-20T04:23:48.974704Z","shell.execute_reply":"2023-01-20T04:23:48.983614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"traindf","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:52.215024Z","iopub.execute_input":"2023-01-20T04:23:52.215407Z","iopub.status.idle":"2023-01-20T04:23:52.228616Z","shell.execute_reply.started":"2023-01-20T04:23:52.215375Z","shell.execute_reply":"2023-01-20T04:23:52.227415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory='/kaggle/input/subject1data/train',\nx_col=\"id\",\ny_col=\"label\",\nsubset=\"training\",\nbatch_size=32,\nseed=42,\nshuffle=True,\nclass_mode=\"binary\",\ntarget_size=(32,32))\n\nvalid_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory='/kaggle/input/subject1data/validation',\nx_col=\"id\",\ny_col=\"label\",\nsubset=\"validation\",\nbatch_size=32,\nseed=42,\nshuffle=True,\nclass_mode=\"binary\",\ntarget_size=(32,32))\n\ntest_datagen=ImageDataGenerator(rescale=1./255.)\ntest_generator=test_datagen.flow_from_dataframe(\ndataframe=testdf,\ndirectory='/kaggle/input/subject1data/test',\nx_col=\"id\",\ny_col=None,\nbatch_size=32,\nseed=42,\nshuffle=False,\nclass_mode=None,\ntarget_size=(32,32))","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:23:55.60929Z","iopub.execute_input":"2023-01-20T04:23:55.609674Z","iopub.status.idle":"2023-01-20T04:23:57.659477Z","shell.execute_reply.started":"2023-01-20T04:23:55.609643Z","shell.execute_reply":"2023-01-20T04:23:57.658408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Setup GPU accelerator - configure Strategy. Assume TPU...if not set default for GPU/CPU\ntpu = None\ntry:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.TPUStrategy(tpu)\nexcept ValueError:\n    strategy = tf.distribute.get_strategy()","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:26:08.47026Z","iopub.execute_input":"2023-01-20T04:26:08.471018Z","iopub.status.idle":"2023-01-20T04:26:08.476195Z","shell.execute_reply.started":"2023-01-20T04:26:08.470984Z","shell.execute_reply":"2023-01-20T04:26:08.475253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom tensorflow.keras import regularizers, optimizers\nimport pandas as pd\nimport numpy as np\nfrom tensorflow.keras.optimizers import RMSprop\nprint(RMSprop)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:26:11.522649Z","iopub.execute_input":"2023-01-20T04:26:11.523413Z","iopub.status.idle":"2023-01-20T04:26:11.530989Z","shell.execute_reply.started":"2023-01-20T04:26:11.523369Z","shell.execute_reply":"2023-01-20T04:26:11.529597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3), padding='same',\n                 input_shape=(32,32,3)))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(32, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(64, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(512))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation='softmax'))\nmodel.compile(optimizers.RMSprop(lr=0.0001, decay=1e-6),loss=\"categorical_crossentropy\",metrics=[\"accuracy\"])","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-01-20T04:26:14.253884Z","iopub.execute_input":"2023-01-20T04:26:14.255577Z","iopub.status.idle":"2023-01-20T04:26:14.340428Z","shell.execute_reply.started":"2023-01-20T04:26:14.255531Z","shell.execute_reply":"2023-01-20T04:26:14.339493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.batch_size","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:26:33.04392Z","iopub.execute_input":"2023-01-20T04:26:33.044317Z","iopub.status.idle":"2023-01-20T04:26:33.052789Z","shell.execute_reply.started":"2023-01-20T04:26:33.044264Z","shell.execute_reply":"2023-01-20T04:26:33.0516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size\nSTEP_SIZE_TEST=test_generator.n//test_generator.batch_size\nmodel.fit_generator(generator=train_generator,\n                    steps_per_epoch=STEP_SIZE_TRAIN,\n                    validation_data=valid_generator,\n                    validation_steps=STEP_SIZE_VALID,\n                    epochs=10\n)","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2023-01-20T04:26:44.731346Z","iopub.execute_input":"2023-01-20T04:26:44.7317Z","iopub.status.idle":"2023-01-20T04:26:45.075479Z","shell.execute_reply.started":"2023-01-20T04:26:44.731672Z","shell.execute_reply":"2023-01-20T04:26:45.073923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate_generator(generator=valid_generator,\nsteps=STEP_SIZE_TEST)","metadata":{"execution":{"iopub.status.busy":"2023-01-19T15:52:03.89234Z","iopub.execute_input":"2023-01-19T15:52:03.892734Z","iopub.status.idle":"2023-01-19T15:52:03.922911Z","shell.execute_reply.started":"2023-01-19T15:52:03.8927Z","shell.execute_reply":"2023-01-19T15:52:03.921537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now that we have trained the model, we can take at look at how it did graphically with the training data. Below we can see the accuracy and loss with regards to the validation and training set. We can also see how it did with the ROC AUC per epoch. ","metadata":{}},{"cell_type":"code","source":"# plot model accuracy per epoch \nplt.plot(history_model_one.history['accuracy'])\nplt.plot(history_model_one.history['val_accuracy'])\nplt.title('Model One Accuracy per Epoch')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();\n\n# plot model loss per epoch\nplt.plot(history_model_one.history['loss'])\nplt.plot(history_model_one.history['val_loss'])\nplt.title('Model One Loss per Epoch')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();\n\n# plot model ROC per epoch\nplt.plot(history_model_one.history['auc'])\nplt.plot(history_model_one.history['val_auc'])\nplt.title('Model One AUC ROC per Epoch')\nplt.ylabel('ROC')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-09-13T19:22:57.279091Z","iopub.execute_input":"2022-09-13T19:22:57.279996Z","iopub.status.idle":"2022-09-13T19:22:57.8922Z","shell.execute_reply.started":"2022-09-13T19:22:57.27996Z","shell.execute_reply":"2022-09-13T19:22:57.891108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# build second model like first but with hyperparameters and optimizer(s)\nROC_2 = tf.keras.metrics.AUC()\n\nwith strategy.scope():\n    \n    #create model\n    model_two = Sequential()\n    \n    model_two.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu', ))\n    model_two.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu'))\n    model_two.add(MaxPooling2D(pool_size=(2,2)))\n    model_two.add(Dropout(0.1))\n    \n    model_two.add(BatchNormalization())\n    model_two.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu'))\n    model_two.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu'))\n    model_two.add(AveragePooling2D(pool_size=(2,2)))\n    model_two.add(Dropout(0.1))\n    \n    model_two.add(BatchNormalization())\n    model_two.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu'))\n    model_two.add(Flatten())\n    model_two.add(Dense(1, activation='sigmoid'))\n    \n    #build model by input size\n    model_two.build(input_shape=(BATCH_SIZE, 64, 64, 3))       # original image = (96, 96, 3) \n    \n    #compile\n    adam_optimizer = Adam(learning_rate=0.0001)\n    model_two.compile(loss='binary_crossentropy', metrics=['accuracy', ROC_2], optimizer=adam_optimizer)\n\n#quick look at model\nmodel_two.summary()","metadata":{"execution":{"iopub.status.busy":"2022-09-13T19:22:57.893603Z","iopub.execute_input":"2022-09-13T19:22:57.893963Z","iopub.status.idle":"2022-09-13T19:22:57.991242Z","shell.execute_reply.started":"2022-09-13T19:22:57.893927Z","shell.execute_reply":"2022-09-13T19:22:57.990221Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 10\n\n# train model\nhistory_model_two = model_two.fit_generator(\n                        train_generator,\n                        epochs = EPOCHS,\n                        validation_data = valid_generator)","metadata":{"execution":{"iopub.status.busy":"2022-09-13T19:22:57.992475Z","iopub.execute_input":"2022-09-13T19:22:57.992819Z","iopub.status.idle":"2022-09-13T20:11:55.188799Z","shell.execute_reply.started":"2022-09-13T19:22:57.992784Z","shell.execute_reply":"2022-09-13T20:11:55.187752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# graph loss\nplt.plot(history_model_two.history['accuracy'])\nplt.plot(history_model_two.history['val_accuracy'])\nplt.title('Model Two Accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();\n\nplt.plot(history_model_two.history['loss'])\nplt.plot(history_model_two.history['val_loss'])\nplt.title('Model Two Loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();\n\n# plot model ROC per epoch\nplt.plot(history_model_two.history['auc_1'])\nplt.plot(history_model_two.history['val_auc_1'])\nplt.title('Model Two AUC ROC per Epoch')\nplt.ylabel('ROC')\nplt.xlabel('epoch')\nplt.legend(['train', 'validate'], loc='upper left')\nplt.show();","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:11:55.199659Z","iopub.execute_input":"2022-09-13T20:11:55.200961Z","iopub.status.idle":"2022-09-13T20:11:55.774518Z","shell.execute_reply.started":"2022-09-13T20:11:55.200905Z","shell.execute_reply":"2022-09-13T20:11:55.773571Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Test final model against the test set**\n\nNow that we have a trained model, we can test it on the unseen test data images. We must also normalize the test data like we did with the training data. Then we run the model to find its predictions. Let's hope it does well in the competition! ","metadata":{}},{"cell_type":"code","source":"#double check what you're aiming the submission data set to look like\nsample_submission.head()","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-09-13T20:11:55.777789Z","iopub.execute_input":"2022-09-13T20:11:55.778113Z","iopub.status.idle":"2022-09-13T20:11:55.789589Z","shell.execute_reply.started":"2022-09-13T20:11:55.778076Z","shell.execute_reply":"2022-09-13T20:11:55.788369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create a dataframe to run the predictions\ntest_df = pd.DataFrame({'id':os.listdir(test_path)})\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:11:55.791006Z","iopub.execute_input":"2022-09-13T20:11:55.79135Z","iopub.status.idle":"2022-09-13T20:11:59.09522Z","shell.execute_reply.started":"2022-09-13T20:11:55.791316Z","shell.execute_reply":"2022-09-13T20:11:59.094303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prepare test data (in same way as train data)\ndatagen_test = ImageDataGenerator(rescale=1./255.)\n\ntest_generator = datagen_test.flow_from_dataframe(\n    dataframe=test_df,\n    directory=test_path,\n    x_col='id', \n    y_col=None,\n    target_size=(64,64),         # original image = (96, 96) \n    batch_size=1,\n    shuffle=False,\n    class_mode=None)","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:11:59.096541Z","iopub.execute_input":"2022-09-13T20:11:59.096915Z","iopub.status.idle":"2022-09-13T20:14:57.48596Z","shell.execute_reply.started":"2022-09-13T20:11:59.096878Z","shell.execute_reply":"2022-09-13T20:14:57.484495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#run model to find predictions\n\n# predictions = model_one.predict(test_generator, verbose=1)\npredictions = model_two.predict(test_generator, verbose=1)\n","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:14:57.491079Z","iopub.execute_input":"2022-09-13T20:14:57.49141Z","iopub.status.idle":"2022-09-13T20:22:00.187723Z","shell.execute_reply.started":"2022-09-13T20:14:57.49138Z","shell.execute_reply":"2022-09-13T20:22:00.186639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create submission dataframe\npredictions = np.transpose(predictions)[0]\nsubmission_df = pd.DataFrame()\nsubmission_df['id'] = test_df['id'].apply(lambda x: x.split('.')[0])\nsubmission_df['label'] = list(map(lambda x: 0 if x < 0.5 else 1, predictions))\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:22:00.20071Z","iopub.execute_input":"2022-09-13T20:22:00.201222Z","iopub.status.idle":"2022-09-13T20:22:00.344098Z","shell.execute_reply.started":"2022-09-13T20:22:00.201182Z","shell.execute_reply":"2022-09-13T20:22:00.343048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#view test prediction counts\nsubmission_df['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:22:00.345652Z","iopub.execute_input":"2022-09-13T20:22:00.346014Z","iopub.status.idle":"2022-09-13T20:22:00.355033Z","shell.execute_reply.started":"2022-09-13T20:22:00.345979Z","shell.execute_reply":"2022-09-13T20:22:00.353851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot test predictions\nsns.countplot(data=submission_df, x='label').set(title='Predicted Labels for Test Set');","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-09-13T20:22:00.356641Z","iopub.execute_input":"2022-09-13T20:22:00.357059Z","iopub.status.idle":"2022-09-13T20:22:00.554929Z","shell.execute_reply.started":"2022-09-13T20:22:00.357021Z","shell.execute_reply":"2022-09-13T20:22:00.553847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#convert to csv to submit to competition\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-09-13T20:22:00.556464Z","iopub.execute_input":"2022-09-13T20:22:00.557479Z","iopub.status.idle":"2022-09-13T20:22:00.647971Z","shell.execute_reply.started":"2022-09-13T20:22:00.55744Z","shell.execute_reply":"2022-09-13T20:22:00.647017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\nfrom keras import optimizers\n#from keras.optimizers import RMSprop\nfrom keras.models import Sequential\n#from tensorflow.keras.optimizers.experimental import RMSprop\n#Import from keras_preprocessing not from keras.preprocessing\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras import regularizers, optimizers\nimport pandas as pd\nimport numpy as np\ndef append_ext(fn):\n    return fn+\".png\"\ntraindf=pd.read_csv('/kaggle/input/subject1data/train.csv',dtype=str)\ntestdf=pd.read_csv('/kaggle/input/subject1data/test.csv',dtype=str)\ntraindf[\"id\"]=traindf[\"id\"].apply(append_ext)\ntestdf[\"id\"]=testdf[\"id\"].apply(append_ext)\ndatagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:27:07.38662Z","iopub.execute_input":"2023-01-20T04:27:07.387038Z","iopub.status.idle":"2023-01-20T04:27:07.411299Z","shell.execute_reply.started":"2023-01-20T04:27:07.387003Z","shell.execute_reply":"2023-01-20T04:27:07.410315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\noptimizer=keras.optimizers.RMSprop(learning_rate=0.01)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:27:11.127014Z","iopub.execute_input":"2023-01-20T04:27:11.127403Z","iopub.status.idle":"2023-01-20T04:27:11.132072Z","shell.execute_reply.started":"2023-01-20T04:27:11.127372Z","shell.execute_reply":"2023-01-20T04:27:11.13114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory='/kaggle/input/subject1data/train',\nx_col=\"id\",\ny_col=\"label\",\nsubset=\"training\",\nbatch_size=10,\nseed=42,\nshuffle=True,\nclass_mode=\"binary\",\ntarget_size=(32,32))\n\nvalid_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory='/kaggle/input/subject1data/train',\nx_col=\"id\",\ny_col=\"label\",\nsubset=\"validation\",\nbatch_size=10,\nseed=42,\nshuffle=True,\nclass_mode=\"binary\",\ntarget_size=(32,32))\n\ntest_datagen=ImageDataGenerator(rescale=1./255.)\ntest_generator=test_datagen.flow_from_dataframe(\ndataframe=testdf,\ndirectory='/kaggle/input/subject1data/test',\nx_col=\"id\",\ny_col=None,\nbatch_size=10,\nseed=42,\nshuffle=False,\nclass_mode=None,\ntarget_size=(32,32))\n","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:27:13.531103Z","iopub.execute_input":"2023-01-20T04:27:13.531469Z","iopub.status.idle":"2023-01-20T04:27:13.926942Z","shell.execute_reply.started":"2023-01-20T04:27:13.531436Z","shell.execute_reply":"2023-01-20T04:27:13.925902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3), padding='same',\n                 input_shape=(32,32,3)))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(32, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(64, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(512))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation='softmax'))\nmodel.compile(keras.optimizers.RMSprop(lr=0.0001, decay=1e-6),loss=\"binary_crossentropy\",metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:36:31.906606Z","iopub.execute_input":"2023-01-20T04:36:31.907355Z","iopub.status.idle":"2023-01-20T04:36:31.992053Z","shell.execute_reply.started":"2023-01-20T04:36:31.907319Z","shell.execute_reply":"2023-01-20T04:36:31.991149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size\nSTEP_SIZE_TEST=test_generator.n//test_generator.batch_size\nmodel.fit(generator=train_generator,\n                    steps_per_epoch=STEP_SIZE_TRAIN,\n                    validation_data=valid_generator,\n                    validation_steps=STEP_SIZE_VALID,\n                    epochs=10\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-20T04:36:58.482411Z","iopub.execute_input":"2023-01-20T04:36:58.483003Z","iopub.status.idle":"2023-01-20T04:36:58.512411Z","shell.execute_reply.started":"2023-01-20T04:36:58.482949Z","shell.execute_reply":"2023-01-20T04:36:58.511119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate_generator(generator=valid_generator,\nsteps=STEP_SIZE_TEST)","metadata":{"execution":{"iopub.status.busy":"2023-01-19T17:22:46.489089Z","iopub.execute_input":"2023-01-19T17:22:46.490696Z","iopub.status.idle":"2023-01-19T17:22:46.816872Z","shell.execute_reply.started":"2023-01-19T17:22:46.490645Z","shell.execute_reply":"2023-01-19T17:22:46.815345Z"},"trusted":true},"execution_count":null,"outputs":[]}]}