{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"\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\nimport os\nimport glob\nimport shutil\nimport json\nimport keras\nimport itertools\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport tensorflow as tf\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom collections import Counter\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import applications\nfrom tensorflow.keras.layers import Conv2D,Dense, Dropout, BatchNormalization, GlobalAveragePooling2D,Input\nfrom tqdm import tqdm\nfrom tensorflow.keras.mixed_precision import experimental as mixed_precision\n# Defining the working directories\n\nwork_dir= '../input/cassava-leaf-disease-classification/' \n\nwork_dir_merged = '../input/cassava-leaf-disease-merged/'\ntrain_path_merged = '/kaggle/input/cassava-leaf-disease-merged/train'\n\ntrain_folder = \"/kaggle/input/cassava-leaf-disease-merged/train/\"\n\nn_CLASS = 5\nIMG_SIZE=320\nBATCH_SIZE=32\n\n\ndata = pd.read_csv(work_dir_merged + 'merged.csv')\n#data['label']=data['label'].astype(str)\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\nf = open(work_dir + 'label_num_to_disease_map.json')\nreal_labels = json.load(f)\nreal_labels = {int(k):v for k,v in real_labels.items()}\n\n# Defining the working dataset\ndata['class_name'] = data.label.map(real_labels)\ndata['label']=data['label'].astype(str)\ndata['class_name']=data['class_name'].astype(str)\n\npolicy = mixed_precision.Policy('mixed_float16')\nmixed_precision.set_policy(policy) #shortens training time by 2x\n\nprint(Counter(data['label'])) # Checking the frequencies of the labels\n\ndrop_indexs = pd.read_csv(\"../input/noisylabels/noise_labels.csv\")\nlist_index_drops=product = drop_indexs['noise_labels'].values.tolist()\n\ndata = data.drop(list_index_drops, axis=\"index\")\ndata.reset_index(drop=True, inplace=True)\n\nprint(Counter(data['label']))\n\n# Spliting the data\nfrom sklearn.model_selection import train_test_split\n\n#train,val = train_test_split(data, test_size = 0.1, random_state = 42, stratify = data['class_name'])\n\n# Importing the data using ImageDataGenerator\n\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# Data agumentation and pre-processing using tensorflow\ntrain_gen = ImageDataGenerator(\n                                rotation_range=270,\n                                width_shift_range=0.2,\n                                height_shift_range=0.2,\n                                brightness_range=[0.1,0.9],\n                                shear_range=25,\n                                zoom_range=0.3,\n                                channel_shift_range=0.1,\n                                horizontal_flip=True,\n                                vertical_flip=True,\n                                rescale=1/255,\n                                validation_split=0.2\n                               )\n                                    \n    \nvalid_gen = ImageDataGenerator(rescale=1/255,\n                               validation_split = 0.2\n                              )\n\ntrain_generator = train_gen.flow_from_dataframe(\n                            dataframe=data,\n                            directory = train_path_merged,\n                            x_col = \"image_id\",\n                            y_col = \"class_name\",\n                            target_size = (IMG_SIZE, IMG_SIZE),\n                            class_mode = \"sparse\",\n                            batch_size = BATCH_SIZE,\n                            shuffle = True,\n                            subset = \"training\",\n\n)\n\nvalid_generator = valid_gen.flow_from_dataframe(\n                            dataframe=data,\n                            directory = train_path_merged,\n                            x_col = \"image_id\",\n                            y_col = \"class_name\",\n                            target_size = (IMG_SIZE, IMG_SIZE),\n                            class_mode = \"sparse\",\n                            batch_size = BATCH_SIZE,\n                            shuffle = False,\n                            subset = \"validation\"\n)\n\n\"\"\"\nbase = applications.Xception(include_top=False, weights=\"imagenet\",input_shape=[IMG_SIZE,IMG_SIZE,3])\nfor layer in base.layers[:90]:\n    layer.trainable = False\nfor layer in base.layers[90:]:\n    layer.trainable = True\n\nbase.summary()\nmodel = tf.keras.Sequential()\nmodel.add(base)\nmodel.add(BatchNormalization(axis=-1))\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dense(5, activation='softmax'))\n\ncallback0 = tf.keras.callbacks.ModelCheckpoint(\"./CasavaLeafDiseaseModel_xception_freeze.h5\", \n                                               monitor='val_loss',save_best_only=True)\n\nmodel.compile(loss=\"sparse_categorical_crossentropy\", optimizer=\"Adam\", metrics=['acc'])\nmodel.fit(train_generator, epochs=30, batch_size=BATCH_SIZE,validation_data=valid_generator,callbacks=[callback0])\n\"\"\"\nmodel=tf.keras.models.load_model('../input/xception-rmsprop-8epochs-cassave/CasavaLeafDiseaseModel_xception_freeze.h5')\nfor layer in model.layers:\n    layer.trainable = True\n\ncallback1 = tf.keras.callbacks.ModelCheckpoint(\"./CasavaLeafDiseaseModel_xception_unfreeze.h5\", \n                                               monitor='val_loss',save_best_only=True)\n\nmodel.compile(loss=\"sparse_categorical_crossentropy\", optimizer=keras.optimizers.Adam(1e-5), metrics=['acc'])\nmodel.fit(train_generator, epochs=20, batch_size=BATCH_SIZE,validation_data=valid_generator,callbacks=[callback1])\n    \nmodel.save(\"Xception_ImageNet_Adam_10epochs_nontrainable\")\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":"","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}