{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":1,"outputs":[{"output_type":"stream","text":"['inceptionv3', 'inaturalist-2019-fgvc6']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import json\n\n\nann_file = '../input/inaturalist-2019-fgvc6/train2019.json'\nwith open(ann_file) as data_file:\n        train_anns = json.load(data_file)","execution_count":2,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_anns_df = pd.DataFrame(train_anns['annotations'])[['image_id','category_id']]\ntrain_img_df = pd.DataFrame(train_anns['images'])[['id', 'file_name']].rename(columns={'id':'image_id'})\ndf_train_file_cat = pd.merge(train_img_df, train_anns_df, on='image_id')\ndf_train_file_cat['category_id']=df_train_file_cat['category_id'].astype(str)\ndf_train_file_cat.head()","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"   image_id     ...     category_id\n0         0     ...             400\n1         1     ...             570\n2         2     ...             167\n3         3     ...             254\n4         4     ...             739\n\n[5 rows x 3 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>image_id</th>\n      <th>file_name</th>\n      <th>category_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>train_val2019/Plants/400/d1322d13ccd856eb4236c...</td>\n      <td>400</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>train_val2019/Plants/570/15edbc1e2ef000d8ace48...</td>\n      <td>570</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>train_val2019/Reptiles/167/c87a32e8927cbf4f06d...</td>\n      <td>167</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>3</td>\n      <td>train_val2019/Birds/254/9fcdd1d37e96d8fd94dfdc...</td>\n      <td>254</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4</td>\n      <td>train_val2019/Plants/739/ffa06f951e99de9d220ae...</td>\n      <td>739</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(len(df_train_file_cat))","execution_count":4,"outputs":[{"output_type":"stream","text":"265213\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# splitting data into train and validation\nfrom sklearn.model_selection import train_test_split\ntrain, valid = train_test_split(df_train_file_cat, stratify=df_train_file_cat.category_id, test_size=0.2)","execution_count":5,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"nb_classes = 1010\nbatch_size = 64\nimg_size = 299\nnb_epochs = 2","execution_count":6,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n# Add our data-augmentation parameters to ImageDataGenerator\ntrain_datagen = ImageDataGenerator(rescale = 1./255.,\n                                   rotation_range = 20,\n                                   width_shift_range = 0.2,\n                                   height_shift_range = 0.2,\n                                   shear_range = 0.2,\n                                   zoom_range = 0.2,\n                                   horizontal_flip = True)\n\n# Note that the validation data should not be augmented!\ntest_datagen = ImageDataGenerator( rescale = 1.0/255. )\n\n# Flow training images in batches of 20 using train_datagen generator\ntrain_generator = train_datagen.flow_from_dataframe(train,\n                                                    directory=\"../input/inaturalist-2019-fgvc6/train_val2019\", \n                                                    x_col='file_name', \n                                                    y_col='category_id',\n                                                    batch_size = batch_size,\n                                                    class_mode = 'categorical', \n                                                    target_size = (img_size, img_size), \n                                                    color_mode='rgb')     \n\n# Flow validation images in batches of 20 using test_datagen generator\nvalidation_generator =  test_datagen.flow_from_dataframe( valid,\n                                                          directory=\"../input/inaturalist-2019-fgvc6/train_val2019\", \n                                                          x_col='file_name', \n                                                          y_col='category_id',\n                                                          batch_size  = batch_size,\n                                                          class_mode  = 'categorical', \n                                                          target_size = (img_size, img_size), \n                                                          color_mode='rgb')","execution_count":7,"outputs":[{"output_type":"stream","text":"Found 212170 images belonging to 1010 classes.\nFound 53043 images belonging to 1010 classes.\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras import layers\nfrom tensorflow.keras import Model\n  \nfrom tensorflow.keras.applications.inception_v3 import InceptionV3\n\nlocal_weights_file = '../input/inceptionv3/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'\n\npre_trained_model = InceptionV3(input_shape = (img_size, img_size, 3), \n                                include_top = False, \n                                weights = None)\n\npre_trained_model.load_weights(local_weights_file)\nfor layer in pre_trained_model.layers:\n    layer.trainable = True\nfor layer in pre_trained_model.layers:\n  if layer.name == 'mixed6':\n    break\n  layer.trainable = False\n  \n# pre_trained_model.summary()\n\nlast_layer = pre_trained_model.get_layer('mixed7')\nprint('last layer output shape: ', last_layer.output_shape)\nlast_output = last_layer.output","execution_count":8,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\nlast layer output shape:  (None, 17, 17, 768)\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Check the trainable status of the individual layers\nfor layer in pre_trained_model.layers:\n    print(layer, layer.trainable)","execution_count":9,"outputs":[{"output_type":"stream","text":"<tensorflow.python.keras.engine.input_layer.InputLayer object at 0x7f229e63aa90> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e63ae48> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e623dd8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e642240> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e6425c0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229de19a20> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229de19e48> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e5a95f8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e5a97b8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e666780> False\n<tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f229e5c2e80> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e5c2e10> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e45e470> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e45e748> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e488dd8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e41f710> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e41feb8> False\n<tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f229e3c7a58> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e167fd0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e186438> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e0fc6a0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e306470> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e0a7d30> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e22bb00> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e0c03c8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e246c18> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e0c0b38> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f229df2dc88> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e3c7a20> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229e246470> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229dfea630> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229df2d400> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e2eb048> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229e29d2b0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229df0f978> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229dea5940> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e2eba20> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e1fcbe0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229e002048> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229dea5a58> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229de6bbe0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d44dac8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d3e6d30> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d3e6e80> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d569ba8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d310a58> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d57f5f8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d2af7f0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d57f320> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d323978> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f229d1f0dd8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229de6b780> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d4a5ef0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d250b00> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d1f0e10> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d59e8d0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d4c2048> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d264550> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d18b390> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d59e9e8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d4c22e8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d264278> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d18b438> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229d130cf8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cef1cc0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229cf05710> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cf05550> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d072d30> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229ce30860> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d086cc0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229ce49080> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d086470> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229ce492e8> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f229cc94e80> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229d147cc0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cfaf668> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cd53ba8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cc94780> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229d050278> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229ced59b0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229cd6de80> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229cc11cc0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229d050fd0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cfc8898> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cd6d668> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cc3a8d0> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229cbd8a20> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cb18e48> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229cb2b898> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cb2b6d8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229ca56a58> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229ca714a8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229ca71160> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229cbd8d30> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c9facf8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229cbcdba8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c9900f0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229cbeada0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c990c50> False\n<tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f229c93b668> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229c93b908> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c619eb8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c6342b0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c634240> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c55ab00> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c572dd8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c572320> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c87bb70> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c41eac8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c80ee48> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c3c37f0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c80e390> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c434978> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c7b4780> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c363be0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c6d9908> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c376588> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c7c97f0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c3761d0> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f229c246a20> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c93ba20> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c6f8c18> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c302e10> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c2469e8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c85fa90> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c68f668> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c29b278> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c16d048> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c87b3c8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c68f390> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c29beb8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c16da20> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229c186470> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297ed1cc0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297e76eb8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297e76400> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297d9d780> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297cc4908> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297db47f0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c0c7438> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297ce2c18> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297fda9b0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297cf5668> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c05b898> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297cf5390> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297ff8c50> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297c06eb8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297f8e710> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297c202b0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297f8e438> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297c20748> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f2297a86ac8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229c1869e8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297f37f28> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297b5ddd8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297a866a0> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229c0fee48> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297eb3630> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297b46ac8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297a01c88> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229c1149e8> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297eb3588> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297b46e48> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297a2b7f0> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f22979cbeb8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229772c6d8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229764ea90> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229773f278> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297671dd8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297603518> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297603278> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229790add8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22975ac9e8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229791c828> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229752a668> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229791c668> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229752a5c0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22978aaf98> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297548cf8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297848588> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22974ecef0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297861080> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22974ec438> False\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f2297355c50> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22979cb4e0> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22977ebb00> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22974157b8> False\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22973553c8> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22979bde48> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297785c88> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297415710> False\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22972d1908> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22979bdb00> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297785be0> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22973ba940> False\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22972d1a20> False\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f2297297b00> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296fffe48> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296f94898> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296f946d8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296f3fa20> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296f3f0b8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296eda0b8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22971d8b70> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296e63cf8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22971ee518> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296e7b160> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22971ee240> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296e7bc18> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2297178da0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296da5710> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2297114240> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296ccbb38> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297114e80> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296d22f28> True\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f2296c08fd0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22972ad550> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22970bc9e8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296ce7e10> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296bc2048> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229720e940> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296fe19e8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296ce73c8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296b9e5f8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229720e7b8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2297057cc0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296c9ea20> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296b9e6a0> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f2296b65f28> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22969cbac8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22969e3da0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22969e32e8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229690dda0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22968af7b8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296922978> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296b4bbe0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296850ba8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296ae1a90> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296868550> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296b7e1d0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296868198> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296aa3eb8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22967f1dd8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296a40048> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229678ada0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296a401d0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229678add8> True\n<tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x7f22967339e8> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f22967339b0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296433358> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22963ce2e8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22963af550> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296676c50> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296359e80> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296609ef0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296372278> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296609438> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296372d30> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22965b2668> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22964f3cc0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2296299b00> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22961dadd8> True\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f229611f6d8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f22966acf28> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22964d59b0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2296489710> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22962b1dd8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229617f828> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229611f2b0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f229665cb38> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f229654b898> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2296489550> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22962b15c0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22961f19b0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22960bfd30> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22966ccf98> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f2296433e10> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229611fb38> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22960bfbe0> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f229605ed30> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295d43b00> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295d5a7f0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295d3cd68> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295f9cd30> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295c87e48> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295fb4780> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295c288d0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295fb45c0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295c9ba20> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295f3dfd0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295e02d30> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295bc5be0> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295b04ef0> True\n<tensorflow.python.keras.layers.pooling.AveragePooling2D object at 0x7f2295aaadd8> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f229605e438> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295edb4a8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295e19cc0> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295bdc630> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295b1f048> True\n<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7f2295aaaa90> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f2295fd7f28> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295e546a0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295e19470> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295bdc358> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295b1f2e8> True\n<tensorflow.python.keras.layers.normalization.BatchNormalizationV1 object at 0x7f22959eb5c0> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f2295fd7a58> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f2295d437b8> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f2295aaaac8> True\n<tensorflow.python.keras.layers.core.Activation object at 0x7f22959ebb38> True\n<tensorflow.python.keras.layers.merge.Concatenate object at 0x7f22959ebcf8> True\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.optimizers import RMSprop\n\n# Flatten the output layer to 1 dimension\nx = layers.Flatten()(last_output)\n# Add a fully connected layer with 1,024 hidden units and ReLU activation\nx = layers.Dense(1024, activation='relu')(x)\n# Add a dropout rate of 0.2\nx = layers.Dropout(rate=0.2)(x)                  \n# Add a final sigmoid layer for classification\nx = layers.Dense  (nb_classes, activation='softmax')(x)           \n\nmodel = Model( pre_trained_model.input, x) \n\nmodel.compile(optimizer = RMSprop(lr=0.0001), \n              loss = 'categorical_crossentropy', \n              metrics = ['accuracy'])\n","execution_count":10,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/keras/layers/core.py:143: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\nInstructions for updating:\nPlease use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_generator, epochs=nb_epochs, validation_data = validation_generator, verbose = 1)\n\nmodel.save(\"rps.h5\")","execution_count":11,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nUse tf.cast instead.\nEpoch 1/2\n829/829 [==============================] - 1170s 1s/step - loss: 3.9689 - acc: 0.2144\n3316/3316 [==============================] - 10756s 3s/step - loss: 4.7118 - acc: 0.1260 - val_loss: 3.9689 - val_acc: 0.2144\nEpoch 2/2\n829/829 [==============================] - 1222s 1s/step - loss: 3.9385 - acc: 0.2459\n3316/3316 [==============================] - 10862s 3s/step - loss: 3.5791 - acc: 0.2419 - val_loss: 3.9385 - val_acc: 0.2459\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nacc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'r', label='Training accuracy')\nplt.plot(epochs, val_acc, 'b', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend(loc=0)\nplt.figure()\n\n\nplt.show()","execution_count":12,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 0 Axes>"},"metadata":{}}]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}