{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"id":"smSbvlkDkpHh","executionInfo":{"status":"ok","timestamp":1594147367385,"user_tz":180,"elapsed":7584,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"720fa036-94f9-4cc3-f797-b28f90f25685"},"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 tensorflow as tf\nfrom tqdm import tqdm\nimport cv2\nimport os\nfrom random import choice, shuffle\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom zipfile import ZipFile\n\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        \ngpus = tf.config.experimental.list_physical_devices('GPU')\nif gpus:\n    try:\n        for gpu in gpus:\n            tf.config.experimental.set_memory_growth(gpu, True)\n    except RuntimeError as e:\n        print(e)\nprint(tf.__version__)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"id":"ST_R1_eskpH4","executionInfo":{"status":"ok","timestamp":1594147392300,"user_tz":180,"elapsed":31518,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}}},"cell_type":"code","source":"#[TODO] Extrair o dataset\ntrain_data = ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip')\ntest_data = ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip')\n\ntrain_data.extractall()\ntest_data.extractall()\nTRAIN_DIR = os.path.abspath('./train')\nTEST_DIR = os.path.abspath('./test')\nIMG_SIZE = 128","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load and resize dataset with binary label","execution_count":null},{"metadata":{"trusted":true,"id":"9XBjfMQWkpIE","executionInfo":{"status":"ok","timestamp":1594147398055,"user_tz":180,"elapsed":1086,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}}},"cell_type":"code","source":"#0 DOG/ 1 CAT\ndef label_image(img):\n    word_label = img.split('.')[-3]\n    if word_label == 'dog': return 1\n    elif word_label == 'cat': return 0\n\ndef create_train_data():\n    train_data = []\n    for img in tqdm(os.listdir(TRAIN_DIR)):\n        label = label_image(img)\n        path = os.path.join(TRAIN_DIR,img)\n        \n        #ABRE A IMAGEM EM ESCALA DE CINZA -> cv2.imread(path,cv2.IMREAD_GRAYSACLE)\n        #REDIMENSIONA A IMAGEM PARA (50 50) -> cv.resive(img,(x,y))\n        img = cv2.resize(cv2.imread(path,cv2.IMREAD_COLOR),(IMG_SIZE,IMG_SIZE))\n        train_data.append([np.array(img),np.array(label)])\n        \n    shuffle(train_data)\n    return train_data\n  \n\ndef process_test_data():\n    test_data = []\n    for img in tqdm(os.listdir(TEST_DIR)):\n        path = os.path.join(TEST_DIR,img)\n        img_num = img.split('.')[0]\n        img = cv2.resize(cv2.imread(path,cv2.IMREAD_COLOR),(IMG_SIZE,IMG_SIZE))\n        test_data.append([np.array(img).astype(np.float32),img_num])\n    return test_data\n","execution_count":null,"outputs":[]},{"metadata":{"id":"4169Scp9BDQg","executionInfo":{"status":"ok","timestamp":1594147577357,"user_tz":180,"elapsed":170959,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"7a79a487-770c-4dbc-9d2d-ad172eab7e46","trusted":true},"cell_type":"code","source":"data_train = create_train_data()\ndata_test = process_test_data() ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Split in training dataset and development dataset","execution_count":null},{"metadata":{"id":"4nDlwycAFw_l","executionInfo":{"status":"ok","timestamp":1594147590441,"user_tz":180,"elapsed":4064,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"trusted":true},"cell_type":"code","source":"TRAIN = data_train[250:]\nVALID = data_train[:250]\n\nx_predict = np.array([img[0] for img in data_test])\nnumber_image = np.array([img[1] for img in data_test])\n\nx_train = np.array([i[0] for i in TRAIN])\ny_train = np.array([i[1] for i in TRAIN])\n\nx_test = np.array([i[0] for i in VALID])\ny_test = np.array([i[1] for i in VALID])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# \"Build\" a model from MobileNetV2 with weights from imagenet","execution_count":null},{"metadata":{"trusted":true,"id":"Xx2HmG9bkpIL","executionInfo":{"status":"ok","timestamp":1594147605290,"user_tz":180,"elapsed":13593,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"55248038-148e-4eaf-be2b-470fff7da790"},"cell_type":"code","source":"base_model = tf.keras.applications.MobileNetV2(input_shape=(IMG_SIZE,IMG_SIZE,3),weights='imagenet', include_top=False)\nbase_model.trainable = True\nbase_model.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Making the top (classifier) of neural network ","execution_count":null},{"metadata":{"trusted":true,"id":"O7-7szEvkpIR","executionInfo":{"status":"ok","timestamp":1594147606746,"user_tz":180,"elapsed":580,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}}},"cell_type":"code","source":"global_average_layer = tf.keras.layers.GlobalAveragePooling2D()(base_model.output)\noutput_layer = tf.keras.layers.Dense(units=1,activation='sigmoid')(global_average_layer)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Compiling and show overview final architeture","execution_count":null},{"metadata":{"trusted":true,"id":"W2TFKq9MkpIW","executionInfo":{"status":"ok","timestamp":1594147609221,"user_tz":180,"elapsed":965,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"464e455e-4641-4aad-d89d-b34ef215040b"},"cell_type":"code","source":"model = tf.keras.models.Model(inputs=base_model.input, outputs=output_layer)\nmodel.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.000001),loss='binary_crossentropy',metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Simple training only 10 epochs just test it","execution_count":null},{"metadata":{"trusted":true,"id":"Mdhc5PcFkpIg","executionInfo":{"status":"ok","timestamp":1594147885127,"user_tz":180,"elapsed":271867,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"cfcf3a4c-1ced-45a7-8456-4118a7680f49"},"cell_type":"code","source":"model.fit(x_train,y_train,epochs=10,batch_size=64)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Nice results for only 10 epochs training and without tuning hyperparameters","execution_count":null},{"metadata":{"id":"ULorfDX9Plzw","executionInfo":{"status":"ok","timestamp":1594148668533,"user_tz":180,"elapsed":886865,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"4730e08b-0a8f-468e-b988-cb6ca8852220","trusted":true},"cell_type":"code","source":"model.evaluate(x_test,y_test)","execution_count":null,"outputs":[]},{"metadata":{"id":"uwybGKcIQDFT","executionInfo":{"status":"ok","timestamp":1594148681255,"user_tz":180,"elapsed":899120,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"trusted":true},"cell_type":"code","source":"predictions = model.predict(x_predict)","execution_count":null,"outputs":[]},{"metadata":{"id":"Lp9EA7FjUmpt","executionInfo":{"status":"ok","timestamp":1594148681256,"user_tz":180,"elapsed":890753,"user":{"displayName":"Almir Neto","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gh6RtqxjBKYSx3q7gXeWO3qIjfrhoHCACK8o2w_6gw=s64","userId":"10147970555264423793"}},"outputId":"a98a1984-4364-4715-9f88-3aa483aa9612","trusted":true},"cell_type":"code","source":"predict = pd.Series(predictions.squeeze())\npredict = pd.Series(np.where(predict>0.5,1,0).squeeze())\nresult = {'id':number_image,'label':predict}\nresult = pd.DataFrame(data=result)\nresult.to_csv('result.csv',index=False)\nresult","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}