{"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 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 \nimport os\n\"\"\"\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\"\"\"\n# You can writewrite 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":"import numpy as np, pandas as pd, os\nimport PIL\nimport PIL.Image\nimport tensorflow as tf\nprint(tf.__version__)\nimport pathlib\n\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.optimizers import SGD\nfrom sklearn.model_selection import train_test_split\n\ndf = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ndf['label'] = df['label'].astype('str')\n\nmsk = np.random.rand(len(df)) < 0.8\ntrain = df[msk]\ntest = df[~msk]\n\nIMAGE_HEIGHT=256\nIMAGE_WIDTH=256\nBATCH_SIZE=25","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = keras.preprocessing.image.ImageDataGenerator(\n    horizontal_flip=True,\n    vertical_flip=True,\n    rotation_range=20,\n    shear_range=20,\n    zoom_range=0.2,\n    height_shift_range=0.1,\n    width_shift_range=0.1,\n    validation_split=0.2\n)\n\nvalid_datagen = keras.preprocessing.image.ImageDataGenerator(validation_split=0.2)\n\ntrain_imagegen = train_datagen.flow_from_dataframe(\n    train,\n    directory='../input/cassava-leaf-disease-classification/train_images',\n    x_col='image_id',\n    y_col='label',\n    subset='training',\n    target_size=(IMAGE_HEIGHT, IMAGE_WIDTH),\n    class_mode='categorical',\n    batch_size=BATCH_SIZE\n)\n\nvalid_imagegen = valid_datagen.flow_from_dataframe(\n    train,\n    directory='../input/cassava-leaf-disease-classification/train_images',\n    x_col='image_id',\n    y_col='label',\n    subset='validation',\n    target_size=(IMAGE_HEIGHT, IMAGE_WIDTH),\n    class_mode='categorical',\n    batch_size=BATCH_SIZE\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\ndef build_model():\n    model = keras.Sequential()\n    model.add(layers.Conv2D(filters=64, kernel_size=3, padding='same',activation=\"relu\",name=\"LC1\"))\n    model.add(layers.MaxPooling2D(pool_size=(2, 2), padding='valid', name=\"LP1\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD1\"))\n    model.add(layers.Conv2D(filters=16, kernel_size=3, padding='same',data_format=None,activation=\"relu\",name=\"LC2\"))\n    model.add(layers.MaxPooling2D(pool_size=(2, 2), padding='valid', name=\"LP2\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD2\"))\n    model.add(layers.Conv2D(filters=4, kernel_size=3, padding='same',data_format=None,activation=\"relu\",name=\"LC3\"))\n    model.add(layers.MaxPooling2D(pool_size=(2, 2), padding='valid', name=\"LP3\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD3\"))\n    model.add(layers.Conv2D(filters=4, kernel_size=3, padding='same',data_format=None,activation=\"relu\",name=\"LC4\"))\n    model.add(layers.MaxPooling2D(pool_size=(2, 2), padding='valid', name=\"LP4\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD4\"))\n    model.add(layers.Conv2D(filters=4, kernel_size=3, padding='same',data_format=None,activation=\"relu\",name=\"LC5\"))\n    model.add(layers.GlobalAveragePooling2D(name=\"LP5\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD5\"))\n    model.add(layers.Flatten(name=\"LF\"))\n    model.add(layers.Dense(64, activation=\"softmax\", name=\"LCF1\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD6\"))\n    model.add(layers.Dense(16, activation=\"softmax\", name=\"LFC2\"))\n    model.add(layers.Dropout(rate=0.2,name=\"LD7\"))\n    model.add(layers.Dense(5, activation=\"softmax\", name=\"LFC3\"))\n\n    sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)\n    keras.optimizers.Nadam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-06, name=\"Nadam\")\n    model.compile(loss='mean_squared_error', optimizer=sgd)\n    return model\n\n\n\nmodel_checkpoint = keras.callbacks.ModelCheckpoint(\n    './best_weights.h5',\n    monitor=\"val_loss\",\n    verbose=1,\n    save_best_only=True,\n    save_weights_only=True,\n    mode=\"min\"\n)\nearly_stopping = keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    min_delta=0.001,\n    patience=10,\n    verbose=1,\n    mode=\"min\",\n    restore_best_weights=True,\n)\nreduce_lr = keras.callbacks.ReduceLROnPlateau(\n    monitor=\"val_loss\",\n    factor=0.3,\n    patience=5,\n    verbose=1,\n    mode=\"min\",\n    min_delta=0.001,\n)\n\n#model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\nmodel=build_model()\nEPOCHS=50\n#print(model.summary())\n#keras.utils.plot_model(model)\n\nhistory = model.fit_generator(\n    train_imagegen,\n    epochs=EPOCHS,\n    steps_per_epoch=(len(df)*0.8) // BATCH_SIZE,\n    validation_data=valid_imagegen,\n    validation_steps=(len(df)*0.2) // BATCH_SIZE,\n    callbacks = [model_checkpoint, early_stopping, reduce_lr]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.figure(figsize=(15, 5))\nplt.plot(history.history['loss'], 'b*-', label=\"train_loss\")\nplt.plot(history.history['val_loss'], 'r*-', label=\"val_loss\")\nplt.grid()\nplt.title(\"train_acc vs val_acc\")\nplt.ylabel(\"Loss\")\nplt.xlabel(\"Epochs\")\nplt.legend()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}