{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport matplotlib.image as im\nimport cv2 as cv2\nimport tensorflow as tf\nfrom tqdm import tqdm_notebook\nfrom tqdm.notebook import tqdm\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras import layers,models,Model,Input\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport tensorflow_addons as tfa\nimport os\nfrom multiprocessing import Process\nimport time\nfrom itertools import chain\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_csv=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest_csv=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')\nprint(train_csv.head())\npd.set_option('display.max_columns',500)\npd.set_option('display.max_rows',500)\npd.set_option('display.float_format', lambda x: '%.3f' % x)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#tf.debugging.set_log_device_placement(True)\n\nprint(\"Num of Physical GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\n\ngpu=tf.config.experimental.list_physical_devices('GPU')\n\nif gpu:\n \n  try:\n    tf.config.experimental.set_virtual_device_configuration(\n        \n         gpu[0],\n         [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)]\n        \n    )\n    \n\n    \n    logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n \n \n  except RuntimeError as e:\n \n    # Virtual devices must be set before GPUs have been initialized\n    print(e)\n    \n    \nprint('Number of Logical GPUs Available: ', len(tf.config.experimental.list_logical_devices('GPU')))\n\nprint(gpu)\nprint(logical_gpus)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"strategy=tf.distribute.experimental.MultiWorkerMirroredStrategy()\nprint(strategy)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_csv.head())\nprint(train_csv.columns)\nprint(train_csv.count())\nprint(train_csv.shape)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv['target'].value_counts()\nplt.hist(train_csv['target'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_csv.isna().any())\nprint('\\n')\nprint('Null values in Sex Column : ' +str(train_csv['sex'].isna().sum()))\nprint('Null values in Age Column : ' +str(train_csv['age_approx'].isna().sum()))\nprint('Null values in Anatom Column : '+str(train_csv['anatom_site_general_challenge'].isna().sum()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv['age_approx'].describe()\nplt.hist(train_csv['age_approx'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv['age_approx']=train_csv['age_approx'].fillna(value=np.mean(train_csv['age_approx']))\ntrain_csv['age_approx'].isna().any()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_csv.groupby('sex')['anatom_site_general_challenge'].value_counts())\ntrain_csv['anatom_site_general_challenge']=train_csv['anatom_site_general_challenge'].fillna(value='torso')\nprint('\\n')\nprint(train_csv['anatom_site_general_challenge'].value_counts())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_csv['sex'].value_counts())\nfun=lambda x:1 if (x=='male') else 0\ntrain_csv['sex']=train_csv['sex'].apply(fun)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_sex_anatom=train_csv.groupby('sex')['anatom_site_general_challenge'].value_counts()\nprint(train_sex_anatom)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv.groupby('sex')['anatom_site_general_challenge'].value_counts().plot(kind='bar')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_sex_anatom=train_csv.groupby('sex')['benign_malignant'].value_counts()\nprint(train_sex_anatom)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"raw","source":"train_csv.groupby('sex')['benign_malignant'].value_counts().plot(kind='bar')\nplt.show()","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"train_grp=train_csv.groupby('benign_malignant')['diagnosis'].value_counts()\ntrain_grp","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_width=256\nimg_height=256\nchannels=3\ntrain_jpg_dir='../input/siic-isic-224x224-images/train/'\ntest_jpg_dir='../input/siic-isic-224x224-images/test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_benign=train_csv[train_csv['target']==0]\ntrain_malig=train_csv[train_csv['target']==1]\nprint(train_benign.shape)\nprint(train_malig.shape)\nprint(train_benign.tail())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_benign_batch=5\nvar='train_benign_'\ntrain_data=[[] for i in range(train_benign_batch+1)]\ntrain_labels=[[] for i in range(train_benign_batch+1)]\nsource=[]\n\nbenign_start=0\nsize=train_benign.shape[0]//train_benign_batch\nbenign_stop=benign_start+size\n\nmalig_start=0\nmalig_stop=train_malig.shape[0]\n\n\n\nfor i in range(0,len(train_data)):\n\n    for j in range(benign_start,benign_stop):\n        \n        if j<train_benign.shape[0]:\n            train_data[i].append(train_jpg_dir + train_benign['image_name'].iloc[j]+'.png')\n            train_labels[i].append(train_benign['target'].iloc[j])\n        \n        else:\n            break\n       \n    for k in range(malig_start,malig_stop+1):\n        \n        if k<train_malig.shape[0]:\n            train_data[i].append(train_jpg_dir+train_malig['image_name'].iloc[k]+'.png')\n            train_labels[i].append(train_malig['target'].iloc[k])\n        else:\n            break\n     \n    benign_start=benign_stop\n    benign_stop=benign_stop+size\n\n    \n\nfor l in range(0,len(train_data)):\n        name=var+str(l)\n        name=pd.DataFrame(train_data[l])\n        name.columns=['images']\n        name['target']=train_labels[l]\n        source.append(name)\n        print(source[l]['target'].value_counts())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_data=[]\ntest_labels=[]\n\nfor i in range(test_csv.shape[0]):\n        test_data.append(test_jpg_dir+test_csv['image_name'].iloc[i]+'.png')\n      \n\ntest=pd.DataFrame(test_data)\ntest.columns=['images']\ntest['images']=test_data\ntest.head()\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gen=[]\nval_gen=[]\ntest_gen=[]\n\nfor i in range(len(source)):\n    \n    train_aug_name='train_aug_'+str(i)\n    val_aug_name='valid_aug_'+str(i)\n\n    train_generator_name='train_generator_'+str(i)\n    val_generator_name='val_generator_'+str(i)\n    \n    X_train,X_val,y_train,y_val=train_test_split(source[i]['images'],source[i]['target'],test_size=0.2,random_state=20,stratify=source[i]['target'])\n\n    train=pd.DataFrame(X_train)\n    train.columns=['images']\n    train['target']=y_train\n\n    validation=pd.DataFrame(X_val)\n    validation.columns=['images']\n    validation['target']=y_val\n    \n   \n    train_aug_name = ImageDataGenerator(\n        rescale=1./255,\n        brightness_range=[0.2,0.5],\n        shear_range=0.4,\n        rotation_range=30,\n        horizontal_flip=True,\n        width_shift_range=2)\n\n    val_aug_name = ImageDataGenerator(\n        rescale=1./255)\n\n  \n    train_generator_name = train_aug_name.flow_from_dataframe(\n        train,\n        x_col='images',\n        y_col='target',\n       # target_size=(img_width, img_height),\n        batch_size=32,\n        shuffle=True,\n        class_mode='raw')\n    print(len(train_generator_name))\n \n    val_generator_name = val_aug_name.flow_from_dataframe(\n        validation,\n        x_col='images',\n        y_col='target',\n       # target_size=(img_width,img_height),\n        batch_size=16,\n        shuffle=False,\n        class_mode='raw')\n    \n    \n    train_gen.append(train_generator_name)\n    val_gen.append(val_generator_name)\n    \n    \ntest_aug_name = ImageDataGenerator(\n        rescale=1./255\n)\n\n\n\ntest_generator_name=test_aug_name.flow_from_dataframe(\n        test,\n        x_col='images',\n        y_col=[],\n       # target_size=(224,224),\n        shuffle=False,\n        batch_size=16,\n        class_mode='raw'\n\n    )\n\ntest_gen.append(test_generator_name)\n\nprint(len(test_generator_name))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"reduce_lr=tf.keras.callbacks.ReduceLROnPlateau(monitor='val_auc',factor=0.1,patience=3,min_lr=0.00001,mode='max')\nprint(reduce_lr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"epochs=10\nnum_dataset=5\nsaved_model_path='/kaggle/working/'\n\n\n    \ndef model(i):\n\n    with strategy.scope():\n            \n            print('Starting Model : '+str(i))\n            base_model=tf.keras.applications.InceptionV3(include_top=False,weights='imagenet',classes=2,input_shape=(256,256,channels))\n            base_model.trainable=False\n        \n            model_name='model_'+str(i)\n\n            model=tf.keras.Sequential([\n                base_model,\n                tf.keras.layers.Flatten(),\n                tf.keras.layers.Dense(1,activation='sigmoid')\n                ])\n    \n            model.compile(tf.keras.optimizers.Adam(learning_rate=0.0001),loss='binary_crossentropy',metrics='AUC')\n\n    \n            model.fit(\n                train_gen[i],\n                validation_data=val_gen[i],\n                epochs=epochs,\n                callbacks=[reduce_lr]\n             )\n        \n            \n            \n            print('Completed Model : '+str(i))\n            print('Saving '+model_name)\n            model.save(saved_model_path+model_name+'.h5')\n            print('Saving Completed')\n        \n        \n\n        \nt0=model(0)\nt1=model(1)\nt2=model(2)\nt3=model(3)\nt4=model(4)\n\n\n            \n            \n\n      \n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/sample_submission.csv')\nsaved_model_path='../input/melanoma-tensorflow-beginner-incepv3-gpu'\n\ntarget0=[]\ntarget1=[]\ntarget2=[]\ntarget3=[]\ntarget4=[]\ntarget=[]\n\n\nprint('Started loading Saved Models')\n\nmodel_0=tf.keras.models.load_model(saved_model_path+'/'+'model_0'+'.h5')\nmodel_1=tf.keras.models.load_model(saved_model_path+'/'+'model_1'+'.h5')\nmodel_2=tf.keras.models.load_model(saved_model_path+'/'+'model_2'+'.h5')\nmodel_3=tf.keras.models.load_model(saved_model_path+'/'+'model_3'+'.h5')\nmodel_4=tf.keras.models.load_model(saved_model_path+'/'+'model_4'+'.h5')\n\n\n\nprint('Completed loading Saved Models')\n\n    \nwith strategy.scope():    \n    \n    for i in tqdm(range(len(test_generator_name))):\n\n        prediction0=model_0.predict(test_generator_name[i]).flatten().tolist()\n        prediction1=model_1.predict(test_generator_name[i]).flatten().tolist()\n        prediction2=model_2.predict(test_generator_name[i]).flatten().tolist()\n        prediction3=model_3.predict(test_generator_name[i]).flatten().tolist()\n        prediction4=model_4.predict(test_generator_name[i]).flatten().tolist()\n        target0.append(prediction0)\n        target1.append(prediction1)\n        target2.append(prediction2)\n        target3.append(prediction3)\n        target4.append(prediction4)\n\n\n\n        \n        \np0=(list(chain(*target0)))\np1=(list(chain(*target1)))        \np2=(list(chain(*target2)))\np3=(list(chain(*target3)))\np4=(list(chain(*target4)))\n\n\nfor i in tqdm(range(test_csv.shape[0])):           \n    \n    p=(p0[i]+p1[i]+p2[i]+p3[i]+p4[i])/5\n    target.append(p)\n\n    \nsubmission['target']=target\nprint(submission.head())\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv('/kaggle/working/melanoma_tensorflow_beginner_incepv3_gpu.csv', index=False)\nsubmission.shape\nsubmission.head()\n","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}