{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"! unzip -qq \"../input/dogs-vs-cats/test1.zip\"\n! unzip -qq \"../input/dogs-vs-cats/train.zip\"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:34.669773Z","iopub.execute_input":"2024-12-27T11:52:34.670057Z","iopub.status.idle":"2024-12-27T11:52:48.608437Z","shell.execute_reply.started":"2024-12-27T11:52:34.670029Z","shell.execute_reply":"2024-12-27T11:52:48.607521Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:48.609466Z","iopub.execute_input":"2024-12-27T11:52:48.609780Z","iopub.status.idle":"2024-12-27T11:52:48.613440Z","shell.execute_reply.started":"2024-12-27T11:52:48.609752Z","shell.execute_reply":"2024-12-27T11:52:48.612789Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Some pictures","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport random\nimport matplotlib.pyplot as plt\nfilenames = os.listdir('./train/')\n\nfor i in range(2):\n    picture = np.array(plt.imread(os.path.join('./train',random.choice(filenames))))\n    plt.imshow(picture)\n    plt.show()\n    plt.figure()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:48.614222Z","iopub.execute_input":"2024-12-27T11:52:48.614475Z","iopub.status.idle":"2024-12-27T11:52:49.237010Z","shell.execute_reply.started":"2024-12-27T11:52:48.614456Z","shell.execute_reply":"2024-12-27T11:52:49.236055Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Create a dataframe","metadata":{}},{"cell_type":"code","source":"from glob import glob\nimport pandas as pd\n\nfile_names = glob('./train/*.jpg')\ncategories = [1 if 'dog' in pic else 0 for pic in os.listdir(\"./train\")]\n\ndf = pd.DataFrame({'filename': file_names, 'category':categories})\ndf[\"category\"] = df[\"category\"].replace({0: 'cat', 1: 'dog'})\n\nprint(\"shape:\", df.shape)\ndf.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:49.238510Z","iopub.execute_input":"2024-12-27T11:52:49.238717Z","iopub.status.idle":"2024-12-27T11:52:49.608442Z","shell.execute_reply.started":"2024-12-27T11:52:49.238700Z","shell.execute_reply":"2024-12-27T11:52:49.607795Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Number of cats and dogs in the train dataset","metadata":{}},{"cell_type":"code","source":"import seaborn as sns\nprint('Number of dogs in the train dataset:',df.category[df.category=='dog'].count())\nprint('Number of cats in the train dataset:',df.category[df.category=='cat'].count())\nsns.histplot(data=df, x=\"category\", shrink=0.8)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:49.609679Z","iopub.execute_input":"2024-12-27T11:52:49.610007Z","iopub.status.idle":"2024-12-27T11:52:50.523196Z","shell.execute_reply.started":"2024-12-27T11:52:49.609987Z","shell.execute_reply":"2024-12-27T11:52:50.522490Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Split data to train and validate ","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df, validate_df = train_test_split(df, test_size=0.2, random_state=10)\ntrain_df = train_df.reset_index(drop=True)\nvalidate_df = validate_df.reset_index(drop=True)\nvalidate_df.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:50.523996Z","iopub.execute_input":"2024-12-27T11:52:50.524344Z","iopub.status.idle":"2024-12-27T11:52:50.668504Z","shell.execute_reply.started":"2024-12-27T11:52:50.524312Z","shell.execute_reply":"2024-12-27T11:52:50.667848Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Images preprocessing","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\ntrain_generator = ImageDataGenerator(\nrescale = 1./255,\nrotation_range = 40,\nshear_range = 0.2,\nzoom_range = 0.2,\nhorizontal_flip = True,\nfill_mode = 'nearest'\n)\n\nval_generator = ImageDataGenerator(rescale = 1./255)\n\ntrain_iterator = train_generator.flow_from_dataframe(\ntrain_df,x_col='filename',\ny_col='category',\ntarget_size=(128,128),\nbatch_size=512,\nclass_mode='binary'\n)\n\nval_iterator = val_generator.flow_from_dataframe(\nvalidate_df,x_col='filename',\ny_col='category',\ntarget_size=(128,128),\nbatch_size=512,\nclass_mode='binary'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:50.669159Z","iopub.execute_input":"2024-12-27T11:52:50.669358Z","iopub.status.idle":"2024-12-27T11:52:58.035180Z","shell.execute_reply.started":"2024-12-27T11:52:50.669340Z","shell.execute_reply":"2024-12-27T11:52:58.034456Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"from keras import Sequential\nfrom keras.layers import Conv2D, MaxPool2D, Flatten, Dense\n\nmodel = Sequential([\n       Conv2D(16, (3,3), activation='relu', input_shape=(128,128,3)),\n       MaxPool2D((2,2)),\n       Conv2D(32, (3,3), activation='relu'),\n       MaxPool2D((2,2)),\n       Conv2D(64, (3,3), activation='relu'),\n       MaxPool2D((2,2)),\n       Flatten(),\n       Dense(512, activation='relu'),\n       Dense(1, activation='sigmoid')\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:58.036003Z","iopub.execute_input":"2024-12-27T11:52:58.036624Z","iopub.status.idle":"2024-12-27T11:52:58.907276Z","shell.execute_reply.started":"2024-12-27T11:52:58.036590Z","shell.execute_reply":"2024-12-27T11:52:58.906598Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:58.908002Z","iopub.execute_input":"2024-12-27T11:52:58.908216Z","iopub.status.idle":"2024-12-27T11:52:58.935801Z","shell.execute_reply.started":"2024-12-27T11:52:58.908197Z","shell.execute_reply":"2024-12-27T11:52:58.935208Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(train_iterator, epochs=10, validation_data=val_iterator)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T11:52:58.936442Z","iopub.execute_input":"2024-12-27T11:52:58.936629Z","iopub.status.idle":"2024-12-27T12:09:05.314508Z","shell.execute_reply.started":"2024-12-27T11:52:58.936612Z","shell.execute_reply":"2024-12-27T12:09:05.313782Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Accuracy visualization","metadata":{}},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'b', label='Training Accuracy')\nplt.plot(epochs, val_acc, 'r', label='Validation Accuracy')\nplt.title('Accuracy Graph')\nplt.legend()\nplt.figure()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T12:09:05.315549Z","iopub.execute_input":"2024-12-27T12:09:05.315857Z","iopub.status.idle":"2024-12-27T12:09:05.589028Z","shell.execute_reply.started":"2024-12-27T12:09:05.315823Z","shell.execute_reply":"2024-12-27T12:09:05.588363Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Test","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.utils import load_img\nfilenames = os.listdir('./test1/')\nfor i in filenames[200:226]:\n    image_path = \"test1/\" + i\n    img = load_img(image_path, target_size=(128, 128))\n    img = np.array(img)\n    img = img / 255.0\n    img = img.reshape(1, 128, 128, 3)\n\n    picture = np.array(plt.imread((image_path)))\n    plt.imshow(picture)\n    plt.show()\n    plt.figure()\n\n    pred = model.predict(img)\n    if pred[0] > 0.5:\n        label = 'Dog'\n    else:\n        label = 'Cat'\n    print(label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T12:09:05.589766Z","iopub.execute_input":"2024-12-27T12:09:05.590060Z","iopub.status.idle":"2024-12-27T12:09:14.515166Z","shell.execute_reply.started":"2024-12-27T12:09:05.590038Z","shell.execute_reply":"2024-12-27T12:09:14.514515Z"}},"outputs":[],"execution_count":null}]}