{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"# Example submission notebook for the midterm-project in the\n# Brown Data Science DATA2040 Deep Learning course. \n# Please visit dsi.brown.edu for information on the Data Sciene Masters Program.\n# The web page for this course is data2040.github.io \n# Authors: Kaiwen Yang, Dan Potter\n\n# 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 pandas as pd\nimport numpy as np\nfrom sklearn.dummy import DummyClassifier\nimport json\nimport tensorflow as tf\nfrom functools import partial\n\nimport tensorflow.keras as keras\nimport keras\nfrom keras.layers import Dense, Dropout, Input, MaxPooling2D, ZeroPadding2D, Conv2D, Flatten\nfrom keras.models import Sequential, Model\nfrom keras.losses import categorical_crossentropy\nfrom keras.optimizers import Adam, SGD\nfrom keras.callbacks import EarlyStopping\nfrom keras.preprocessing.image import img_to_array, load_img, ImageDataGenerator\nfrom keras.utils import to_categorical\nfrom tensorflow.keras import regularizers\nfrom tensorflow.keras.layers import MaxPool2D, AveragePooling2D, GlobalAveragePooling2D\nfrom sklearn.model_selection import train_test_split\n\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.axes_grid1 import ImageGrid\n\nfrom zipfile import ZipFile\nimport time\nfrom datetime import timedelta\nfrom io import BytesIO\n\n# Image manipulation.\nimport PIL.Image\n\nimport pickle\nimport os\n\nimport random\n\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\n# import 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":{"id":"ClvjBu4wfZ8Z","trusted":true},"cell_type":"code","source":"train_labels = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"id":"9sEtbtJP_9dU","outputId":"b174df9e-2bcf-4053-8e4f-b694a653fc19","trusted":true},"cell_type":"code","source":"### https://www.kaggle.com/grantwiersum/cassava-disease-tfrecord-training\nimport glob\ncsv_df = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv')\ntrain_dir = '/kaggle/input/cassava-leaf-disease-classification/train_tfrecords/*'\ntest_dir = '/kaggle/input/cassava-leaf-disease-classification/test_tfrecords/*'\ntrain_list = glob.glob(train_dir)\ntest_list = glob.glob(test_dir)\nprint(\"train: \" + str(len(train_list)) + \"\\ntest: \" + str(len(test_list)))","execution_count":null,"outputs":[]},{"metadata":{"id":"dG37IJgWz_Ju","outputId":"a4d42e51-4751-4519-be39-f737a906abfd","trusted":true},"cell_type":"code","source":"labels = train_labels\nlabels.head()","execution_count":null,"outputs":[]},{"metadata":{"id":"-jQqrmYhz_ME","trusted":true},"cell_type":"code","source":"labels['label']=labels['label'].astype(str)","execution_count":null,"outputs":[]},{"metadata":{"id":"euYZCzahz_OV","trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./225,\n    rotation_range=40,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    validation_split=0.3,\n    horizontal_flip=True,)\n\n\ntest_datagen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"id":"_2okUF7c7unz","trusted":true},"cell_type":"code","source":"train_dir = '/kaggle/input/cassava-leaf-disease-classification/train_images/'","execution_count":null,"outputs":[]},{"metadata":{"id":"ICny3NGKz_Rc","outputId":"0ec69561-a9c2-49fb-faef-1035a9d58ab3","trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(dataframe=labels,\n      directory=train_dir,\n      subset='training',\n      x_col=\"image_id\",\n      y_col=\"label\",\n      shuffle=True,\n      target_size=(150,150),\n      batch_size=32,\n      class_mode='categorical')\n\nvalid_generator = train_datagen.flow_from_dataframe(dataframe=labels,\n      directory=train_dir,\n      subset='validation',\n      x_col=\"image_id\",\n      y_col=\"label\",\n      shuffle=True,\n      target_size=(150,150),\n      batch_size=32,\n      class_mode='categorical')","execution_count":null,"outputs":[]},{"metadata":{"id":"rcFN3AuV1bxS","outputId":"c5ccf43d-8fac-487d-cb54-63c650717c89","trusted":true},"cell_type":"code","source":"# setup tensorboard, directories\n!rm -rf ./logs\n!mkdir ./logs/\n!mkdir ./logs/data2040_midterm_project\n\n\n\nlog_dir=\"./logs/data2040_midterm_project/\"\ndef tensorboard_callback(exp_name):\n  return tf.keras.callbacks.TensorBoard(log_dir=log_dir + exp_name, profile_batch=0, histogram_freq=1)\n# launch tensorboard with specific directory\n%load_ext tensorboard\n%tensorboard --logdir logs/data2040_midterm_project\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import keras\nfrom keras.layers import Dense, Dropout, Input, MaxPooling2D, ZeroPadding2D, Conv2D, Flatten\nfrom keras.models import Sequential, Model\nfrom keras.losses import categorical_crossentropy\nfrom keras.optimizers import Adam, SGD\nfrom keras.preprocessing.image import img_to_array, load_img, ImageDataGenerator\nfrom keras.utils import to_categorical\nfrom tensorflow.keras import regularizers\n\nfrom tensorflow.keras.layers import MaxPool2D, AveragePooling2D, GlobalAveragePooling2D\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\n\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.axes_grid1 import ImageGrid\n\nfrom zipfile import ZipFile\nimport time\nfrom datetime import timedelta\nfrom io import BytesIO\n\n# Image manipulation.\nimport PIL.Image\n\nimport pickle\nimport os\n\nimport random","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_model_1():\n    inputs = Input(shape = (150,150,3))\n    model = Conv2D(filters=32, kernel_size=(3, 3),activation='softmax', input_shape=(150,150,3))(inputs)\n    model = MaxPool2D(pool_size=(2, 2))(model)\n    model = Conv2D(filters=64, kernel_size=(3, 3), activation='softmax')(model)\n    model = MaxPool2D(pool_size=(2, 2))(model)\n    model = Conv2D(filters=128, kernel_size=(3, 3), activation='softmax')(model)\n    model = MaxPool2D(pool_size=(2, 2))(model)\n    model = Flatten()(model)\n    model = Dense(512, activation = \"relu\")(model)\n    out = Dense(5, activation = 'softmax')(model)\n    model = Model(inputs=inputs, outputs=out)\n    \n    model.compile(loss='categorical_crossentropy',\n              optimizer=keras.optimizers.Adam(),\n              metrics=['acc'])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"id":"jaa04gN6z_X2","outputId":"cce0e0ed-6759-43c3-d4f6-6243ea5b0c0e","trusted":true},"cell_type":"code","source":"model = make_model_1()\nprint(model.summary())\n","execution_count":null,"outputs":[]},{"metadata":{"id":"56JKLQrYwEx7","outputId":"a36345b0-b5f9-4ace-9414-add98d700938","trusted":true},"cell_type":"code","source":"history = model.fit(train_generator,steps_per_epoch=20,\n                    validation_data=valid_generator,validation_steps=20,\n                    callbacks=[tensorboard_callback('baseline')], epochs=50\n)\n#EarlyStopping(monitor='val_acc',patience=10)","execution_count":null,"outputs":[]},{"metadata":{"id":"1D0-lDtuv0Q2","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":{"id":"24B_MoXXwLld","trusted":true},"cell_type":"code","source":"save_model(model, 'baseline_model')","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_model.h5\")\n\npreds = []\nsample_sub = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/sample_submission.csv')\n\nfor 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, (150,150))\n    img = tf.reshape(img, (-1, 150, 150, 3))\n    \n    # Now apply your model and save your prediction:\n    prediction = model.predict(img)\n    preds.append(np.argmax(prediction))\n    \n    # Blind-Monkey Model\n    # This is horrible possible baseline model.  You can improve it by\n    # putting all of p's mass on the most commonly occuring class.\n    # Question: if you set p to the actual class label distribution, on average,  \n    # will you get the same result, a better result or a worse result? \n    # preds.append(np.random.choice(5, p=[.2, .2, .2, .2, .2])) \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}