{"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 warnings\nimport warnings\nwarnings.filterwarnings('ignore')\n\nimport numpy as np # linear algebra\nimport pandas as pd\nimport zipfile\nimport random\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import train_test_split\nfrom keras.models import Sequential\nfrom keras import layers\nfrom keras.optimizers import Adam,RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator \nfrom keras import backend\nimport cv2 \nfrom keras import applications\n\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n\n\n\nfrom keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator\n\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn import metrics\n\nprint(\"Cats&Dogs Dataset Folder Contain:\",os.listdir(\"../input\"))\n        \n        \n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-06-08T12:48:05.181665Z","iopub.execute_input":"2021-06-08T12:48:05.182134Z","iopub.status.idle":"2021-06-08T12:48:11.020359Z","shell.execute_reply.started":"2021-06-08T12:48:05.182033Z","shell.execute_reply":"2021-06-08T12:48:11.019576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with zipfile.ZipFile(\"/kaggle/input/dogs-vs-cats/train.zip\",\"r\") as z:\n    z.extractall(\".\")\n    \nwith zipfile.ZipFile(\"/kaggle/input/dogs-vs-cats/test1.zip\",\"r\") as z:\n    z.extractall(\".\")","metadata":{"execution":{"iopub.status.busy":"2021-06-08T12:48:11.024278Z","iopub.execute_input":"2021-06-08T12:48:11.026251Z","iopub.status.idle":"2021-06-08T12:48:26.424318Z","shell.execute_reply.started":"2021-06-08T12:48:11.026212Z","shell.execute_reply":"2021-06-08T12:48:26.423496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main = \"/kaggle/working\"\ntrain = \"train\"\ntrain = os.path.join(main,train)\n\ntest = \"test1\"\ntest = os.path.join(main,test)\n\n\nIMAGE_FOLDER_PATH=\"../working/train\"\nFILE_NAMES=os.listdir(IMAGE_FOLDER_PATH)\nWIDTH=150\nHEIGHT=150","metadata":{"execution":{"iopub.status.busy":"2021-06-08T12:48:26.425999Z","iopub.execute_input":"2021-06-08T12:48:26.426324Z","iopub.status.idle":"2021-06-08T12:48:26.444442Z","shell.execute_reply.started":"2021-06-08T12:48:26.42629Z","shell.execute_reply":"2021-06-08T12:48:26.443747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# random choose a single image from train dataset\nfor p in os.listdir(train):\n    category = p.split(\".\")[0]\n    image_read = cv2.imread(os.path.join(train,p),cv2.IMREAD_GRAYSCALE)\n    img = cv2.resize(image_read,dsize=(240,240))\n    plt.imshow(img,cmap=\"gray\")\n    break","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:28.684283Z","iopub.execute_input":"2021-06-08T09:59:28.684765Z","iopub.status.idle":"2021-06-08T09:59:28.921536Z","shell.execute_reply.started":"2021-06-08T09:59:28.684711Z","shell.execute_reply":"2021-06-08T09:59:28.920417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets=list()\nfull_paths=list()\nfor file_name in FILE_NAMES:\n    target=file_name.split(\".\")[0]\n    full_path=os.path.join(IMAGE_FOLDER_PATH, file_name)\n    full_paths.append(full_path)\n    targets.append(target)\n\ndataset=pd.DataFrame()\ndataset['image_path']=full_paths\ndataset['target']=targets\n","metadata":{"execution":{"iopub.status.busy":"2021-06-08T12:49:07.534234Z","iopub.execute_input":"2021-06-08T12:49:07.534599Z","iopub.status.idle":"2021-06-08T12:49:07.616672Z","shell.execute_reply.started":"2021-06-08T12:49:07.534563Z","shell.execute_reply":"2021-06-08T12:49:07.615906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset.head(10)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.018935Z","iopub.execute_input":"2021-06-08T09:59:29.019427Z","iopub.status.idle":"2021-06-08T09:59:29.040549Z","shell.execute_reply.started":"2021-06-08T09:59:29.019375Z","shell.execute_reply":"2021-06-08T09:59:29.039302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# count of dogs and cats\ntarget_counts=dataset['target'].value_counts()\nprint(\"Number of dogs in the dataset:{}\".format(target_counts['dog']))\nprint(\"Number of cats in the dataset:{}\".format(target_counts['cat']))","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.042071Z","iopub.execute_input":"2021-06-08T09:59:29.042757Z","iopub.status.idle":"2021-06-08T09:59:29.058811Z","shell.execute_reply.started":"2021-06-08T09:59:29.042712Z","shell.execute_reply":"2021-06-08T09:59:29.057385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# lets check our train data\nsns.countplot(y='target',data=dataset)\ndataset['target'].value_counts()    # we have equal images of both cat and Dog","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.063783Z","iopub.execute_input":"2021-06-08T09:59:29.064218Z","iopub.status.idle":"2021-06-08T09:59:29.228214Z","shell.execute_reply.started":"2021-06-08T09:59:29.064186Z","shell.execute_reply":"2021-06-08T09:59:29.226827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_model_history(modelHistory, model_name):\n    history = pd.DataFrame()\n    history[\"Train Loss\"]= modelHistory.history['loss']\n    history[\"Validatin Loss\"]= modelHistory.history['val_loss']\n    history[\"Train Accuracy\"]= modelHistory.history['accuracy']\n    history[\"Validatin Accuracy\"]= modelHistory.history['val_accuracy']\n    \n    history.plot(figsize=(12,8))\n    plt.title(\" Convulutional Model {} Train and Validation Loss and Accuracy History\".format(model_name))\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.231041Z","iopub.execute_input":"2021-06-08T09:59:29.231527Z","iopub.status.idle":"2021-06-08T09:59:29.238946Z","shell.execute_reply.started":"2021-06-08T09:59:29.231481Z","shell.execute_reply":"2021-06-08T09:59:29.237217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Dataset split\ndataset_train, dataset_test = train_test_split(dataset,\n                                                 test_size=0.2,\n                                                 random_state=42)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.241033Z","iopub.execute_input":"2021-06-08T09:59:29.241541Z","iopub.status.idle":"2021-06-08T09:59:29.255212Z","shell.execute_reply.started":"2021-06-08T09:59:29.241495Z","shell.execute_reply":"2021-06-08T09:59:29.254158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(\nrotation_range=15,\nrescale=1./255,\nshear_range=0.1,\nzoom_range=0.2,\nhorizontal_flip=True,\nwidth_shift_range=0.1,\nheight_shift_range=0.1)\n\ntrain_datagenerator=train_datagen.flow_from_dataframe(dataframe=dataset_train,\n                                                     x_col=\"image_path\",\n                                                     y_col=\"target\",\n                                                     target_size=(WIDTH, HEIGHT),\n                                                     class_mode=\"binary\",\n                                                     batch_size=150)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.257289Z","iopub.execute_input":"2021-06-08T09:59:29.257858Z","iopub.status.idle":"2021-06-08T09:59:29.497527Z","shell.execute_reply.started":"2021-06-08T09:59:29.257813Z","shell.execute_reply":"2021-06-08T09:59:29.496474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen=ImageDataGenerator(rescale=1./255)\ntest_datagenerator=test_datagen.flow_from_dataframe(dataframe=dataset_test,\n                                                   x_col=\"image_path\",\n                                                   y_col=\"target\",\n                                                   target_size=(WIDTH, HEIGHT),\n                                                   class_mode=\"binary\",\n                                                   batch_size=150)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.500695Z","iopub.execute_input":"2021-06-08T09:59:29.501038Z","iopub.status.idle":"2021-06-08T09:59:29.568818Z","shell.execute_reply.started":"2021-06-08T09:59:29.501007Z","shell.execute_reply":"2021-06-08T09:59:29.567384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=Sequential()\nmodel.add(layers.Conv2D(32, (3,3), activation=\"relu\", input_shape=(WIDTH, HEIGHT, 3)))\nmodel.add(layers.Conv2D(32, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2AD((2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D(2,2))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(128, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(128, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D((2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D((2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(512, activation=\"relu\"))\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(1, activation=\"sigmoid\"))\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:29.570779Z","iopub.execute_input":"2021-06-08T09:59:29.571334Z","iopub.status.idle":"2021-06-08T09:59:32.546169Z","shell.execute_reply.started":"2021-06-08T09:59:29.57126Z","shell.execute_reply":"2021-06-08T09:59:32.543851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss=\"binary_crossentropy\", \n             optimizer= RMSprop(lr=1e-4),\n             metrics=[\"accuracy\"])\nprint(\"[INFO]: model compiled...\")","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.547087Z","iopub.status.idle":"2021-06-08T09:59:32.547549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"modelHistory=model.fit(train_datagenerator,\n                                epochs=20,\n                                validation_data=test_datagenerator,\n                                validation_steps=dataset_test.shape[0]//150,\n                                steps_per_epoch=dataset_train.shape[0]//150\n                                )","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.549028Z","iopub.status.idle":"2021-06-08T09:59:32.549821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Train Accuracy:{:.3f}\".format(modelHistory.history['accuracy'][-1]))\nprint(\"Test Accuracy:{:.3f}\".format(modelHistory.history['val_accuracy'][-1]))\nshow_model_history(modelHistory=modelHistory, model_name=\"\")","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.551355Z","iopub.status.idle":"2021-06-08T09:59:32.552196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=applications.InceptionV3(weights=\"imagenet\", include_top=False, input_shape=(WIDTH, HEIGHT, 3))\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.553903Z","iopub.status.idle":"2021-06-08T09:59:32.554793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"counter=0\nfeatures=list()\nfor path, target in zip(full_paths, targets):\n    img=load_img(path, target_size=(WIDTH, HEIGHT))\n    img=img_to_array(img)\n    img=np.expand_dims(img, axis=0)\n    feature=model.predict(img)\n    features.append(feature)\n    counter+=1\n    if counter % 2500==0:\n        print(\"[INFO]:{} images loaded\".format(counter))","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.556504Z","iopub.status.idle":"2021-06-08T09:59:32.557416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features=np.array(features)\nprint(\"Before reshape,features.shape:\",features.shape)\nfeatures=features.reshape(features.shape[0], 3*3*2048)\nprint(\"After reshape, features.shape:\",features.shape)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.559576Z","iopub.status.idle":"2021-06-08T09:59:32.560485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import cross_val_score\nfrom sklearn.preprocessing import LabelEncoder\nle=LabelEncoder()\ntargets=le.fit_transform(targets)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.562217Z","iopub.status.idle":"2021-06-08T09:59:32.563114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"features.shape:\",features.shape)\nprint(\"targets.shape:\",targets.shape)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.564888Z","iopub.status.idle":"2021-06-08T09:59:32.565773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test=train_test_split(features, targets, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.567465Z","iopub.status.idle":"2021-06-08T09:59:32.568315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf=LogisticRegression(solver=\"lbfgs\")\nprint(\"{} training...\".format(clf.__class__.__name__))\nclf.fit(X_train, y_train)\ny_pred=clf.predict(X_test)\nprint(\"The model trained and used to predict the test data...\")","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.570163Z","iopub.status.idle":"2021-06-08T09:59:32.571056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Accuracy:\",metrics.accuracy_score(y_test, y_pred))\nprint(\"Confusion Matrix:\\n\",metrics.confusion_matrix(y_test, y_pred))\nprint(\"Classification Report:\\n\",metrics.classification_report(y_test, y_pred, target_names=[\"cat\", \"dog\"]))","metadata":{"execution":{"iopub.status.busy":"2021-06-08T09:59:32.57294Z","iopub.status.idle":"2021-06-08T09:59:32.573806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}