{"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":"#from .py file\n\nimport efficientnet.tfkeras as efn\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\nfrom tensorflow.keras.models import Model\nimport pandas as pd\nimport tensorflow as tf\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport matplotlib.pyplot as plt\nimport tensorflow_addons as tfa\nfrom tensorflow.keras.optimizers.schedules import ExponentialDecay\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\n\n# Load the pre-trained EfficientNet model with ImageNet weights\nbase_model = efn.EfficientNetB2(weights='imagenet', include_top=False, input_shape=(256, 256, 3))\n\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\ntop_dropout_rate = 0.5\nx = Dropout(top_dropout_rate, name=\"top_dropout\")(x)\noutput = Dense(1, activation='linear')(x)\n\n# Create the final model\nefficientnet_model = Model(inputs=base_model.input, outputs=output)\n\n# Unfreeze the top layers\nfor layer in base_model.layers[-20:]:\n    layer.trainable = True\n\nefficientnet_model.summary()\n\n\ntrain_dir = '../train_images'\ntest_dir = '../test_images'\ndf = pd.read_csv(\"results/train.csv\")\n\nTRAIN_PCT = 0.9\nTRAIN_CUT = int(len(df) * TRAIN_PCT)\n\ndf_train = df[0:TRAIN_CUT]\ndf_validate = df[TRAIN_CUT:]\n\nprint(f\"Training size: {len(df_train)}\")\nprint(f\"Validate size: {len(df_validate)}\")\n\n# Set up data generators for training and validation\ntraining_datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    rescale=1./255,\n    horizontal_flip=True,\n    # vertical_flip=True,\n    height_shift_range=0.1,\n    fill_mode='nearest'\n)\n\nvalidation_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\ntrain_generator = training_datagen.flow_from_dataframe(\n    dataframe=df_train,\n    directory=train_dir,\n    x_col=\"filename\",\n    y_col=\"count\",\n    target_size=(256, 256),\n    batch_size=32,\n    \n    class_mode='other'\n)\n\nval_generator = validation_datagen.flow_from_dataframe(\n    dataframe=df_validate,\n    directory=train_dir,\n    x_col=\"filename\",\n    y_col=\"count\",\n    target_size=(256, 256),\n    class_mode='other'\n)\n\n# Compile the model\ninitial_learning_rate = 0.001\ndecay_rate = 0.9\ndecay_steps = 1000\n\nlr_schedule = ExponentialDecay(\n    initial_learning_rate,\n    decay_steps,\n    decay_rate,\n    staircase=True\n)\noptimizer = Adam(learning_rate=lr_schedule)\n\nefficientnet_model.compile(loss='mean_squared_error', optimizer=optimizer)\n\n# Set early stopping\nmonitor = EarlyStopping(monitor='val_loss', min_delta=1e-4, patience=10, verbose=1, mode='auto',\n                        restore_best_weights=True)\n\n# Set up the ModelCheckpoint\nbest_model_file = \"best_model.h5\"\ncheckpoint = ModelCheckpoint(best_model_file, monitor='val_loss', verbose=1,\n                             save_best_only=True, mode='min', save_weights_only=False)\n\n\nhistory = efficientnet_model.fit(train_generator, verbose = 1, validation_data=val_generator, \n                    callbacks=[monitor, checkpoint], epochs=50)\n\n# Load the best model (based on validation loss)\nbest_model = tf.keras.models.load_model(best_model_file)\nbest_model.save(\"best_efficientnet_model5.h5\")\n# best_model.save(\"last_efficientnet_model5.h5\")\n\n# Access the recorded loss and metrics\ntrain_loss = history.history['loss']\nval_loss = history.history['val_loss']\n# Save loss to CSV\npd.Series(train_loss).to_csv(\"results/train_loss_efficientnet5.csv\", index=False)\npd.Series(val_loss).to_csv(\"results/val_loss_efficientnet5.csv\", index=False)\n\nplt.plot(train_loss, label='Training Loss')\nplt.plot(val_loss, label='Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.savefig('results/efficientnet_loss5.png', dpi=300, bbox_inches='tight')\n\n# Create a test generator (if not already created)\ntest_datagen = ImageDataGenerator(rescale=1./255)\ndf_test = pd.read_csv(\"results/test.csv\")\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=df_test,\n    directory=test_dir,\n    x_col=\"filename\",\n    batch_size=1,\n    shuffle=False,\n    target_size=(256, 256),\n    class_mode=None\n)\n\n# Make predictions on the test data\ntest_generator.reset()\npredictions = efficientnet_model.predict(test_generator, steps=len(df_test))\nbestpred = best_model.predict(test_generator, steps=len(df_test))\n\n# # Save predictions to a CSV file\n# df_submit = pd.DataFrame({'id': df_test['id'], 'count': predictions.flatten()})\n# df_submit.to_csv(\"results/submit_efficientnet5.csv\", index=False)\n\ndf_submit_best = pd.DataFrame({'id': df_test['id'], 'count': predictions.flatten()})\ndf_submit_best.to_csv(\"results/submit_efficientnet_best5.csv\", index=False)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}