{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport os\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mplimg\nfrom matplotlib.pyplot import imshow\n\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import OneHotEncoder\n\nfrom keras import layers\nfrom keras.preprocessing import image\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.imagenet_utils import preprocess_input\nfrom keras.layers import Input, Dense, Activation, BatchNormalization, Flatten, Conv2D\nfrom keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalAveragePooling2D\nfrom keras.models import Model\nfrom keras.applications import Xception\nfrom keras.metrics import categorical_accuracy, top_k_categorical_accuracy, categorical_crossentropy\nfrom keras.optimizers import Adam\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping\nimport keras.backend as K\nfrom keras.models import Sequential\nimport tensorflow as tf\nimport warnings\n\nwarnings.simplefilter(\"ignore\", category=DeprecationWarning)\n\nconfig = tf.ConfigProto()\nconfig.gpu_options.allow_growth = True\nsess = tf.Session(config=config)\nK.set_session(sess)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"img_size = 90\ntrain_df = pd.read_csv(r\"../input/train.csv\")\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"da1a36d6922ba7636c7c702d563ddc1df3abd06a"},"cell_type":"code","source":"def prepareImages(data, m, dataset):\n    print(\"Preparing images\")\n    X_train = np.zeros((m, img_size, img_size, 3))\n    count = 0\n    \n    for fig in data['Image']:\n        img = image.load_img(r\"../input/\"+dataset+\"/\"+fig, target_size=(img_size, img_size, 3))\n        x = image.img_to_array(img)\n        x = preprocess_input(x)\n\n        X_train[count] = x\n        #if (count%500 == 0):\n            #print(\"Processing image: \", count+1, \", \", fig)\n        count += 1\n    \n    return X_train\n\ndef prepareLabels(y):\n    values = np.array(y)\n    label_encoder = LabelEncoder()\n    integer_encoded = label_encoder.fit_transform(values)\n    # print(integer_encoded)\n\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    # print(onehot_encoded)\n\n    y = onehot_encoded\n    # print(y.shape)\n    return y, label_encoder","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"06da2e67eefa713f2ea6a05d48af9a6668d615e2"},"cell_type":"code","source":"X = prepareImages(train_df, train_df.shape[0], \"train\")\nX /= 255\ny,label_encoder=prepareLabels(train_df['Id'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"80880c455fd3db367657ad365bd00495bcd8ceab"},"cell_type":"code","source":"split = int(0.8*len(X))\nX_val = X[split-len(X):]\ny_val = y[split-len(X):]\nX = X[:split]\ny = y[:split]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6c0cc55ca107793f33a8d67d753a5c07ff3ad146"},"cell_type":"code","source":"INIT_LR = 0.001\nEPOCHS = 80\nBS = 64\nnum_classes = y.shape[1]\n\nbase_model = Xception(input_shape=(img_size, img_size, 3), weights='imagenet', include_top=False)\n#base_model.compile(optimizer=Adam(lr=0.002), loss='categorical_crossentropy', metrics=[categorical_crossentropy, categorical_accuracy, top_5_accuracy])\n\nfor layer in base_model.layers:\n    layer.trainable = False\nx = GlobalAveragePooling2D()(base_model.output)\nx = Dense(2048, activation='relu')(x)\nx = Dropout(0.1)(x)\nx = Dense(2048, activation='relu')(x)\nx = Dropout(0.2)(x)\nx = Dense(2048, activation='relu')(x)\nx = Dropout(0.3)(x)\nx = BatchNormalization()(x)\npredictions = Dense(num_classes, activation='softmax')(x)\n\naug = ImageDataGenerator(rotation_range=30, width_shift_range=0.3, height_shift_range=0.3, shear_range=0.1, zoom_range=0.3, horizontal_flip=True, vertical_flip=False, fill_mode=\"nearest\")\nmodel = Model(input = base_model.input, output = predictions)\n#model.summary()\n#file_path=r\"../happy_whale.hdf5\"\n#model.load_weights(file_path)\nmodel.compile(loss=\"categorical_crossentropy\", optimizer=Adam(lr=INIT_LR), metrics=[\"accuracy\"])\nearly_stopping = EarlyStopping(monitor='val_acc', min_delta=0.00001, patience=50, verbose=1, mode='auto', baseline=0, restore_best_weights=True)\n#checkpoint = ModelCheckpoint(file_path, monitor='val_acc', verbose=1, save_best_only=True, mode='auto')\ncallbacks_list = [early_stopping]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1473d05ede6c34cf83bce5928abea25747904cba"},"cell_type":"code","source":"history=model.fit_generator(aug.flow(X, y, BS),epochs=EPOCHS,validation_data=aug.flow(X_val, y_val, BS),callbacks=callbacks_list,verbose=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"eeafe5262148a71272165e1a316f273169d409cd"},"cell_type":"code","source":"test = os.listdir(r\"../input/test/\")\ncol = ['Image']\ntest_df = pd.DataFrame(test, columns=col)\ntest_df['Id'] = ''\nZ = prepareImages(test_df, test_df.shape[0], \"test\")\nZ /= 255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2a0ea952af9283bb091f1a17a9c2605d7591ad0a","_kg_hide-input":false},"cell_type":"code","source":"predictions = model.predict(np.array(Z), verbose=1)\nfor i, pred in enumerate(predictions):\n    test_df.loc[i, 'Id'] = ' '.join(label_encoder.inverse_transform(pred.argsort()[-5:][::-1]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a98754f74caf16f5986f35bde202ccba25a53938"},"cell_type":"code","source":"test_df.head(10)\ntest_df.to_csv('submission.csv', index=False)","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}