{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.9"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import load_img\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport random\n\nimport os","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(os.listdir(\".\"))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preparing Training data","metadata":{}},{"cell_type":"code","source":"categorices=[]\nfilenames=os.listdir('train')\nfor i in filenames:\n    category=i.split('.')[0]\n    if category==\"dog\":\n        categorices.append(1)\n    else :\n        categorices.append(0)\ndf=pd.DataFrame({\n    'filename':filenames,\n    'category':categorices\n})\ndf.head()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['category'].value_counts().plot.bar()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Build the Model","metadata":{}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras import layers\nfrom keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation,GlobalMaxPooling2D\nfrom keras import applications\nfrom keras import optimizers\nfrom keras.applications.vgg16 import VGG16\nfrom keras.models import Model\nfrom keras.preprocessing.image import array_to_img, img_to_array","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_base=VGG16(\n    weights='imagenet',\n    include_top=False,\n    input_shape=(150,150,3)\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_base.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for layer in conv_base.layers[0:15]:\n    layer.trainable = False\nfor layer in conv_base.layers[15:-1]:\n    layer.trainable = True\nlast_layer = conv_base.get_layer('block5_pool')\nlast_output = last_layer.output\nx = Flatten()(last_output)\nx = Dense(256, activation='relu')(x)\nx = Dropout(0.5)(x)\nx = layers.Dense(1, activation='sigmoid')(x)\nmodel = Model(conv_base.input, x)\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.Adam(learning_rate=1e-4),\n              metrics=['accuracy'])\n\nmodel.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## SPLIT TEST AND TRAIN DATA","metadata":{}},{"cell_type":"code","source":"train_df,validate_df=train_test_split(df,test_size=0.1)\ntrain_df=train_df.reset_index()\nvalidate_df=validate_df.reset_index()\ntotal_train=train_df.shape[0]\ntotal_validate=validate_df.shape[0]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_validate","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Augmentation","metadata":{}},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(\n    rotation_range=10,\n    rescale=1.0/255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True\n    \n)\nvalidate_datagen=ImageDataGenerator(rescale=1.0/255)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Training Generator and validation Generator","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=train_datagen.flow_from_dataframe(\n    train_df,\n    directory=\"train\",\n    x_col='filename',\n    y_col='category',\n    class_mode='raw',\n    target_size=(150,150),\n    batch_size=32\n)\n\nvalidation_generator=validate_datagen.flow_from_dataframe(\n    validate_df,\n    directory=\"train\",\n    x_col='filename',\n    y_col='category',\n    class_mode=\"raw\",\n    target_size=(150,150),\n    batch_size=32\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# example_df = train_df.sample(n=1).reset_index(drop=True)\n# example_generator = train_datagen.flow_from_dataframe(\n#     example_df, \n#     \"train\", \n#     x_col='filename',\n#     y_col='category',\n#     class_mode='raw' \n# )\n# plt.figure(figsize=(12, 12))\n# for i in range(0, 9):\n#     plt.subplot(3, 3, i+1)\n#     for X_batch, Y_batch in example_generator:\n#         image = X_batch[0]\n#         plt.imshow(image)\n#         break\n# plt.tight_layout()\n# plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    epochs=10,\n    validation_data=validation_generator,\n )","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('run.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history.save('run_2.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('my_model.keras')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## TESTING AND SUMBISSION","metadata":{}},{"cell_type":"code","source":"test_filenames=os.listdir('test')\ntest_df=pd.DataFrame({\n    'filename':test_filenames,\n})\ntest_df.shape","metadata":{},"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\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    batch_size=32,\n    target_size=(150,150),\n    shuffle=False\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict = model.predict(test_generator)\nthreshold = 0.5\ntest_df['category'] = np.where(predict > threshold, 1,0)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = test_df.copy()\nsubmission_df['id'] = submission_df['filename'].str.split('.').str[0]\nsubmission_df['label'] = submission_df['category']\nsubmission_df.drop(['filename', 'category'], axis=1, inplace=True)\nsubmission_df.to_csv('submission_1.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}