{"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 pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras import mixed_precision\nimport datetime\nfrom sklearn.metrics import f1_score, make_scorer, confusion_matrix, accuracy_score\n# Set the path to the dataset files\ntrain_csv_path = '/kaggle/input/plant-pathology-2021-fgvc8/train.csv'\ntrain_images_dir = '/kaggle/input/plant-pathology-2021-fgvc8/train_images'\ntest_images_dir = '/kaggle/input/plant-pathology-2021-fgvc8/test_images'\nsubmission_file_path = '/kaggle/input/plant-pathology-2021-fgvc8/sample_submission.csv'\n\n# Read the train.csv file\ntrain_df = pd.read_csv(train_csv_path)\n#desired_train_size = len(train_df) // 10\n#train_subset = train_df.sample(n=desired_train_size, random_state=42)\nprint\n# Create an ImageDataGenerator for data augmentation and preprocessing\ndatagen = ImageDataGenerator(\n    rescale=1.0/255.0,\n    validation_split=0.2\n)\n\n# Create the train and validation generators\ntrain_generator = datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=train_images_dir,\n    x_col='image',\n    y_col='labels',\n    subset='training',\n    batch_size=32,\n    seed=42,\n    shuffle=True,\n    class_mode='categorical',\n    target_size=(224, 224)\n)\n\nval_generator = datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=train_images_dir,\n    x_col='image',\n    y_col='labels',\n    subset='validation',\n    batch_size=32,\n    seed=42,\n    shuffle=True,\n    class_mode='categorical',\n    target_size=(224, 224)\n)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2023-06-27T06:16:59.073951Z","iopub.execute_input":"2023-06-27T06:16:59.074335Z","iopub.status.idle":"2023-06-27T06:18:06.895717Z","shell.execute_reply.started":"2023-06-27T06:16:59.074310Z","shell.execute_reply":"2023-06-27T06:18:06.894698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow_addons as tfa","metadata":{"execution":{"iopub.status.busy":"2023-06-27T06:18:06.898599Z","iopub.execute_input":"2023-06-27T06:18:06.898940Z","iopub.status.idle":"2023-06-27T06:18:07.042388Z","shell.execute_reply.started":"2023-06-27T06:18:06.898914Z","shell.execute_reply":"2023-06-27T06:18:07.041017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the ResNet50 model without the top classification layer\nbase_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))\n\n# Add a global average pooling layer\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\n\n# Add a fully connected layer\nx = Dense(256, activation='relu')(x)\n\n# Add the output layer with the number of classes\noutput = Dense(12, activation='sigmoid')(x)\n\n# Create the model\nmodel = Model(inputs=base_model.input, outputs=output)\n\n# Freeze the base model layers\nfor layer in base_model.layers:\n    layer.trainable = False\n\n#mixed_precision.set_global_policy('mixed_float16')\n\n# Compile the model\n\"\"\"\nopt = tf.keras.optimizers.Adam()\nloss = tf.keras.losses.BinaryCrossentropy()\nacc = tf.keras.metrics.BinaryAccuracy()\nmodel.compile(optimizer=opt, loss=loss, metrics=[acc])\n\"\"\"\n\nf1_score_metric = tfa.metrics.F1Score(num_classes=12,average='weighted',threshold=0.5)\n\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy', f1_score_metric])\n\n# Define early stopping and model checkpoint callbacks\nearly_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\ncheckpoint = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)\n\nlog_dir = \"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\ntensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)\n\n# Train the model\nmodel.fit(train_generator, epochs=20, validation_data=val_generator, callbacks=[early_stopping, checkpoint, tensorboard_callback])","metadata":{"execution":{"iopub.status.busy":"2023-06-27T06:18:07.044841Z","iopub.execute_input":"2023-06-27T06:18:07.045483Z","iopub.status.idle":"2023-06-27T12:33:53.103095Z","shell.execute_reply.started":"2023-06-27T06:18:07.045447Z","shell.execute_reply":"2023-06-27T12:33:53.101767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('5testmodel.h5')\n#%load_ext tensorboard\n#%tensorboard --logdir /kaggle/working/logs/fit --host localhost --port=6000","metadata":{"execution":{"iopub.status.busy":"2023-06-27T12:33:53.109363Z","iopub.execute_input":"2023-06-27T12:33:53.109672Z","iopub.status.idle":"2023-06-27T12:33:53.569974Z","shell.execute_reply.started":"2023-06-27T12:33:53.109646Z","shell.execute_reply":"2023-06-27T12:33:53.568995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Load the test image paths\ntest_df = pd.read_csv(submission_file_path)\ntest_image_paths = test_df['image'].apply(lambda x: test_images_dir + x).tolist()\n\n# Create a test data generator\ntest_generator = datagen.flow_from_dataframe(\n    dataframe=test_df,\n    directory=test_images_dir,\n    x_col='image',\n    y_col=None,\n    batch_size=32,\n    seed=42,\n    shuffle=False,\n    class_mode=None,\n    target_size=(224, 224)\n)\n\n# Make predictions on the test set\npredictions = model.predict(test_generator)\n\n# Create a submission DataFrame\nsubmission_df = pd.DataFrame(predictions, columns=train_generator.class_indices.keys())\nsubmission_df.insert(0, 'image', test_df['image'])\n\n# Save the submission file\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-06-27T12:33:53.571447Z","iopub.execute_input":"2023-06-27T12:33:53.571824Z","iopub.status.idle":"2023-06-27T12:33:55.699692Z","shell.execute_reply.started":"2023-06-27T12:33:53.571790Z","shell.execute_reply":"2023-06-27T12:33:55.698814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\n\n# Path to the folder you want to download\nfolder_path = '/kaggle/working/logs'\n\n# Path where you want to save the zip file\nzip_file_path = '/kaggle/working/2train_images'\n\n# Create a zip archive of the folder\nshutil.make_archive(zip_file_path, 'zip', folder_path)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))\n\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\nx = Dense(256, activation='relu')(x)\noutput = Dense(12, activation='sigmoid')(x)\nmodel = Model(inputs=base_model.input, outputs=output)\n\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\nearly_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\ncheckpoint = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)\n\nlog_dir = \"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\ntensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)\n\nmodel.fit(train_generator, epochs=15, validation_data=val_generator, callbacks=[early_stopping, checkpoint, tensorboard_callback])","metadata":{"execution":{"iopub.status.busy":"2023-06-27T12:33:55.989873Z","iopub.execute_input":"2023-06-27T12:33:55.990215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}