{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# A baseline model based on VGG16\n# Group members: Bangxi Xiao, Daxin Niu, Wendy Huai\n# Contact: bangxi_xiao@brown.edu, daxin_niu@brown.edu, zuxuan_huai@brown.edu\n\n# This file implements a baseline model for cassava leaf disease classification\n\nimport time\nimport pickle\nimport numpy as np\nimport pandas as pd\nimport shutil, os\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Conv2D, MaxPool2D, Input\nimport json\nfrom scipy import stats\nfrom tensorflow.keras import Model, Sequential\nfrom tensorflow.keras.regularizers import l1\nfrom tensorflow.keras.callbacks import EarlyStopping, TensorBoard\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.optimizers.schedules import ExponentialDecay\nfrom tensorflow.keras.applications import VGG16\nfrom matplotlib import pyplot as plt\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image, ImageStat\nfrom skimage import io, color\n\n# Loading the training data\ntrain_raw = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv', encoding='utf_8_sig', engine='python')\nprint(train_raw.head())\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_batch_size = 32\n_image_width = 160\n_image_height = 120\n\n\n# def file_move(file_names, labels, train=True, pic_file='D:\\\\proj\\\\cassava-leaf-disease-classification\\\\train_images\\\\'):\n#     if train:\n#         front = 'train\\\\'\n#     else:\n#         front = 'test\\\\'\n#     for fn, label in zip(file_names, labels):\n#         if os.path.exists(pic_file + front + str(label)):\n#             shutil.move(pic_file + fn, pic_file + front + str(label))\n#         else:\n#             os.makedirs(pic_file + front + str(label))\n#             shutil.move(pic_file + fn, pic_file + front + str(label))\n#     print('DONE.')\n\n\ntrain_raw['label'] = train_raw['label'].astype(str)\nx_train, x_test, y_train, y_test = train_test_split(train_raw['image_id'], train_raw['label'], test_size=0.2)\nxy_train = pd.DataFrame({'x': x_train, 'y': y_train})\nxy_test = pd.DataFrame({'x': x_test, 'y': y_test})\n\n# file_move(x_train.tolist(), y_train.tolist(), True)\n# file_move(x_test.tolist(), y_test.tolist(), False)\n\ntrain_data_gen = ImageDataGenerator(\n    rescale=1. / 255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    validation_split=0.2\n)\n\n\ntrain_generator = train_data_gen.flow_from_dataframe(dataframe=train_raw,\n                                                     directory='/kaggle/input/cassava-leaf-disease-classification/train_images',\n                                                     subset='training',\n                                                     x_col='image_id',\n                                                     y_col='label',\n                                                     shuffle=True,\n                                                     target_size=(160, 120),\n                                                     batch_size=32,\n                                                     class_mode='categorical')\n\n\nvalidation_generator = train_data_gen.flow_from_dataframe(dataframe=train_raw,\n                                                          directory='/kaggle/input/cassava-leaf-disease-classification/train_images',\n                                                          subset='validation',\n                                                          x_col='image_id',\n                                                          y_col='label',\n                                                          shuffle=True,\n                                                          target_size=(160, 120),\n                                                          batch_size=32,\n                                                          class_mode='categorical')\n\n\ndef tb_callback(exp_name):\n    return TensorBoard(log_dir=_log_dir + exp_name, profile_batch=0, histogram_freq=1)\n\n\ndef build_baseline_vgg():\n    input_shape = (160, 120, 3)\n    baseline_model = VGG16(weights=None, include_top=False, input_shape=input_shape)\n    x = baseline_model.output\n    x = Flatten()(x)\n    x = Dense(512, activation='relu')(x)\n    x = Dropout(rate=0.25)(x)\n\n    x = Dense(256, activation='relu')(x)\n    x = Dropout(rate=0.25)(x)\n\n    x = Dense(128, activation='relu')(x)\n    x = Dropout(rate=0.25)(x)\n\n    predictions = Dense(5, activation='softmax')(x)\n    model = Model(inputs=baseline_model.input, outputs=predictions)\n    model.compile(optimizer=_opt,\n                  loss=_loss,\n                  metrics=_metrics)\n    \n    print(model.summary())\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_shuffle = True\n\n_log_dir = '/kaggle/ouput/logs/baseline_model/'\n_seed = 27\n_learning_rate = 0.0001\n_schedule = ExponentialDecay(_learning_rate, decay_steps=10_0000, decay_rate=0.96)\n_opt = Adam(learning_rate=_schedule)\n_es = EarlyStopping(monitor='val_accuracy', patience=20)\n_tb = tb_callback('Baseline_model_1')\n_callbacks = [_es, _tb]\n_metrics = ['accuracy']\n_loss = 'categorical_crossentropy'\n_epochs = 4\n\n\nbaseline_model1 = build_baseline_vgg()\nbaseline_model1_hist = baseline_model1.fit(train_generator,\n                                           epochs=_epochs,\n                                           validation_data=validation_generator,\n                                           callbacks=_callbacks,\n                                           shuffle=_shuffle)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# save model\nfrom keras.models import load_model\nimport os\ndef save_model(model, name):\n  model_name = '{}.h5'.format(name)\n  save_dir = os.path.join(os.getcwd(), 'saved_models')\n  \n  # Save model and weights\n  if not os.path.isdir(save_dir):\n      os.makedirs(save_dir)\n  model_path = os.path.join(save_dir, model_name)\n  model.save(model_path)\n  print('Saved trained model at %s ' % model_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"save_model(baseline_model1, 'baseline_model1')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Make sure to save the model you trained to /kaggle/working! \nimport pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import smart_resize\n## Load model. Use \"load_weights\" if you only save your model weights.\nmodel = keras.models.load_model(\"./saved_models/baseline_model1.h5\")\n\npreds = []\nsample_sub = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/sample_submission.csv')\n\nsample_sub.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for image in sample_sub.image_id:\n    img = keras.preprocessing.image.load_img('/kaggle/input/cassava-leaf-disease-classification/test_images/' + image)\n    #\n    # Preprocess image here (rescale, etc. - you might need to use parameters you determined during training)\n    #\n    img = img_to_array(img)\n    img = smart_resize(img, (160, 120))\n    img = tf.reshape(img, (-1, 160, 120, 3))\n    \n    # Now apply your model and save your prediction:\n    prediction = model.predict(img)\n    \n    preds.append(np.argmax(prediction))\n\nmy_submission = pd.DataFrame({'image_id': sample_sub.image_id, 'label': preds})\nmy_submission.to_csv('/kaggle/working/submission.csv', index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}