{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"cd /kaggle/working","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip ../input/dogs-vs-cats/train.zip\n!ls train/","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip ../input/dogs-vs-cats/test1.zip\n!ls test1/","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.mkdir('/kaggle/working/Train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('/kaggle/working/Train/Dog')\nos.mkdir('/kaggle/working/Train/Cat')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import glob\nimport shutil\nimport os\n\nsrc_dir = \"/kaggle/working/train\"\ndst_dir = \"/kaggle/working/Train/Cat\"\nfor jpgfile in glob.iglob(os.path.join(src_dir, \"cat.*.jpg\")):\n    shutil.copy(jpgfile, dst_dir)\ndst_dir = \"/kaggle/working/Train/Dog\"\nfor jpgfile in glob.iglob(os.path.join(src_dir, \"dog.*.jpg\")):\n    shutil.copy(jpgfile, dst_dir)\n\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import shutil\nshutil.rmtree('/kaggle/working/train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport argparse","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_files_from_folder(path):\n\n    files = os.listdir(path)\n    return np.asarray(files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def split(path_to_data, path_to_test_data, train_ratio):\n    # get dirs\n    _, dirs, _ = next(os.walk(path_to_data))\n\n    # calculates how many train data per class\n    data_counter_per_class = np.zeros((len(dirs)))\n    for i in range(len(dirs)):\n        path = os.path.join(path_to_data, dirs[i])\n        files = get_files_from_folder(path)\n        data_counter_per_class[i] = len(files)\n    test_counter = np.round(data_counter_per_class * (1 - train_ratio))\n\n    # transfers files\n    for i in range(len(dirs)):\n        path_to_original = os.path.join(path_to_data, dirs[i])\n        path_to_save = os.path.join(path_to_test_data, dirs[i])\n\n        #creates dir\n        if not os.path.exists(path_to_save):\n            os.makedirs(path_to_save)\n        files = get_files_from_folder(path_to_original)\n        # moves data\n        for j in range(int(test_counter[i])):\n            dst = os.path.join(path_to_save, files[j])\n            src = os.path.join(path_to_original, files[j])\n            shutil.move(src, dst)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.mkdir('/kaggle/working/Val')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cd /kaggle/working","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"split(r\"Train\",r\"Val\", 0.8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout, BatchNormalization\nfrom keras.preprocessing.image import ImageDataGenerator\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(input_shape=[224,224,3],filters=64,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=64,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(MaxPool2D(pool_size=[2,2],strides=[2,2]))\n\n\nmodel.add(Conv2D(filters=128,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=128,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(MaxPool2D(pool_size=[2,2],strides=[2,2]))\n\n\nmodel.add(Conv2D(filters=256,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=256,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=256,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(MaxPool2D(pool_size=[2,2],strides=[2,2]))\n\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(MaxPool2D(pool_size=[2,2],strides=[2,2]))\n\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(filters=512,kernel_size=[3,3],padding='same',activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(MaxPool2D(pool_size=[2,2],strides=[2,2]))\n\n\nmodel.add(Flatten())\nmodel.add(BatchNormalization())\n\nmodel.add(Dense(units=\"4096\", activation=\"relu\"))\nmodel.add(BatchNormalization())\n\n\nmodel.add(Dense(units=\"4096\", activation=\"relu\"))\nmodel.add(BatchNormalization())\n\n\nmodel.add(Dense(units=\"2\", activation=\"softmax\"))\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.optimizers import Adam\nadam=Adam(lr=0.001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=adam,loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Data Augmentation\nfrom keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(rescale = 1./255,\n                                   shear_range = 0.2,\n                                   zoom_range = 0.2,\n                                   horizontal_flip = True)\n\ntest_datagen = ImageDataGenerator(rescale = 1./255)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training_set = train_datagen.flow_from_directory('./Train',\n                                                 target_size = (224, 224),\n                                                 batch_size = 64,\n                                                 class_mode = 'categorical')\n\ntest_set = test_datagen.flow_from_directory('./Val',\n                                            target_size = (224, 224),\n                                            batch_size = 64,\n                                            class_mode = 'categorical')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import EarlyStopping\nearly=EarlyStopping","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# fit the model\nr = model.fit_generator(\n  training_set,\n  validation_data=test_set,\n  epochs=10,\n # callbacks=[early_stopping],\n  steps_per_epoch=len(training_set),\n  validation_steps=len(test_set)\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cd /kaggle/working/test1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ls","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing import image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Single prediction check\ntest_image = image.load_img('/kaggle/working/test1/1.jpg', target_size = (224, 224))\ntest_image = image.img_to_array(test_image)\ntest_image = np.expand_dims(test_image, axis = 0)\nresult = model.predict(test_image)\n#print(result)\ndir_name='/kaggle/working/Train'\nimport os \n\nclass_list = os.listdir(dir_name)\nmaxvalue= np.argmax(result)\nprint(\"The image is :\"+class_list[maxvalue])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}