{"metadata":{"kernelspec":{"display_name":"tf","language":"python","name":"tf"},"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.10.9"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv = pd.read_csv('../data/train.csv')\ntrain_csv.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_names = os.listdir(\"../data/images\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mask_images = train_csv[\"image\"].apply(lambda x: x in image_names).values\nsum(mask_images)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv = train_csv[mask_images].reset_index()\ntrain_csv","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv[\"image\"] = train_csv[\"image\"].apply(lambda x: \"../data/images/\"+x)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_three_samples(class_name):\n    print(\"Samples images for \" + class_name)\n    paths = random.choices(train_csv[train_csv.species == class_name][\"image\"].values, k=3)\n    #print(paths)\n    plt.figure(figsize=(16,16))\n    imgs = random.sample(paths, 3)\n    plt.subplot(131)\n    plt.imshow(Image.open(imgs[0]))\n    plt.subplot(132)\n    plt.imshow(Image.open(imgs[1]))\n    plt.subplot(133)\n    plt.imshow(Image.open(imgs[2]))\n    plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for class_name in train_csv['species'].unique()[:5]:\n    plot_three_samples(class_name)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv['species'].nunique()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv['species'].unique()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv['species'].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample the dataset\n\"\"\"\nnum_samples = 300\n\nsamples = []\nfor i in train_csv['species'].unique():\n    x = train_csv.query('species == @i')\n    try:\n        samples.append(x.sample(num_samples, random_state = 1))\n    except:\n        samples.append(x.sample(train_csv[train_csv.species == i].shape[0], random_state = 1))\ntrain_csv = pd.concat(samples, axis = 0).sample(frac = 1.0, random_state = 1).reset_index()\n\"\"\"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df , test_df = train_test_split(train_csv, test_size = 0.30, shuffle = True, random_state = 0)\ntrain_df","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\ntrain_gen = ImageDataGenerator(rotation_range=0.45,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    rescale=1/255.0,\n    validation_split=0.2,\n)\ntest_gen = ImageDataGenerator(rescale=1/255.0)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_image = train_gen.flow_from_dataframe(\n    dataframe = train_df,\n    x_col = 'image',\n    y_col = 'species',\n    target_size = (224, 224),\n    color_mode ='rgb',\n    class_mode = 'categorical',\n    batch_size = 32,\n    shuffle = True,\n    seed = 42,\n    subset = 'training')\n\ntest_image = test_gen.flow_from_dataframe(\n    dataframe = test_df,\n    x_col = 'image',\n    y_col = 'species',\n    target_size = (224, 224),\n    color_mode ='rgb',\n    class_mode = 'categorical',\n    batch_size = 32,\n    shuffle = False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten\nfrom tensorflow.keras.callbacks import EarlyStopping","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## MobileNet Model - Transfer Learning","metadata":{}},{"cell_type":"code","source":"pre_model = tf.keras.applications.MobileNetV2(\n    input_shape = (224, 224, 3),\n    include_top = False,\n    pooling = 'avg'\n)\npre_model.trainable = False\n\n\ninputs = pre_model.input\nx = tf.keras.layers.Dense(128, activation = 'relu')(pre_model.output)\nx = tf.keras.layers.Dense(128, activation = 'relu')(x)\noutputs = tf.keras.layers.Dense(30,activation = 'softmax')(x)\nmodel = tf.keras.Model(inputs = inputs , outputs  = outputs)\nmodel.compile(\n    optimizer = 'adam',\n    loss = 'categorical_crossentropy',\n    metrics = ['accuracy']\n)\nhistory = model.fit(\n    train_image,\n    validation_data = test_image,\n    epochs = 100,\n    callbacks = [\n        tf.keras.callbacks.EarlyStopping(\n            monitor = 'val_loss',\n            patience = 3)])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_model.summary()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Custom Model","metadata":{}},{"cell_type":"code","source":"custom_model = Sequential([\n        Conv2D(64, kernel_size=(5, 5), activation=\"relu\", input_shape=(224, 224, 3)),\n        MaxPooling2D((3, 3)),\n\n        Conv2D(64, kernel_size=(5, 5), activation=\"relu\"),\n        MaxPooling2D((3, 3)),\n\n        Flatten(),\n        Dense(30, activation=\"softmax\")\n\n    ])\n    \ncustom_model.compile(\n    optimizer = 'adam',\n    loss = 'categorical_crossentropy',\n    metrics = ['accuracy'])\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"custom_model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"custom_model_hist = custom_model.fit(\n    train_image,\n    validation_data = test_image,\n    epochs = 100,\n    callbacks = [\n        tf.keras.callbacks.EarlyStopping(\n            monitor = 'val_loss',\n            patience = 3)])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"custom_model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}