{"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 pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport PIL\nimport os\nimport cv2\nimport tensorflow as tf\nimport urllib\n\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPool2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.datasets import mnist\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras import Input, Sequential","metadata":{"id":"hDtDXPuXWcGM","execution":{"iopub.status.busy":"2023-06-13T10:02:22.956617Z","iopub.execute_input":"2023-06-13T10:02:22.957255Z","iopub.status.idle":"2023-06-13T10:02:22.965461Z","shell.execute_reply.started":"2023-06-13T10:02:22.957210Z","shell.execute_reply":"2023-06-13T10:02:22.964313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_VGG16(input_layer:tuple = None, include_top = True, output_number:int = 1000):\n    model = Sequential()\n    model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu', input_shape=input_layer if input_layer is not None else (224,224,3)))\n    model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'))\n\n    model.add(MaxPool2D())\n    model.add(Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'))\n\n    model.add(MaxPool2D())\n    model.add(Conv2D(filters=256, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=256, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=256, kernel_size=(3,3), padding='same', activation='relu'))\n\n    model.add(MaxPool2D())\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n\n    model.add(MaxPool2D())\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n    model.add(Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'))\n\n    model.add(MaxPool2D(name='vgg16'))\n    model.add(Flatten(name='flatten'))\n    model.add(Dense(4096, activation='relu', name='fc1'))\n    model.add(Dense(4096, activation='relu', name='fc2'))\n    model.add(Dense(output_number, activation='softmax', name='output'))\n    if include_top == True:\n        return model\n    else:\n        return Model(inputs=model.input, outputs=model.get_layer('vgg16').output)\n\nbase_model = get_VGG16(input_layer=(32,32,1), output_number=10)\nprint(base_model.input.shape)\nbase_model.summary()","metadata":{"id":"moFDs-yomvB6","outputId":"c40422fc-1924-4e09-b0a7-bea6517b246d","execution":{"iopub.status.busy":"2023-06-13T10:02:22.971621Z","iopub.execute_input":"2023-06-13T10:02:22.972100Z","iopub.status.idle":"2023-06-13T10:02:23.260636Z","shell.execute_reply.started":"2023-06-13T10:02:22.972071Z","shell.execute_reply":"2023-06-13T10:02:23.259763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!nvidia-smi","metadata":{"id":"25Q6luFRwn6I","outputId":"cb6efef5-9984-476f-dba6-b7f1a4c4042c","execution":{"iopub.status.busy":"2023-06-13T10:02:23.262680Z","iopub.execute_input":"2023-06-13T10:02:23.263074Z","iopub.status.idle":"2023-06-13T10:02:24.479892Z","shell.execute_reply.started":"2023-06-13T10:02:23.263037Z","shell.execute_reply":"2023-06-13T10:02:24.478507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(X_train, Y_train), (X_test, Y_test) = mnist.load_data()\nX_train.shape","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:24.482393Z","iopub.execute_input":"2023-06-13T10:02:24.482802Z","iopub.status.idle":"2023-06-13T10:02:24.813919Z","shell.execute_reply.started":"2023-06-13T10:02:24.482761Z","shell.execute_reply":"2023-06-13T10:02:24.812981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train.reshape((-1, 28, 28, 1)).astype('float32') / 255.0\nX_test = X_test.reshape((-1, 28, 28, 1)).astype('float32') / 255.0\nY_train = to_categorical(Y_train)\nY_test = to_categorical(Y_test)\n\nX_train.shape, X_test.shape, Y_train.shape, Y_test.shape","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:24.815695Z","iopub.execute_input":"2023-06-13T10:02:24.816134Z","iopub.status.idle":"2023-06-13T10:02:24.943449Z","shell.execute_reply.started":"2023-06-13T10:02:24.816099Z","shell.execute_reply":"2023-06-13T10:02:24.942132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = X_train[0]\nplt.imshow(test)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:24.948023Z","iopub.execute_input":"2023-06-13T10:02:24.948479Z","iopub.status.idle":"2023-06-13T10:02:25.217570Z","shell.execute_reply.started":"2023-06-13T10:02:24.948439Z","shell.execute_reply":"2023-06-13T10:02:25.216457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = X_train[0]\ntest = cv2.resize(test, (32, 32))\nprint(test.shape)\nplt.imshow(test)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:25.219336Z","iopub.execute_input":"2023-06-13T10:02:25.219742Z","iopub.status.idle":"2023-06-13T10:02:25.521176Z","shell.execute_reply.started":"2023-06-13T10:02:25.219706Z","shell.execute_reply":"2023-06-13T10:02:25.519901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_scaled = np.asarray([cv2.resize(im, (32,32)) for im in X_train])\nX_test_scaled = np.asarray([cv2.resize(im, (32,32)) for im in X_test])\nX_train_scaled.shape, X_test_scaled.shape","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:25.522857Z","iopub.execute_input":"2023-06-13T10:02:25.523255Z","iopub.status.idle":"2023-06-13T10:02:26.284765Z","shell.execute_reply.started":"2023-06-13T10:02:25.523220Z","shell.execute_reply":"2023-06-13T10:02:26.283819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model.compile(\n    optimizer=Adam(learning_rate=5e-5),\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:26.286199Z","iopub.execute_input":"2023-06-13T10:02:26.286798Z","iopub.status.idle":"2023-06-13T10:02:26.311480Z","shell.execute_reply.started":"2023-06-13T10:02:26.286759Z","shell.execute_reply":"2023-06-13T10:02:26.310409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_accuracy', mode='max',verbose=1,patience=3)\n\nh = base_model.fit(X_train_scaled, Y_train, epochs=15, batch_size=128, validation_split=0.2, callbacks=[])","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:26.313713Z","iopub.execute_input":"2023-06-13T10:02:26.314457Z","iopub.status.idle":"2023-06-13T10:06:21.687766Z","shell.execute_reply.started":"2023-06-13T10:02:26.314421Z","shell.execute_reply":"2023-06-13T10:06:21.686715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_accuracy = base_model.evaluate(X_test_scaled, Y_test)\nprint('Test loss: ', test_loss)\nprint('Test accuracy: ', test_accuracy)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:06:21.689208Z","iopub.execute_input":"2023-06-13T10:06:21.689599Z","iopub.status.idle":"2023-06-13T10:06:24.402774Z","shell.execute_reply.started":"2023-06-13T10:06:21.689563Z","shell.execute_reply":"2023-06-13T10:06:24.401627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc = h.history['accuracy']\nval_acc = h.history['val_accuracy']\nloss = h.history['loss']\nval_loss = h.history['val_loss']\n\nepochs_range = range(1, len(acc) + 1)\n\nplt.figure(figsize=(12, 4))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy')\nplt.plot(epochs_range, val_acc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:06:24.404567Z","iopub.execute_input":"2023-06-13T10:06:24.404971Z","iopub.status.idle":"2023-06-13T10:06:24.971091Z","shell.execute_reply.started":"2023-06-13T10:06:24.404913Z","shell.execute_reply":"2023-06-13T10:06:24.968418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"req = urllib.request.urlopen('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYlWExi48dpX6VrjS7FuX-_FATwlz8QpbFeMtPnQ_NKlNoxqqzWCmD66yMPWfK6IDbec0&usqp=CAU')\narr = np.asarray(bytearray(req.read()), dtype=np.uint8)\nimg = cv2.imdecode(arr, 0)\nimg = cv2.resize(img, (32,32))\nimg = img * 1./255\n\nplt.imshow(img)\nplt.show()\nprint(img.shape)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:09:25.338992Z","iopub.execute_input":"2023-06-13T10:09:25.339531Z","iopub.status.idle":"2023-06-13T10:09:25.648782Z","shell.execute_reply.started":"2023-06-13T10:09:25.339495Z","shell.execute_reply":"2023-06-13T10:09:25.647755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"res = base_model.predict(np.asarray([img]))\nproba = list(res[0])\nres_val = max(proba)\nres_idx = proba.index(res_val)\n\nres_idx\n# proba","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:09:30.458290Z","iopub.execute_input":"2023-06-13T10:09:30.458660Z","iopub.status.idle":"2023-06-13T10:09:30.535235Z","shell.execute_reply.started":"2023-06-13T10:09:30.458632Z","shell.execute_reply":"2023-06-13T10:09:30.534013Z"},"trusted":true},"execution_count":null,"outputs":[]}]}