{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#loading modules\nimport math, random, os, re, time\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport tensorflow.keras.backend as K\nfrom tensorflow.keras import layers, Model\nimport matplotlib.pylab as plt\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport PIL\nimport gc\nimport cv2\nimport seaborn as sns\nfrom kaggle_datasets import KaggleDatasets\nfrom tqdm import tqdm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#loading data\ndirname='../input/siim-isic-melanoma-classification/'\ntrain = pd.read_csv(dirname+'train.csv')\ntest = pd.read_csv(dirname + 'test.csv')\nprint(train.head())\nprint(len(train))\nprint(len(test))\nprint(train['target'].value_counts())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(train['target'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#sampling dataset: 5000 target 0, 584 target 1\ndf_0 = train[train['target']==0].sample(5000)\ndf_1 = train[train['target']==1]\ntrain = pd.concat([df_0, df_1])\ntrain = train.reset_index()\ndel df_0\ndel df_1\nprint(len(train))\nsns.countplot(train['target'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#function to resize images\ndef right_size(arr):\n    arr = cv2.resize(arr, (256,256))\n    arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)\n    return arr","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#show one image\narr = cv2.imread(dirname + 'jpeg/' + 'train/' + train['image_name'].iloc[0] + '.jpg')\nplt.imshow(right_size(arr))\nprint(arr.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#show 10 images, 1st row is target 0, second row is target 1\nfig = plt.figure(figsize=(15,10))\ncolumns = 5\nrows = 2\nfor i in [0,1]:\n    df = train[train['target']==i].sample(5)\n    df = list(df['image_name'])\n    for j in range(5):\n        fig.add_subplot(rows, columns, i*columns + j + 1)\n        plt.imshow(right_size(cv2.imread(dirname + 'jpeg/train/' + df[j] + '.jpg')))\n    del df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# prepare paths for training and validation data\ndata = []\ntarget = []\nfor i in range(len(train)):\n    data.append(dirname + 'jpeg/train/' + train['image_name'].iloc[i] + '.jpg')\n    target.append(train['target'].iloc[i])\n\n#prepare dataframe for test data\ntest_data = []\nfor i in range(len(test)):\n    test_data.append(dirname + 'jpeg/test/' + test['image_name'].iloc[i] + '.jpg')\ntest_path = pd.DataFrame(test_data)\ntest_path.columns = ['images']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# split train and validation data, turn into dataframes\ntrain_X, val_X, train_Y, val_Y = train_test_split(data, target, test_size = 0.2, random_state = 1)\n\ntrain = pd.DataFrame(train_X)\ntrain.columns = ['images']\ntrain['target'] = train_Y\n\nval = pd.DataFrame(val_X)\nval.columns = ['images']\nval['target'] = val_Y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#create input pipeline through flow_from_dataframe\ntrain_datagen = ImageDataGenerator(rescale=1./255,rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,horizontal_flip=True,vertical_flip=True)\nval_datagen=ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_dataframe(train, x_col='images', y_col='target', \n                                                   target_size = (256,256), batch_size=10, shuffle=True, class_mode = 'raw')\nval_generator = val_datagen.flow_from_dataframe(val, x_col='images', y_col='target', \n                                                   target_size = (256,256), batch_size=10, shuffle=False, class_mode = 'raw')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def res_block(X_in, channels):\n    X = layers.Conv2D(channels, (3,3), strides=(1,1), padding='same' )(X_in)\n    X = layers.BatchNormalization()(X)\n    X = layers.LeakyReLU()(X)\n    \n    X = layers.Conv2D(channels, (3,3), strides=(1,1), padding='same')(X)\n    X = layers.BatchNormalization()(X)\n    X = layers.Add()([X, X_in])\n    X = layers.LeakyReLU()(X)\n    \n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model\ndef my_model():\n    X_in = layers.Input((256, 256, 3))\n    \n    X = layers.Conv2D(64, (3,3), strides=(1,1), padding='same', name='conv1')(X_in)\n    X = layers.BatchNormalization()(X)\n    X = layers.Activation('relu')(X)\n\n    X = res_block(X, 64)\n    \n    X = layers.MaxPool2D(pool_size=(2, 2), strides=2, name='max_pool1')(X)\n\n    X = layers.Conv2D(128, (3,3), strides=(1,1), padding='same', name='conv2')(X)\n    X = layers.BatchNormalization()(X)\n    X = layers.Activation('relu')(X)\n    \n    X = res_block(X, 128)\n    \n    X = layers.MaxPool2D(pool_size = (2,2), strides=2, name='max_pool2')(X)\n\n    X = layers.Conv2D(256, (3,3), strides=(1,1), padding='same', name='conv3')(X)\n    X = layers.BatchNormalization()(X)\n    X = layers.Activation('relu')(X)\n\n    X = res_block(X, 256)\n    \n    X = layers.MaxPool2D(pool_size = (2,2), strides=2, name='max_pool3')(X)\n\n    X = res_block(X, 256)\n    \n    X = layers.MaxPool2D(pool_size = (2,2), strides=2, name='max_pool4')(X)\n    \n    X = res_block(X, 256)\n    \n    X = layers.MaxPool2D(pool_size = (2,2), strides=2, name='max_pool5')(X)\n    \n    X = layers.Flatten()(X)\n    X = layers.Dense(4096, activation='relu', name='fc1')(X)\n    X = layers.Dense(1024, activation='relu', name='fc2')(X)\n    X_out = layers.Dense(1, activation='sigmoid', name='answer')(X)\n\n    model = Model(inputs=X_in, outputs=X_out, name='pinnet')\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = my_model()\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.load_model('../input/pinnet/pinnet')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tf.test.is_gpu_available()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.callbacks import ReduceLROnPlateau\ndef callback():\n    cb = []\n    reduceLROnPlat = ReduceLROnPlateau(monitor='val_loss',\n                                   factor=0.3, patience=5,\n                                   verbose=1, mode='auto',\n                                   epsilon=0.0001, cooldown=1, min_lr=0.00001)\n    cb.append(reduceLROnPlat)\n    return cb","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cb = callback()\n#train and validate\nepochs = 5\nhistory = model.fit(train_generator, steps_per_epoch = train.shape[0]//10, epochs = epochs,\n                    validation_data = val_generator, validation_steps = val.shape[0]//10, callbacks=cb) # callbacks = cb,","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('pinnet')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(history.history.keys())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#test data input pipeline\ntest_datagen=ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(test_path, x_col='images', y_col=None, \n                                                   target_size = (256,256), batch_size=10, shuffle=False, class_mode=None)\ntest_generator.reset()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#predict on test data\npreds = model.predict(test_generator, steps=test.shape[0]//10+1)\nans = np.array(preds)\nprint(ans.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#prep recorded targets\nans=list(ans)\nfor i in range(len(ans)):\n    ans[i]=ans[i][0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#turn predictions in required format\nfinal = {'image_name':list(test['image_name']), 'target':ans }\n\nsub = pd.DataFrame(final, columns=['image_name', 'target'])\nprint(sub.head())\nprint(sub.describe())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#save predictions\nsub.to_csv('submission.csv', header=True, index=False)","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}