{"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 matplotlib\nmatplotlib.use('Agg')\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport numpy as np\nimport random\nimport matplotlib.pyplot as plt\nfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\n\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import zipfile\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip','r') as zip_ref:\n    zip_ref.extractall('train')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with zipfile.ZipFile('/kaggle/input/test-images/test-images.zip','r') as zip_ref:\n    zip_ref.extractall('sample-test-images')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = os.listdir('train/train')\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == 'dog':\n        categories.append(1)\n    else:\n        categories.append(0)\n        \n        \ndf = pd.DataFrame({'filename':filenames,\n                  'category':categories})\n\ndf.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = os.listdir(\"train/train\")\nsample = random.choice(filenames)\nimage = load_img(\"train/train/\"+sample)\nplt.imshow(image)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['category'].value_counts().plot.bar()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df, validation_df = train_test_split(df,test_size = 0.20, random_state = 42)\n\ntrain_df = train_df.reset_index(drop=True)\nvalidation_df = validation_df.reset_index(drop=True)\n\ntotal_train = train_df.shape[0]\ntotal_validate = validation_df.shape[0]\nbatch_size=15","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import Sequential,model_from_json\nfrom keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation, BatchNormalization","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_width = 50\nimage_height = 50\nimage_size = (image_width, image_height)\nimage_channel = 3 # RGB color","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classifier1 = Sequential()\nclassifier1.add(Conv2D(32,(3,3),input_shape = (image_width,image_height,image_channel),activation = 'relu'))\nclassifier1.add(BatchNormalization())\nclassifier1.add(MaxPooling2D(pool_size = (2,2)))\n                \nclassifier1.add(Conv2D(64,(3,3),activation = 'relu'))\nclassifier1.add(BatchNormalization())\nclassifier1.add(MaxPooling2D(pool_size = (2,2)))\n                \nclassifier1.add(Flatten())\nclassifier1.add(Dense(256,activation = 'relu'))\nclassifier1.add(Dense(units = 1, activation = 'sigmoid'))\nclassifier1.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classifier1.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rotation_range=15,\n    rescale=1./255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df, \n    'train/train', \n    x_col='filename',\n    y_col='category',\n    target_size=image_size,\n    class_mode='raw',\n    batch_size=batch_size\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_datagen = ImageDataGenerator(rescale=1./255)\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    validation_df, \n    \"train/train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=image_size,\n    class_mode='raw',\n    batch_size=batch_size\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x , y  = train_generator.next()\nfor i in range(0,1):\n    random_image = x[i]\n    plt.imshow(random_image)\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\nearlystop = EarlyStopping(patience=10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=2, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\n\ncallbacks = [earlystop, learning_rate_reduction]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = classifier1.fit_generator(\n    train_generator, \n    epochs= 25,\n    validation_data=validation_generator,\n    validation_steps=total_validate//batch_size,\n    steps_per_epoch=total_train//batch_size,\n    callbacks=callbacks\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_json = classifier1.to_json()\n!mkdir Saved_models\nwith open(\"Saved_models/cnn_base_model.json\",\"w\") as json_file:\n    json_file.write(model_json)\n    \nclassifier1.save_weights(\"Saved_models/cnn_base_model.h5\")\nprint(\"Saved model to disk\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"json_file = open('Saved_models/cnn_base_model.json', 'r')\n\nloaded_classifier_json = json_file.read()\n\njson_file.close()\n\nloaded_classifier = model_from_json(loaded_classifier_json)\n\nloaded_classifier.load_weights(\"Saved_models/cnn_base_model.h5\")\nprint(\"Loaded model from disk\")\n\nloaded_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 12))\nax1.plot(history.history['loss'], color='b', label=\"Training loss\")\nax1.plot(history.history['val_loss'], color='r', label=\"validation loss\")\nax1.set_xticks(np.arange(1, 25, 1))\nax1.set_yticks(np.arange(0, 1, 0.1))\n\nax2.plot(history.history['accuracy'], color='b', label=\"Training accuracy\")\nax2.plot(history.history['val_accuracy'], color='r',label=\"Validation accuracy\")\nax2.set_xticks(np.arange(1, 25, 1))\n\nlegend = plt.legend(loc='best', shadow=True)\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_image = load_img('/kaggle/input/test-images-custom/Sample_test_images/18.jpg', target_size = (50, 50))\nplt.imshow(test_image)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_image = img_to_array(test_image)\ntest_image = np.expand_dims(test_image, axis = 0)\nresult = loaded_classifier.predict(test_image)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if result[0][0] == 1:\n    prediction = 'This is a dog'\nelse:\n    prediction = 'This is a cat'\n\nprint (prediction)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_filenames = os.listdir(\"test/test1\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_gen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_gen.flow_from_dataframe(\n    test_df, \n    \"test/test1/\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=image_size,\n    batch_size=batch_size,\n    shuffle=False\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict = loaded_classifier.predict_generator(test_generator, steps=np.ceil(nb_samples/batch_size))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"threshold = 0.5\ntest_df['probability'] = predict\ntest_df['category'] = np.where(test_df['probability'] > threshold, 1,0)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['category'].value_counts().plot.bar()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_test = test_df.head(30)\nsample_test.head()\nplt.figure(figsize=(24, 50))\nfor index, row in sample_test.iterrows():\n    filename = row['filename']\n    category = row['category']\n    probability = row['probability']\n    if round(probability, 2) <= 0.2:\n        continue\n    img = load_img(\"test/test1/\"+filename, target_size=image_size)\n    plt.subplot(15, 2, index+1)\n    plt.imshow(img)\n    if category == 0:\n        plt.xlabel('(' + \"{}\".format('Cat') + ')' '(prob ' + \"{}\".format( round(probability, 2)) + ')')\n    if category == 1:\n        plt.xlabel( '(' + \"{}\".format('dog') + ')' '(prob ' + \"{}\".format(round(probability, 2)) + ')')\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}