{"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":"markdown","source":"\n# 0. Informasi\n\n* NIM: 20210804007\n* Nama: Julianto\n* CMA103 Topik dalam Image Processing EU101 7673\n* UAS\n* Dataset: CIFAR-10\n* Classes: 10\n* Reference: https://www.kaggle.com/code/danielpleus/resnet-cifar","metadata":{}},{"cell_type":"markdown","source":"# 1. Load Libs","metadata":{}},{"cell_type":"code","source":"from IPython.display import clear_output\n\nimport tensorflow as tf\nimport tensorflow.keras as keras\nfrom tensorflow.keras.regularizers import l2\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:39:54.055699Z","iopub.execute_input":"2022-08-03T18:39:54.056259Z","iopub.status.idle":"2022-08-03T18:41:04.346333Z","shell.execute_reply.started":"2022-08-03T18:39:54.056215Z","shell.execute_reply":"2022-08-03T18:41:04.345045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Configs","metadata":{}},{"cell_type":"code","source":"gpu_devices = tf.config.experimental.list_physical_devices('GPU')\nfor device in gpu_devices:\n    tf.config.experimental.set_memory_growth(device, True)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:04:55.048505Z","iopub.execute_input":"2022-08-03T18:04:55.049011Z","iopub.status.idle":"2022-08-03T18:04:55.056134Z","shell.execute_reply.started":"2022-08-03T18:04:55.048972Z","shell.execute_reply":"2022-08-03T18:04:55.054587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Load Dataset","metadata":{}},{"cell_type":"code","source":"data_train = keras.utils.image_dataset_from_directory(\"../input/cifar10-pngs-in-folders/cifar10/train\", image_size=(32,32), batch_size=128)\ndata_test = keras.utils.image_dataset_from_directory(\"../input/cifar10-pngs-in-folders/cifar10/test\", image_size=(32,32), batch_size=128)\nclass_names = data_train.class_names","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:05:31.850781Z","iopub.execute_input":"2022-08-03T18:05:31.851231Z","iopub.status.idle":"2022-08-03T18:05:45.341698Z","shell.execute_reply.started":"2022-08-03T18:05:31.851194Z","shell.execute_reply":"2022-08-03T18:05:45.340045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"verbose=1\nplt.figure(figsize=(10, 10))\nfor images, labels in data_train.take(1):\n    for i in range(9):\n        ax = plt.subplot(3, 3, i + 1)\n        plt.imshow(images[i].numpy().astype(\"uint8\"))\n        plt.title(class_names[labels[i]])\n        plt.axis(\"off\")\nclear_output()","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:05:49.051339Z","iopub.execute_input":"2022-08-03T18:05:49.052359Z","iopub.status.idle":"2022-08-03T18:05:51.921944Z","shell.execute_reply.started":"2022-08-03T18:05:49.052306Z","shell.execute_reply":"2022-08-03T18:05:51.920941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_train.take(1)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T17:51:42.474008Z","iopub.execute_input":"2022-08-03T17:51:42.475042Z","iopub.status.idle":"2022-08-03T17:51:42.485289Z","shell.execute_reply.started":"2022-08-03T17:51:42.474966Z","shell.execute_reply":"2022-08-03T17:51:42.483975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. ResNet","metadata":{}},{"cell_type":"code","source":"def conv_layer(x_input, n=0):\n    for filters in [16,32,64]:\n        for i in range(0,n):\n            if i == 0 and filters!=16:\n                x = keras.layers.Conv2D(filters,(3,3),strides=(2,2), padding=\"same\", kernel_initializer=\"he_normal\", kernel_regularizer=l2(1e-4))(x_input)\n                # For simplification I changed the \"bottleneck\" identity block slightly\n                x_input = keras.layers.Conv2D(filters,(1,1),strides=(2,2),padding=\"same\", kernel_initializer=\"he_normal\", kernel_regularizer=l2(1e-4))(x_input)\n            else:\n                x = keras.layers.Conv2D(filters,(3,3),strides=1, padding=\"same\", kernel_initializer=\"he_normal\", kernel_regularizer=l2(1e-4))(x_input)\n            x = keras.layers.BatchNormalization()(x)\n            x = keras.layers.Activation(\"relu\")(x)\n            x = keras.layers.Conv2D(filters,(3,3),strides=1,padding=\"same\", kernel_initializer=\"he_normal\", kernel_regularizer=l2(1e-4))(x)\n            x = keras.layers.BatchNormalization()(x)\n            x = keras.layers.Activation(\"relu\")(x)\n            x_input = keras.layers.add([x, x_input])\n    return x_input","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:38:23.640095Z","iopub.execute_input":"2022-08-03T18:38:23.641845Z","iopub.status.idle":"2022-08-03T18:38:23.655000Z","shell.execute_reply.started":"2022-08-03T18:38:23.641782Z","shell.execute_reply":"2022-08-03T18:38:23.653024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = keras.Input(shape=(32,32,3))\nx = keras.layers.Rescaling(1./255)(inputs)\nx = keras.layers.ZeroPadding2D((4,4))(x)\nx = keras.layers.RandomCrop(32,32)(x)\nx = keras.layers.RandomFlip(\"horizontal\")(x)\nx = keras.layers.Conv2D(16,(3,3),padding=\"same\", activation=\"relu\", kernel_initializer=\"he_normal\", kernel_regularizer=l2(1e-4))(inputs)\nx = keras.layers.BatchNormalization()(x)\nx = keras.layers.Activation(\"relu\")(x)\nx = conv_layer(x, 9)\nx = keras.layers.GlobalAveragePooling2D()(x)\nx = keras.layers.Flatten()(x)\noutput = keras.layers.Dense(10, activation=\"softmax\", kernel_initializer=\"he_normal\")(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:38:26.971070Z","iopub.execute_input":"2022-08-03T18:38:26.972571Z","iopub.status.idle":"2022-08-03T18:38:28.697702Z","shell.execute_reply.started":"2022-08-03T18:38:26.972487Z","shell.execute_reply":"2022-08-03T18:38:28.696443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.Model(inputs=inputs, outputs=output, name=\"Resnet\")\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:41:31.415339Z","iopub.execute_input":"2022-08-03T18:41:31.415780Z","iopub.status.idle":"2022-08-03T18:41:31.486508Z","shell.execute_reply.started":"2022-08-03T18:41:31.415745Z","shell.execute_reply":"2022-08-03T18:41:31.485019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=\"adam\", loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:41:39.969193Z","iopub.execute_input":"2022-08-03T18:41:39.969733Z","iopub.status.idle":"2022-08-03T18:41:39.989591Z","shell.execute_reply.started":"2022-08-03T18:41:39.969693Z","shell.execute_reply":"2022-08-03T18:41:39.988327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(data_train, batch_size=128, epochs=10, validation_data=data_test)","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-08-03T18:41:41.934274Z","iopub.execute_input":"2022-08-03T18:41:41.935628Z","iopub.status.idle":"2022-08-03T18:41:56.091607Z","shell.execute_reply.started":"2022-08-03T18:41:41.935561Z","shell.execute_reply":"2022-08-03T18:41:56.089908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(history.history[\"accuracy\"], label = 'Train Accuracy')\nplt.plot(history.history[\"val_accuracy\"], linestyle = 'dashed', label = 'Test Accuracy')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-03T18:30:36.243909Z","iopub.execute_input":"2022-08-03T18:30:36.245307Z","iopub.status.idle":"2022-08-03T18:30:36.497116Z","shell.execute_reply.started":"2022-08-03T18:30:36.245248Z","shell.execute_reply":"2022-08-03T18:30:36.495451Z"},"trusted":true},"execution_count":null,"outputs":[]}]}