{"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 keras,os\nfrom keras.models import Sequential #so that all layers are arranged in sequence\nfrom keras.layers import Dense, Conv2D, MaxPool2D , Flatten\nfrom keras.preprocessing.image import ImageDataGenerator\nimport numpy as np","metadata":{"id":"wwAX6PRKRJM4","execution":{"iopub.status.busy":"2023-03-16T01:37:39.534154Z","iopub.execute_input":"2023-03-16T01:37:39.534519Z","iopub.status.idle":"2023-03-16T01:37:48.873492Z","shell.execute_reply.started":"2023-03-16T01:37:39.534477Z","shell.execute_reply":"2023-03-16T01:37:48.872281Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = \"/kaggle/input/hotel-id-to-combat-human-trafficking-2022-fgvc9/train_images\"\ndatagen = ImageDataGenerator(validation_split=0.2)\n\ntrain_generator = datagen.flow_from_directory(\n    train_dir,\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='categorical',\n    subset='training')\n\nval_generator = datagen.flow_from_directory(\n    train_dir,\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='categorical',\n    subset='validation')\n\n\n# val_generator = datagen.flow_from_directory(\n#     train_dir,\n#     target_size=(224, 224),\n#     batch_size=32,\n#     class_mode='categorical',\n#     subset='validation',\n#     shuffle=False)\n\n# # Obtain the validation features and labels\n# val_features, val_labels = val_generator.next()\n","metadata":{"id":"tJbrxKhv9Zs8","outputId":"058f1782-2036-4267-f6c3-ca940d3d2797","execution":{"iopub.status.busy":"2023-03-16T01:37:48.876044Z","iopub.execute_input":"2023-03-16T01:37:48.876874Z","iopub.status.idle":"2023-03-16T01:38:06.904659Z","shell.execute_reply.started":"2023-03-16T01:37:48.876833Z","shell.execute_reply":"2023-03-16T01:38:06.903599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#CNN model","metadata":{"id":"CGhzB8VlAGaZ"}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\n#Add fully connected layers\nmodel.add(Flatten())\nmodel.add(Dense(units=4096,activation=\"relu\"))\nmodel.add(Dense(units=4096,activation=\"relu\"))\nmodel.add(Dense(units=3116, activation=\"softmax\"))\n#Show the structure of the CNN\nmodel.summary()","metadata":{"id":"diWSxxbJ_o9G","outputId":"be45210a-5211-41ed-c9ba-e40496c65fa4","execution":{"iopub.status.busy":"2023-03-16T01:38:06.906926Z","iopub.execute_input":"2023-03-16T01:38:06.907566Z","iopub.status.idle":"2023-03-16T01:38:10.428904Z","shell.execute_reply.started":"2023-03-16T01:38:06.907526Z","shell.execute_reply":"2023-03-16T01:38:10.428065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Optimization to reach global minima during training","metadata":{"id":"kxZ_qV4u_5l2"}},{"cell_type":"code","source":"from keras.optimizers import Adam\nopt = Adam(learning_rate=0.001)\nmodel.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])","metadata":{"id":"7F8ur7Re_qC7","execution":{"iopub.status.busy":"2023-03-16T01:38:10.431361Z","iopub.execute_input":"2023-03-16T01:38:10.43202Z","iopub.status.idle":"2023-03-16T01:38:10.475585Z","shell.execute_reply.started":"2023-03-16T01:38:10.431973Z","shell.execute_reply":"2023-03-16T01:38:10.474437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Monitoring validation accuracy\nThe model will only be saved to disk if the validation accuracy of the model in current epoch is greater than what it was in the last epoch.","metadata":{"id":"uJg1XSayAaY5"}},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint, EarlyStopping\ncheckpoint = ModelCheckpoint(\"vgg16_1.h5\", monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', save_freq=1)\n#early = EarlyStopping(monitor='val_loss', min_delta=0, patience=20, verbose=1, mode='auto')\nhist = model.fit(train_generator, epochs=150, steps_per_epoch=100, validation_data=val_generator, validation_steps=10)\n\n\n# hist = model.fit(train_generator, epochs=1, steps_per_epoch=2, validation_data=val_generator, validation_steps=10, callbacks=[checkpoint, early])\n# for key in hist.history:\n#   print(key)\n#hist = model.fit(train_generator, epochs=100, validation_data=(val_features, val_labels), callbacks=[checkpoint, early])\n\n#hist = model.fit(train_generator, epochs=100, steps_per_epoch=100, validation_data=(val_features, val_labels), callbacks=[checkpoint, early])\n\n#hist = model.fit(train_generator, epochs=10, steps_per_epoch=8, validation_data=(val_features, val_labels), callbacks=[checkpoint, early])\n\n# hist = model.fit(train_generator, epochs=10, steps_per_epoch=100, validation_data=val_generator, validation_steps=10, callbacks=[checkpoint, early])\n# hist = model.fit_generator(steps_per_epoch=8,generator=train_generator, validation_data= val_generator, validation_steps=10,epochs=10,callbacks=[checkpoint,early])","metadata":{"id":"UOIa2PryAiCA","outputId":"aaaeb5f7-df04-42d2-89e6-e796636aa9cb","execution":{"iopub.status.busy":"2023-03-16T01:38:10.47727Z","iopub.execute_input":"2023-03-16T01:38:10.477946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Save the model**","metadata":{}},{"cell_type":"code","source":"model.save(\"try_model.h5\")\n","metadata":{"execution":{"iopub.status.busy":"2023-03-16T12:01:36.77555Z","iopub.execute_input":"2023-03-16T12:01:36.776259Z","iopub.status.idle":"2023-03-16T12:01:36.854894Z","shell.execute_reply.started":"2023-03-16T12:01:36.776218Z","shell.execute_reply":"2023-03-16T12:01:36.853279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Saving as json file**","metadata":{}},{"cell_type":"code","source":"from keras.models import model_from_json\n# serialize model to json\njson_model = model.to_json()\n#save the model architecture to JSON file\nwith open('fashionmnist_model.json', 'w') as json_file:\n    json_file.write(json_model)\n#saving the weights of the model\nmodel.save_weights('FashionMNIST_weights.h5')\n#Model loss and accuracy\nloss,acc = model.evaluate(test_images,  test_labels, verbose=2)","metadata":{"execution":{"iopub.status.busy":"2023-03-16T12:01:36.855832Z","iopub.status.idle":"2023-03-16T12:01:36.856459Z","shell.execute_reply.started":"2023-03-16T12:01:36.85628Z","shell.execute_reply":"2023-03-16T12:01:36.856301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Creating zip folder**","metadata":{}},{"cell_type":"code","source":"!zip -r file.zip \"/kaggle/working/try_model.h5\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Load the model**","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.models import load_model\nloaded_model = load_model(\"try_model.h5\")\nloaded_model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Removing unwanted files**","metadata":{}},{"cell_type":"code","source":"#os.remove(\"/kaggle/working/file.zip\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Visualise training/validation accuracy and loss","metadata":{"id":"qUEi49qIAtVC"}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.plot(hist.history[\"accuracy\"])\nplt.plot(hist.history['val_accuracy'])\nplt.plot(hist.history['loss'])\nplt.plot(hist.history['val_loss'])\nplt.title(\"model accuracy\")\nplt.ylabel(\"Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.legend([\"Accuracy\",\"Validation Accuracy\",\"loss\",\"Validation Loss\"])\nplt.show()","metadata":{"id":"-OhT5JgLAtoU","outputId":"1db80900-a3b7-4156-c3d4-44f0795a430f","trusted":true},"execution_count":null,"outputs":[]}]}