{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":70497,"databundleVersionId":7713244,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.image as mpimg\n\nfrom zipfile import ZipFile\nfrom os import listdir, walk\nfrom os.path import isfile, join\nfrom tensorflow.keras import Input, Model\nfrom tensorflow.keras.applications import ResNet101V2, VGG19, Xception, InceptionV3\nfrom tensorflow.keras.applications.imagenet_utils import preprocess_input\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Dense\nfrom tensorflow.keras.optimizers import Adam","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**Data Preprocessing**","metadata":{}},{"cell_type":"code","source":"IMG_SIZE = 224\ndatagen = ImageDataGenerator(\n        samplewise_center=True,\n        rescale=1/255.)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_it = datagen.flow_from_directory('../input/csc532-fruits-categorical-classification-2024/csc532_2024_train/train', \n                                       target_size=(IMG_SIZE, IMG_SIZE), \n                                       color_mode='rgb', \n                                       class_mode=\"categorical\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_it = datagen.flow_from_directory('../input/csc532-fruits-categorical-classification-2024/csc532_2024_test/test', \n                                       target_size=(IMG_SIZE, IMG_SIZE), \n                                       color_mode='rgb', \n                                       class_mode=\"categorical\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = InceptionV3(\n    weights='imagenet',\n    input_shape=(IMG_SIZE, IMG_SIZE, 3),\n    include_top=False)\n\nbase_model.trainable = False","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = Input(shape=(IMG_SIZE, IMG_SIZE, 3))\n\nx = base_model(inputs, training=False)\nx = GlobalAveragePooling2D()(x)\n\noutputs = Dense(len(train_it.class_indices), activation = 'softmax')(x)\n\nmodel = Model(inputs, outputs)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss = 'categorical_crossentropy' , optimizer='adam', metrics = [\"accuracy\"])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 6\n\nhistory = model.fit(\n    train_it,\n    epochs=epochs,\n    validation_data=valid_it,\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(valid_it, steps=valid_it.samples/valid_it.batch_size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('dlai5_inceptionV3_fine_tuned')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"zf = ZipFile(\"model_inceptionV3_fine_tuned.zip\", \"w\")\nfor dirname, subdirs, files in walk(\"dlai5_inceptionV3_fine_tuned\"):\n    zf.write(dirname)\n    for filename in files:\n        zf.write(os.path.join(dirname, filename))\nzf.close()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"files = [f for f in listdir('../input/csc532-fruits-categorical-classification-2024/csc532_2024_validation/validation') if isfile(join('../input/csc532-fruits-categorical-classification-2024/csc532_2024_validation/validation', f))]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result_dict = {\n    'ID': [],\n    'Code': [],\n}\n\nfor file in files:\n  image = load_img(f'../input/csc532-fruits-categorical-classification-2024/csc532_2024_validation/validation/{file}', target_size=(IMG_SIZE, IMG_SIZE))\n  image = img_to_array(image)\n  image = image.reshape(1, IMG_SIZE, IMG_SIZE, 3)\n  image = image / 255\n\n  pred = np.argmax(model.predict(image)) + 1\n  result_dict['ID'].append(file)\n  result_dict['Code'].append(pred)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame.from_dict(result_dict)\ndf.to_csv('result_inceptionV3_fine_tuned.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}