{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport matplotlib.image as mplimg\nfrom matplotlib.pyplot import imshow\nfrom IPython.display import SVG\n\n\n\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import OneHotEncoder\n\nfrom keras import layers\nfrom keras.preprocessing import image\nfrom keras.layers import Activation,Conv2D,Flatten,SeparableConv2D,Dense,Input,Dropout,BatchNormalization,GlobalMaxPooling2D,GlobalAveragePooling2D,MaxPooling2D,AveragePooling2D\nfrom keras.models import Model,Sequential\nfrom keras.applications.mobilenet import MobileNet,preprocess_input\nfrom keras.applications import MobileNet\nfrom keras.optimizers import SGD,Adam\nfrom keras.utils.vis_utils import plot_model,model_to_dot\nfrom keras.metrics import categorical_accuracy, top_k_categorical_accuracy, categorical_crossentropy\nfrom keras.applications.vgg16 import VGG16\nfrom keras.callbacks import ModelCheckpoint, Callback, EarlyStopping,EarlyStopping,TensorBoard,ReduceLROnPlateau,CSVLogger,LearningRateScheduler","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d78c36237d7d0c47884e5f951e8c50f3bd898272"},"cell_type":"code","source":"def show_final_history(history):\n    fig, ax = plt.subplots(1, 2, figsize=(15,5))\n    ax[0].set_title('loss')\n    ax[0].plot(history.epoch, history.history[\"loss\"], label=\"Train loss\")\n    ax[0].plot(history.epoch, history.history[\"val_loss\"], label=\"Validation loss\")\n    ax[1].set_title('acc')\n    ax[1].plot(history.epoch, history.history[\"acc\"], label=\"Train acc\")\n    ax[1].plot(history.epoch, history.history[\"val_acc\"], label=\"Validation acc\")\n    ax[0].legend()\n    ax[1].legend()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"90fcb48758cda6c4537ee389b482e79aae80f944"},"cell_type":"code","source":"def step_decay(epoch):\n    initial_lrate = 0.1\n    drop = 0.5\n    epochs_drop = 5.0\n    lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop))\n    return lrate","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"183141f91cdf1648dfad415a7eb4efb14d3a85d7"},"cell_type":"code","source":"def collect_labels(y):\n    values = np.array(y)\n    label_encoder = LabelEncoder()\n    integer_encoded = label_encoder.fit_transform(values)\n    onehot_encoder = OneHotEncoder(sparse=False)\n    integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)\n    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)\n    y = onehot_encoded\n    return y, label_encoder","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"40ad8ebb74f740a98f972858c075ef622d7a56cc"},"cell_type":"code","source":"def collect_images(data, m, dataset):\n    X_train = np.zeros((m, 100, 100, 3))\n    count = 0\n    \n    for fig in data['Image']:\n        img = image.load_img(\"../input/\"+dataset+\"/\"+fig, target_size=(100, 100, 3))\n        x = image.img_to_array(img)\n        x = preprocess_input(x)\n        X_train[count] = x\n        if (count%500 == 0):\n            print(\"Collecting Image: \", count+1, \", \", fig)\n        count += 1\n    return X_train","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4a348bd00b502629ed8c1a8b6905d7e707126d45"},"cell_type":"code","source":"os.listdir(\"../input/\")\ntraining_df = pd.read_csv(\"../input/train.csv\")\ntraining_df.head(5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"176a2924f9568417c7d69d80fea1b32dcdbda887","scrolled":true},"cell_type":"code","source":"X = collect_images(training_df,training_df.shape[0],'train')\ny,label_encoder = collect_labels(training_df['Id'])\nX /= 255\ny.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"30e049d93d4960e53b8e15859426ca129c7d5bee"},"cell_type":"code","source":"base_model = VGG16(include_top=False, weights='imagenet',input_shape=(100,100,3))\n\nfor layer in base_model.layers[:-12]:\n        layer.trainable = False\n        \nfor layer in base_model.layers:\n    print(layer, layer.trainable)\n\nmodel = Sequential()\nmodel.add(base_model)\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(1024,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(512,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5005,activation='softmax'))\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9cc0a9ee30e400a298736c61c44aebad42fb0599"},"cell_type":"code","source":"checkpoint = ModelCheckpoint(\n    './base.model',\n    monitor='categorical_accuracy',\n    verbose=1,\n    save_best_only=True,\n    mode='max',\n    save_weights_only=False,\n    period=1\n)\nearlystop = EarlyStopping(\n    monitor='val_loss',\n    min_delta=0.001,\n    patience=30,\n    verbose=1,\n    mode='auto'\n)\ntensorboard = 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)\n\ncsvlogger = CSVLogger(\n    filename= \"training_csv.log\",\n    separator = \",\",\n    append = False\n)\n\nlrsched = LearningRateScheduler(step_decay,verbose=1)\n\nreduce = ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.8,\n    patience=5,\n    verbose=1, \n    mode='auto',\n    min_delta=0.0001, \n    cooldown=1, \n    min_lr=0.0001\n)\n\ncallbacks = [checkpoint,tensorboard,earlystop,csvlogger,reduce]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"61fcf7ccb6a62b1d46489a00485b044e449dcebb","scrolled":true},"cell_type":"code","source":"opt = SGD(lr=1e-3,momentum=0.99)\nopt1 = Adam(lr=2e-3)\n\n\nmodel.compile(\n    loss='categorical_crossentropy',\n    optimizer=opt,\n    metrics=['accuracy']\n)\n\nhistory = model.fit(\n    X,\n    y,\n    epochs=5,\n    batch_size=128,\n    verbose=1,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e7451804cd6cfe0a1f180b35a178745631a61639"},"cell_type":"code","source":"plt.plot(history.history['acc'])\nplt.title('Model accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"543903b524a2e91ce7b416cf58328f505baa5fa1"},"cell_type":"code","source":"test = os.listdir(\"../input/test/\")\ncol = ['Image']\ntest_df = pd.DataFrame(test, columns=col)\ntest_df['Id'] = ''\nX = collect_images(test_df, test_df.shape[0], \"test\")\nX /= 255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b6c64d38abb4f4edefabc85c56821967b53ecfdd"},"cell_type":"code","source":"predictions = model.predict(np.array(X), verbose=1)\n\nfor i, pred in enumerate(predictions):\n    test_df.loc[i, 'Id'] = ' '.join(label_encoder.inverse_transform(pred.argsort()[-5:][::-1]))\n\ntest_df.to_csv('submission.csv', index=False)\ntest_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a550b6c1ba62bf670970768896c3971323401a7a"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}