{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import libraries\n\nimport os\nimport numpy as np\nimport pandas as pd\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nprint('Tensorflow version= ',tf.__version__)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:10.303607Z","iopub.execute_input":"2022-07-31T10:46:10.303997Z","iopub.status.idle":"2022-07-31T10:46:10.314064Z","shell.execute_reply.started":"2022-07-31T10:46:10.303963Z","shell.execute_reply":"2022-07-31T10:46:10.313111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = '../input/100-bird-species/train'\ntest = '../input/100-bird-species/test'\nvalid = '../input/100-bird-species/valid'","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:10.345895Z","iopub.execute_input":"2022-07-31T10:46:10.346610Z","iopub.status.idle":"2022-07-31T10:46:10.351272Z","shell.execute_reply.started":"2022-07-31T10:46:10.346573Z","shell.execute_reply":"2022-07-31T10:46:10.350197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir = '../input/100-bird-species/train/'\ndirnames = [d for d in os.listdir(dir) if os.path.isdir(os.path.join(dir, d))]\nnum_image = 12\nnum_row = 3\nnum_col = 4\n\n# plot images\n\nfig, axes = plt.subplots(num_row, num_col, figsize=(3*num_col,4*num_row))\n\nfor j,i in enumerate(dirnames[:num_image]):\n    ax = axes[j//num_col, j%num_col]\n    file = dir + i + '/'+ os.listdir(dir+i)[0]\n    image = mpimg.imread(file)\n    ax.imshow(image)\n    ax.set_title('Label: {}'.format(i))\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:10.379124Z","iopub.execute_input":"2022-07-31T10:46:10.379423Z","iopub.status.idle":"2022-07-31T10:46:12.045406Z","shell.execute_reply.started":"2022-07-31T10:46:10.379396Z","shell.execute_reply":"2022-07-31T10:46:12.041381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Training data\ntrain_datagen = ImageDataGenerator(rescale=1/255)\ntrain_generator = train_datagen.flow_from_directory(\n                                                    '../input/100-bird-species/train',\n                                                    target_size=(299,299),\n                                                    batch_size= 128,\n                                                    class_mode='categorical')\n\n# Test data\ntest_datagen = ImageDataGenerator(rescale=1/255)\ntest_generator = test_datagen.flow_from_directory(\n                                                    '../input/100-bird-species/test',\n                                                    target_size=(299,299),\n                                                    batch_size= 128,\n                                                    class_mode='categorical')\n\n# Validation data\nvalid_datagen = ImageDataGenerator(rescale=1/255)\nvalid_generator = valid_datagen.flow_from_directory(\n                                                    '../input/100-bird-species/valid',\n                                                    target_size=(299,299),\n                                                    batch_size= 128,\n                                                    class_mode='categorical')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:12.047247Z","iopub.execute_input":"2022-07-31T10:46:12.048291Z","iopub.status.idle":"2022-07-31T10:46:16.106874Z","shell.execute_reply.started":"2022-07-31T10:46:12.048253Z","shell.execute_reply":"2022-07-31T10:46:16.105764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inception_raw_model = tf.keras.applications.inception_resnet_v2.InceptionResNetV2(\n                                                            include_top=False,\n                                                            weights='imagenet',\n                                                            input_shape=(299,299,3), # input size of the images(fixed)\n                                                            pooling='max')\n\n# To not train these weights with our training images\nfor layers in inception_raw_model.layers:\n    layers.trainable=False\n\n# append Dense layers to clssify it for number of classes for the given problem\nnum_of_classes = 400\ninception_model_output = inception_raw_model.layers[-1].output\nappended_layer = tf.keras.layers.Flatten()(inception_model_output)\nappended_layer = tf.keras.layers.Dense(num_of_classes, activation='softmax')(appended_layer)\n\n\n# final model\ninception_final_model = tf.keras.Model(inception_raw_model.input, appended_layer)\nprint(inception_final_model.summary())\ninception_final_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:16.108354Z","iopub.execute_input":"2022-07-31T10:46:16.109380Z","iopub.status.idle":"2022-07-31T10:46:21.952273Z","shell.execute_reply.started":"2022-07-31T10:46:16.109339Z","shell.execute_reply":"2022-07-31T10:46:21.951158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = inception_final_model.fit(\n                                    train_generator,\n                                    epochs=10,\n                                    validation_data=valid_generator)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T10:46:21.954653Z","iopub.execute_input":"2022-07-31T10:46:21.955627Z","iopub.status.idle":"2022-07-31T11:40:08.100079Z","shell.execute_reply.started":"2022-07-31T10:46:21.955589Z","shell.execute_reply":"2022-07-31T11:40:08.098969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inception_final_model.evaluate(test_generator)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T11:42:13.206193Z","iopub.execute_input":"2022-07-31T11:42:13.206555Z","iopub.status.idle":"2022-07-31T11:42:36.020726Z","shell.execute_reply.started":"2022-07-31T11:42:13.206523Z","shell.execute_reply":"2022-07-31T11:42:36.019827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inception_final_model.save('inception_restnet_model.h5')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T11:56:41.589077Z","iopub.execute_input":"2022-07-31T11:56:41.589435Z","iopub.status.idle":"2022-07-31T11:56:43.102579Z","shell.execute_reply.started":"2022-07-31T11:56:41.589404Z","shell.execute_reply":"2022-07-31T11:56:43.101607Z"},"trusted":true},"execution_count":null,"outputs":[]}]}