{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Model, Sequential\nfrom keras.layers import Dense, Activation, Flatten , Dropout\nimport seaborn as sns\nfrom tensorflow import keras\nfrom tensorflow.keras.layers import Input\nimport os\nfrom sklearn.model_selection import StratifiedKFold\nimport tensorflow\nfrom keras.models import load_model\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_data = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\",dtype=str)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_data.head(5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(df_data.label, edgecolor = 'black',\n              palette = sns.color_palette(\"viridis\", 5))\nplt.show()\nprint(df_data.label.value_counts())\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y = df_data['label']\nskf = StratifiedKFold(n_splits = 5, random_state = 7, shuffle = True) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"idg = ImageDataGenerator(\n      rescale=1./255,\n      rotation_range=40,\n      width_shift_range=0.2,\n      height_shift_range=0.2,\n      shear_range=0.2,\n      zoom_range=[1.0,2.0],\n      horizontal_flip=True,\n      vertical_flip=True,\n      fill_mode='nearest')\nval_augs = ImageDataGenerator(\n    rescale=1./255)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"c = tf.keras.callbacks.ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.3,\n    patience=2,\n    verbose=1, \n    mode='auto',\n    cooldown=1 \n)\nearlystop = tf.keras.callbacks.EarlyStopping(\n    monitor='val_loss',\n    min_delta=0.001,\n    patience=3,\n    verbose=1,\n    mode='auto'\n)\ntensorboard = tf.keras.callbacks.TensorBoard(\n    log_dir = './logs',\n    histogram_freq=0,\n    batch_size=16,\n    write_graph=True,\n    write_grads=True,\n    write_images=False,\n)\nmodel_save = tf.keras.callbacks.ModelCheckpoint('my_mod.h5', \n                             save_best_only = True, \n                             save_weights_only = False,\n                             monitor = 'val_loss', \n                             mode = 'min', verbose = 1)\n\ncallbacks=[c,earlystop,tensorboard,model_save]\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def change_model(model, new_input_shape=(None, 299, 299, 3),custom_objects=None):\n    # replace input shape of first layer\n    \n    config = model.layers[0].get_config()\n    config['batch_input_shape']=new_input_shape\n    model._layers[0]=model.layers[0].from_config(config)\n\n    # rebuild model architecture by exporting and importing via json\n    new_model = tensorflow.keras.models.model_from_json(model.to_json(),custom_objects=custom_objects)\n\n    # copy weights from old model to new one\n    for layer in new_model._layers:\n        try:\n            layer.set_weights(model.get_layer(name=layer.name).get_weights())\n            print(\"Loaded layer {}\".format(layer.name))\n        except:\n            print(\"Could not transfer weights for layer {}\".format(layer.name))\n\n    return new_model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = load_model('efi.h5')\n#model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"new_model = change_model(model, new_input_shape=[None] + [299,299,3])\nx = new_model.output\nx = Flatten()(x)\nx = Dense(1024, activation='relu')(x)\nx = Dropout(0.5)(x)\npredictions = Dense(5, activation='softmax')(x)\nmodel1 = Model(inputs=new_model.input,outputs=predictions)\n\nmodel1.summary()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model1.compile(\n    loss='categorical_crossentropy',\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n    metrics=['accuracy']\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"VALIDATION_ACCURACY = []\nVALIDAITON_LOSS = []\nn=len(Y)\n#save_dir = '/content/work'\nimage_dir='../input/cassava-leaf-disease-classification/train_images'\n\nfor train_index, val_index in skf.split(np.zeros(n),Y):\n    training_data = df_data.iloc[train_index]\n    validation_data = df_data.iloc[val_index]\n    df_data_generator = idg.flow_from_dataframe(training_data, directory = image_dir,\n                                                x_col = \"image_id\", y_col = \"label\",\n                                                class_mode = \"categorical\",target_size=(299, 299), shuffle = True)\n    valid_data_generator  = val_augs.flow_from_dataframe(validation_data, directory = image_dir,\n                                                    x_col = \"image_id\", y_col = \"label\",\n                                                    class_mode = \"categorical\",target_size=(299, 299), shuffle = True)\n    history = model1.fit(df_data_generator,\n                        epochs=10,\n                        callbacks=callbacks,\n                        validation_data=valid_data_generator)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing import image\nfrom PIL import Image\n\npreds = []\nss = pd.read_csv(os.path.join(\"../input/cassava-leaf-disease-classification\", \"sample_submission.csv\"))\nfor image_id in ss.image_id:\n    image = Image.open(os.path.join(\"../input/cassava-leaf-disease-classification\" ,\"test_images\", image_id))\n    image = image.resize((299, 299))\n    image = np.expand_dims(image, axis = 0)\n    preds.append(np.argmax(model1.predict(image)))\n\nss['label'] = preds\nss.to_csv('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}