{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"library(reticulate)\nlibrary(keras)\nlibrary(data.table)\nlibrary(tensorflow)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submi=fread('../input/jpeg-melanoma-128x128/sample_submission.csv')\n\ntrainTab=fread(\"../input/jpeg-melanoma-128x128/train.csv\")\ntestTab=fread(\"../input/jpeg-melanoma-128x128/test.csv\")\n\ntarget=trainTab$target\n\ndim=128\nbs=64","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Traindatagen = image_data_generator(brightness_range = c(0.8,1.2),\n                                    rescale=1/255, zoom_range=0.3, validation_split=0.3,\n                                    horizontal_flip = TRUE, rotation_range = 40)\n\nValdatagen = image_data_generator(rescale=1/255)\n\nmali=which(target==1)\nbeni=which(target==0)\n\ntrMali=sample(mali, size=length(mali)/2)\nvlMali=setdiff(mali, trMali)\n\ntrBeni=sample(beni, size=length(beni)*0.7)\nvlBeni=setdiff(beni,trBeni)\n\n#Rows=1:nrow(trainTab)\ntrainRows=sample(c(trMali, trBeni))\nvalRows=sample(c(vlMali, vlBeni))\n\ntrainTab$png_name=paste(trainTab$image_name, \".png\", sep=\"\")\ntrainTab$image_name=paste(trainTab$image_name, \".jpg\", sep=\"\")\n\ntestTab$png_name=paste(testTab$image_name, \".png\", sep=\"\")\ntestTab$image_name=paste(testTab$image_name, \".jpg\", sep=\"\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Traingenerator = flow_images_from_dataframe(dataframe=trainTab[trainRows,],\n                                            directory='../input/jpeg-melanoma-128x128/train',\n                                            generator=Traindatagen,\n                                            x_col= 'image_name',\n                                            y_col= 'target',\n                                            class_mode=\"raw\",\n                                            batch_size= bs,\n                                            shuffle=FALSE,\n                                            target_size=c(dim,dim) \n)\n\nValgenerator = flow_images_from_dataframe(dataframe=trainTab[valRows,],\n                                          directory='../input/jpeg-melanoma-128x128/train',\n                                          generator=Valdatagen,\n                                          x_col= 'image_name',\n                                          y_col= 'target',\n                                          class_mode=\"raw\",\n                                          batch_size= bs,\n                                          shuffle=FALSE,\n                                          target_size=c(dim,dim) \n)\n\ntrainTabgenerator = flow_images_from_dataframe(dataframe=trainTab[trainRows,],\n                                             directory='../input/landscape/trainTab',\n                                             generator=Valdatagen,\n                                             x_col= 'png_name',\n                                             class_mode=NULL,\n                                             color_mode = \"grayscale\",\n                                             batch_size= bs,\n                                             shuffle=FALSE,\n                                             target_size=c(dim,dim) \n)\n\n\nValTabgenerator = flow_images_from_dataframe(dataframe=trainTab[valRows,],\n                                              directory='../input/landscape/trainTab',\n                                              generator=Valdatagen,\n                                              x_col='png_name',\n                                              class_mode=NULL,\n                                              color_mode = \"grayscale\",\n                                              batch_size= bs,\n                                              shuffle=FALSE,\n                                              target_size=c(dim,dim) \n)\n\n\nTestgenerator = flow_images_from_dataframe(dataframe=testTab,\n                                           directory='../input/jpeg-melanoma-128x128/test',\n                                           generator=Valdatagen,\n                                           x_col= 'image_name',\n                                           class_mode=NULL,\n                                           batch_size= 34,\n                                           shuffle=FALSE,\n                                           target_size=c(dim,dim) \n)\n\nTestTabgenerator = flow_images_from_dataframe(dataframe=testTab,\n                                           directory='../input/landscape/testTab',\n                                           generator=Valdatagen,\n                                           x_col= 'png_name',\n                                           class_mode=NULL,\n                                           color_mode = \"grayscale\",\n                                           batch_size= 34,\n                                           shuffle=FALSE,\n                                           target_size=c(dim,dim) \n)\n\ngT <- function() {\n  function() {\n    xu1=generator_next(Traingenerator)\n    xu2=generator_next(trainTabgenerator)\n    out=array(NA, c(nrow(xu2), dim, dim,4))\n    out[,,,1:3]=xu1[[1]]\n    out[,,,4]=xu2\n    return(list(out, xu1[[2]]))\n  }\n}\n\ngV <- function() {\n  function() {\n    xu1=generator_next(Valgenerator)\n    xu2=generator_next(ValTabgenerator)\n    out=array(NA, c(nrow(xu2), dim, dim,4))\n    out[,,,1:3]=xu1[[1]]\n    out[,,,4]=xu2\n    return(list(out, xu1[[2]]))\n  }\n}\n\ngTe <- function() {\n  function() {\n    xu1=generator_next(Testgenerator)\n    xu2=generator_next(TestTabgenerator)\n    out=array(NA, c(nrow(xu2), dim, dim,4))\n    out[,,,1:3]=xu1[[1]]\n    out[,,,4]=xu2\n    return(out)\n  }\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ks = 3\n\nmodel <- keras_model_sequential() %>%\n  layer_conv_2d(filters = 32, kernel_size = ks, activation = \"relu\", input_shape = c(dim, dim, 4)) %>%\n  layer_max_pooling_2d() %>%\n  layer_conv_2d(filters = 64, kernel_size = ks, activation = \"relu\") %>%\n  layer_max_pooling_2d() %>%\n  layer_conv_2d(filters = 64, kernel_size = ks, activation = \"relu\") %>%\n  layer_flatten() %>%\n  layer_dropout(rate=0.3) %>%\n  layer_dense(units = 256, activation = \"relu\") %>%\n  layer_dense(units = 1, activation=\"sigmoid\")\n\npy_run_string(\"import tensorflow as tf\")\npy_run_string(\"from tensorflow.keras import backend as K\")\npy_run_string(\"def binary_focal_loss(gamma=2., alpha=.25):\n                def binary_focal_loss_fixed(y_true, y_pred):\n                  pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))\n                  pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))\n                  epsilon = K.epsilon()\n\n                  pt_1 = K.clip(pt_1, epsilon, 1. - epsilon)\n                  pt_0 = K.clip(pt_0, epsilon, 1. - epsilon)\n\n                  return -K.sum(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1)) \\ -K.sum((1 - alpha) * K.pow(pt_0, gamma) * K.log(1. - pt_0))\n                return binary_focal_loss_fixed\n\")\n\npy_run_string(\n  \"\n# CUSTOM LEARNING SCHEUDLE\nLR_START = 1e-5\nLR_MAX = 1e-3\nLR_RAMPUP_EPOCHS = 5\nLR_SUSTAIN_EPOCHS = 0\nLR_STEP_DECAY = 0.75\n\ndef lrfn(epoch):\n  if epoch < LR_RAMPUP_EPOCHS:\n    lr = (LR_MAX - LR_START) / LR_RAMPUP_EPOCHS * epoch + LR_START\n  elif epoch < LR_RAMPUP_EPOCHS + LR_SUSTAIN_EPOCHS:\n    lr = LR_MAX\n  else:\n    lr = LR_MAX * LR_STEP_DECAY**((epoch - LR_RAMPUP_EPOCHS - LR_SUSTAIN_EPOCHS)//10)\n  return lr\n\"\n)\n\nmodel %>% compile(optimizer= 'adam', loss= reticulate::py$binary_focal_loss(), \n              metrics='AUC')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"REduceLR = callback_learning_rate_scheduler(reticulate::py$lrfn)\n\n\nESMonitor = callback_early_stopping(monitor='val_loss', \n                                    min_delta=0, patience=18,\n                                    verbose=0, mode='min',\n                                    restore_best_weights=TRUE)\n\nfilepath=\"Model4Chann.h5\"\n\nMCheckPoint = callback_model_checkpoint(filepath, save_weights_only=TRUE, \n                                        monitor = \"val_loss\", mode=\"min\", verbose = 1,\n                                        save_best_only = TRUE)\nNepochs=30\nts=length(trainRows)/bs\nvs=length(valRows)/bs\n\nhistory <- model %>% fit_generator(gT(), epochs = Nepochs,\n                               validation_data=gV(),\n                               callbacks=c(REduceLR, ESMonitor, MCheckPoint),\n                               verbose = 1, steps_per_epoch = ts,\n                               validation_steps =vs)\n\nplot(history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tei=gTe()\n\npredi=rep(NA, nrow(testTab))\n\nfor(batch in 1:323){\n  rows=(34*(batch-1)+1):(34*(batch))\n  xu=tei()\n  predi[rows] = predict(model, xu)\n}\n\nsubmi$target=predi\nfwrite(submi, 'submi4channels.csv')\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"3.6.3"}},"nbformat":4,"nbformat_minor":4}