{"cells":[{"metadata":{},"cell_type":"markdown","source":"In deep learning, a convolutional neural network (CNN, or ConvNet) is a class of deep neural networks, most commonly applied to analyzing visual imagery. "},{"metadata":{},"cell_type":"markdown","source":"Some very useful Links for Learning CNN\n1. [Stanford's CS231n](http://cs231n.github.io/convolutional-networks/)\n2. [UFLDL Tutorial](http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/)\n3. [Simple Cat Vs Dog Project](https://github.com/DipeshPoudel/Deep-Learning-A-Z)"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\n# Importing the Keras libraries and packages\nfrom keras.preprocessing.image import ImageDataGenerator\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.optimizers import Adam,SGD,Adagrad,Adadelta,RMSprop\nfrom keras.utils import to_categorical\nfrom keras.utils.vis_utils import model_to_dot\nfrom keras.utils.vis_utils import plot_model\n# specifically for cnn\nfrom keras.applications.inception_v3 import InceptionV3, preprocess_input\nfrom keras.layers import Dropout, Flatten,Activation\nfrom keras.layers import Conv2D, MaxPooling2D, BatchNormalization,GlobalAveragePooling2D\nfrom keras.callbacks import ModelCheckpoint,EarlyStopping,TensorBoard,CSVLogger,ReduceLROnPlateau,LearningRateScheduler","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\"../input/train.csv\")\ntest_df = pd.read_csv(\"../input/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['diagnosis'].unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df[\"id_code\"]=train_df[\"id_code\"].apply(lambda x:x+\".png\")\ntrain_df['diagnosis'] = train_df['diagnosis'].astype(str)\ntest_df[\"id_code\"]=test_df[\"id_code\"].apply(lambda x:x+\".png\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['diagnosis'].value_counts().plot(kind='bar')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"nb_classes = 5\nlbls = list(map(str, range(nb_classes)))\nbatch_size = 32\nimg_size = 150\nnb_epochs = 10","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Preparing the Trainig and Validation sets**"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255,\n                                   validation_split=0.3\n                                  )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training_set = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=\"../input/train_images\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=batch_size,\n    shuffle=True,\n    class_mode=\"categorical\",\n    classes=lbls,\n    target_size=(img_size,img_size),\n    subset='training')\n\ntest_set = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=\"../input/train_images\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=batch_size,\n    shuffle=True,\n    class_mode=\"categorical\",\n    classes=lbls,\n    target_size=(img_size,img_size),\n    subset='validation'\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"\n\n## Part 1 CNN\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier = Sequential()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"\n\n**Step 1 - Convolution and Max Pooling\n**"},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same',activation ='relu', \n                      input_shape = (img_size,img_size,3)))\nclassifier.add(MaxPooling2D(pool_size=(2,2)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same',activation ='relu'))\nclassifier.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))\n \n\nclassifier.add(Conv2D(filters =96, kernel_size = (3,3),padding = 'Same',activation ='relu'))\nclassifier.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))\n\nclassifier.add(Conv2D(filters = 96, kernel_size = (3,3),padding = 'Same',activation ='relu'))\nclassifier.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"\n\n**Step 2 - Flattening**\nA fully connetced Feed Forward Neural Network is created\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.add(Flatten())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.add(Dense(units = 512, activation = 'relu'))\nclassifier.add(Dense(units = 5, activation = 'softmax'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Step 3 - Compiling the CNN **"},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.compile(optimizer = Adam(lr=0.001),loss='categorical_crossentropy', metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Fitting the Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.fit_generator(training_set,\n                         steps_per_epoch = 10,\n                         epochs = nb_epochs,\n                         validation_data = test_set,\n                         validation_steps = 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = classifier.fit_generator(training_set,\n                         steps_per_epoch = 10,\n                         epochs = nb_epochs,\n                         validation_data = test_set,\n                         validation_steps = 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# list all data in history\nprint(history.history.keys())\n# summarize history for accuracy\nplt.plot(history.history['acc'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.show()\n# summarize history for loss\nplt.plot(history.history['loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Making the Predictions"},{"metadata":{"trusted":true},"cell_type":"code","source":"import cv2\nimport matplotlib.pyplot as plt\ntest_image = cv2.imread('../input/test_images/3d4d693f7983.png', cv2.IMREAD_COLOR)\ntest_image = cv2.resize(test_image, (150,150))\n\n\nplt.imshow(test_image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_ids = test_df['id_code']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(  \n        dataframe=test_df,\n        directory = \"../input/test_images\",    \n        x_col=\"id_code\",\n        target_size = (img_size,img_size),\n        batch_size = 1,\n        shuffle = False,\n        class_mode = None\n        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_generator.reset()\npredict=classifier.predict_generator(test_generator, steps = len(test_generator.filenames))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames=test_generator.filenames\nresults=pd.DataFrame({\"id_code\":filenames,\n                      \"diagnosis\":np.argmax(predict,axis=1)})\nresults['id_code'] = results['id_code'].map(lambda x: str(x)[:-4])\nresults.to_csv(\"submission.csv\",index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}