{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Introduction\n- I want to acknowledge @xhlulu for having a clear, well-documented ResNet kernel that I have taken much from, including densenet weights, in writing this as well as the LIME documentation on Github (https://github.com/marcotcr/lime/blob/master/doc/notebooks/Tutorial%20-%20Image%20Classification%20Keras.ipynb)"},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport keras\nfrom keras.models import Sequential\nfrom scipy.ndimage import convolve\n\nfrom random import randrange \n\nfrom keras.applications import DenseNet121\nfrom keras.preprocessing import image\nfrom keras.applications.vgg16 import preprocess_input\nfrom keras.layers import Input, Flatten, Dense, Dropout, Activation\nfrom keras.layers import MaxPooling2D, AveragePooling2D, Conv2D\nfrom keras.models import Model,Sequential\nfrom keras.utils import np_utils\n\nfrom keras.preprocessing.image import ImageDataGenerator\n# some code from https://marcotcr.github.io/lime/tutorials/Tutorial%20-%20images.html tute\n\nfrom keras.optimizers import SGD \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_x = 224\nimg_y = 224\nbat_siz = 32\nnum_epok = 32\n# In[2]:\n\n\ndata_generator = ImageDataGenerator(\n        zoom_range = 0.4,\n        vertical_flip  = True,\n        horizontal_flip = True,\n        rescale=1.0/255.0\n        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_labels = pd.read_csv(\"../input/aptos2019-blindness-detection/train.csv\")\ntrain_data_labels['id_code'] = train_data_labels['id_code'] + '.png'\n#train_data_labels['diagnosis'] = train_data_labels['diagnosis'].to_string()\ntrain_data_labels['diagnosis'] = train_data_labels['diagnosis'].apply(str)\n\ntrain_generator = data_generator.flow_from_dataframe(dataframe = train_data_labels,\n                                                     directory = os.path.join('..', 'input','aptos2019-blindness-detection', 'train_images'),\n        target_size = (img_x, img_y), \n        y_col = 'diagnosis',\n        x_col = 'id_code',\n        class_mode = 'categorical',\n        batch_size = bat_siz\n        )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Model architecture\n- Densenet -> Dropout(50%) -> (Dense(1024)) -> convolution(32, 3x3) -> pooling by maximum of 2x2 -> 1x1 convolution -> flatten -> Dense(1024) -> dropout(50%)-> Output\n- Using stochastic gradient descent to optimize\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"densenet = DenseNet121(\n    weights='../input/densenet-keras/DenseNet-BC-121-32-no-top.h5',\n    include_top=False,\n    input_shape=(224,224,3)\n)\n## Now, define the model\nmodel = Sequential()\nmodel.add(densenet)\nmodel.add(Dropout(0.5)) # unlearn \nmodel.add(Dense(256, activation = \"softplus\"))\nmodel.add(Dense(256, activation = \"softplus\"))\n## Need to figure out ways to use convolution layers w/o eating all resources\nmodel.add(Conv2D(64, (3, 3)))\nmodel.add(Activation('softplus'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"softplus\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5, activation = 'softmax'))\n\nsgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)\nmodel.compile(loss='categorical_crossentropy',\n              optimizer=sgd,\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"model.fit_generator(\n        train_generator,\n        steps_per_epoch = train_data_labels.shape[0]/bat_siz,\n        epochs = num_epok)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Predictions and Output"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_data_labels = pd.read_csv(\"../input/aptos2019-blindness-detection/test.csv\")\ntest_data_labels['id_code'] = test_data_labels['id_code'] + '.png'\n\n\ntest_generator = data_generator.flow_from_dataframe(dataframe = test_data_labels,\n                                                     directory = os.path.join('..', 'input','aptos2019-blindness-detection','test_images'),\n        target_size = (img_x, img_y), \n    \n        x_col = 'id_code',\n        class_mode = None,\n        batch_size = bat_siz\n        )\n\npredictions = model.predict_generator(test_generator,\n                                      steps = test_data_labels.shape[0]/bat_siz)\n\npred_holder = []\nfor x in predictions:\n    pred_holder.append(np.argmax(x))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(10):\n    print(predictions[i])\n    print(pred_holder[i])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\noutput_df = pd.DataFrame({'diagnosis':pred_holder, \n                          'id_code':test_data_labels.id_code.str.replace(pat = \"\\.png\", repl = \"\")})\n\n\noutput_df.to_csv(\"submission.csv\", mode = \"w\")\noutput_df.head()\n\nmodel.save(os.path.join(\".\",\"densenet_plus_five\"))\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.3"}},"nbformat":4,"nbformat_minor":1}