{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":67771835,"sourceType":"kernelVersion"},{"sourceId":140376581,"sourceType":"kernelVersion"}],"dockerImageVersionId":30747,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 1. Imports","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom PIL import Image\nimport numpy as np\nfrom tensorflow.keras import datasets\nfrom keras.utils import to_categorical\nfrom tensorflow.keras import layers, models, regularizers\nfrom tensorflow.keras import Sequential, layers\nfrom tensorflow.keras.callbacks import LearningRateScheduler\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport tensorflow as tf\n\n","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:25.120327Z","iopub.execute_input":"2024-07-12T03:57:25.120656Z","iopub.status.idle":"2024-07-12T03:57:37.323986Z","shell.execute_reply.started":"2024-07-12T03:57:25.120629Z","shell.execute_reply":"2024-07-12T03:57:37.322965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. Load Dataset","metadata":{}},{"cell_type":"code","source":"(x_train, y_train), (x_test, y_test) = datasets.cifar10.load_data()\n\nprint(\"{} train samples and {} test samples\\n\".format(len(x_train), len(x_test)))\nprint(\"train samples shape:\", x_train.shape)\nprint(\"train labels shape:\", y_train.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:37.325684Z","iopub.execute_input":"2024-07-12T03:57:37.326246Z","iopub.status.idle":"2024-07-12T03:57:46.317342Z","shell.execute_reply.started":"2024-07-12T03:57:37.326218Z","shell.execute_reply":"2024-07-12T03:57:46.316418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. Map Class Number to Class Name","metadata":{}},{"cell_type":"code","source":"class_names = {\n    0: 'airplane',\n    1: 'automobile',\n    2: 'bird',\n    3: 'cat',\n    4: 'deer',\n    5: 'dog',\n    6: 'frog',\n    7: 'horse',\n    8: 'ship',\n    9: 'truck',\n}","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:46.322253Z","iopub.execute_input":"2024-07-12T03:57:46.322528Z","iopub.status.idle":"2024-07-12T03:57:46.327285Z","shell.execute_reply.started":"2024-07-12T03:57:46.322504Z","shell.execute_reply":"2024-07-12T03:57:46.326420Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4. Plot Samples Along with Their Class Names","metadata":{}},{"cell_type":"code","source":"# select a random set of 9 images\nidx = np.random.randint(len(x_train) - 9)\n\nplt.figure(figsize=(10,10))\nfor i in range(9):\n    # plot each sample\n    plt.subplot(3, 3, i+1)   \n    plt.imshow(x_train[i + idx]) \n    plt.xlabel(class_names[(y_train[i + idx][0])])\n\n# display results\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:46.328548Z","iopub.execute_input":"2024-07-12T03:57:46.329184Z","iopub.status.idle":"2024-07-12T03:57:47.580897Z","shell.execute_reply.started":"2024-07-12T03:57:46.329160Z","shell.execute_reply":"2024-07-12T03:57:47.579968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5. Normalize Samples","metadata":{}},{"cell_type":"code","source":"# pixel values before normalization\nprint(\"before normalization:\\n\", x_train[0][0][0])\n\n# normalize pixel values\nx_train = x_train / 255.\nx_test = x_test / 255.\n# pixel values after normalization\nprint(\"after normalization:\\n\", x_train[0][0][0])","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:47.582180Z","iopub.execute_input":"2024-07-12T03:57:47.582563Z","iopub.status.idle":"2024-07-12T03:57:48.037388Z","shell.execute_reply.started":"2024-07-12T03:57:47.582528Z","shell.execute_reply":"2024-07-12T03:57:48.036499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 6. One Hot Encode Labels","metadata":{}},{"cell_type":"code","source":"# one hot encode labels\ny_train = to_categorical(y_train)\ny_test = to_categorical(y_test)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:48.038764Z","iopub.execute_input":"2024-07-12T03:57:48.039249Z","iopub.status.idle":"2024-07-12T03:57:48.050895Z","shell.execute_reply.started":"2024-07-12T03:57:48.039212Z","shell.execute_reply":"2024-07-12T03:57:48.050184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 7. Make Model Architecture","metadata":{}},{"cell_type":"code","source":"def build_model():\n    model = models.Sequential()\n    model.add(layers.Conv2D(128, 3, activation='relu', padding='same', input_shape=(32, 32, 3),\n                            kernel_regularizer=regularizers.l2(0.001)))\n    model.add(layers.MaxPooling2D(pool_size=(2,2)))\n    \n    model.add(layers.Conv2D(128, 3, activation='relu', padding='same',\n                            kernel_regularizer=regularizers.l2(0.001)))\n    model.add(layers.MaxPooling2D(pool_size=(2,2)))\n    \n    model.add(layers.Flatten())\n    model.add(layers.Dense(128, activation='relu',\n                           kernel_regularizer=regularizers.l2(0.001)))\n    model.add(layers.Dropout(0.5)) \n    \n    model.add(layers.Dense(10, activation='softmax'))\n    optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)\n    model.compile(optimizer=optimizer,\n                  loss='categorical_crossentropy',\n                  metrics=['accuracy'])\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:48.052049Z","iopub.execute_input":"2024-07-12T03:57:48.052406Z","iopub.status.idle":"2024-07-12T03:57:48.061836Z","shell.execute_reply.started":"2024-07-12T03:57:48.052371Z","shell.execute_reply":"2024-07-12T03:57:48.060857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create model\nmodel = build_model()\n# see model details\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:48.063117Z","iopub.execute_input":"2024-07-12T03:57:48.063454Z","iopub.status.idle":"2024-07-12T03:57:48.800719Z","shell.execute_reply.started":"2024-07-12T03:57:48.063428Z","shell.execute_reply":"2024-07-12T03:57:48.799795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 8. Train Model\n\n### 8.1 Perform Training","metadata":{}},{"cell_type":"code","source":"%%time\n# train model\nearly_stopping = EarlyStopping(monitor='val_loss', patience=15, restore_best_weights=True)\n\neval_set = (x_test, y_test)\n\nhistory = model.fit(x_train, y_train,validation_data=eval_set, epochs=40,callbacks=[early_stopping])","metadata":{"execution":{"iopub.status.busy":"2024-07-12T03:57:48.804374Z","iopub.execute_input":"2024-07-12T03:57:48.805041Z","iopub.status.idle":"2024-07-12T04:01:39.130298Z","shell.execute_reply.started":"2024-07-12T03:57:48.805005Z","shell.execute_reply":"2024-07-12T04:01:39.129252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# save model to file\nmodel.save('baseline.keras')","metadata":{"execution":{"iopub.status.busy":"2024-07-12T04:01:39.131502Z","iopub.execute_input":"2024-07-12T04:01:39.131799Z","iopub.status.idle":"2024-07-12T04:01:39.230162Z","shell.execute_reply.started":"2024-07-12T04:01:39.131773Z","shell.execute_reply":"2024-07-12T04:01:39.229155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 8.2 Plot Training Results","metadata":{}},{"cell_type":"code","source":"fig, axis = plt.subplots(1, 2, figsize=(10,4)) \n# plot accuracy\naxis[0].plot(history.history[\"accuracy\"])\naxis[0].plot(history.history[\"val_accuracy\"])\n\n\naxis[0].set_title(\"accuracy over epochs\")\n# plot loss\naxis[1].plot(history.history[\"loss\"])\naxis[1].plot(history.history[\"val_loss\"])\n\naxis[1].set_title(\"loss over epochs\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-12T04:01:39.231467Z","iopub.execute_input":"2024-07-12T04:01:39.231769Z","iopub.status.idle":"2024-07-12T04:01:39.635159Z","shell.execute_reply.started":"2024-07-12T04:01:39.231743Z","shell.execute_reply":"2024-07-12T04:01:39.634280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9. Test Model\n\n### 9.1 Evaluation on Test Set","metadata":{}},{"cell_type":"markdown","source":"### 9.2 Fetch Predictions for Every Sample","metadata":{}},{"cell_type":"code","source":"predictions = model.predict(x_test)\n\nprint(\"\\nprediction probabilities per class:\\n\", predictions[0])\n\nprint(\"\\npredicted class:\", np.argmax(predictions[0]))\n\nprint(\"actual class:\", np.argmax(y_test[0]))\n\nprint(\"predicted class name:\", class_names[np.argmax(predictions[0])])\n\nprint(\"actual class name:\", class_names[np.argmax(y_test[0])])","metadata":{"execution":{"iopub.status.busy":"2024-07-12T04:01:39.636386Z","iopub.execute_input":"2024-07-12T04:01:39.637291Z","iopub.status.idle":"2024-07-12T04:01:41.300128Z","shell.execute_reply.started":"2024-07-12T04:01:39.637256Z","shell.execute_reply":"2024-07-12T04:01:41.299056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 9.3 Plot Predictions","metadata":{}},{"cell_type":"code","source":"# select a random set of 9 test images\nidx = np.random.randint(len(x_test) - 9)\n\nplt.figure(figsize=(10,10))\nfor i in range(9):\n    # plot each test image along with its prediction\n    plt.subplot(3, 3, i+1)   \n    plt.imshow(x_test[i + idx]) \n    plt.xlabel(\"pred: {} | actual: {}\\n\".format(class_names[np.argmax(predictions[i + idx])], class_names[np.argmax(y_test[i + idx])]))\n\n# display results\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-12T04:01:41.301277Z","iopub.execute_input":"2024-07-12T04:01:41.301582Z","iopub.status.idle":"2024-07-12T04:01:42.547781Z","shell.execute_reply.started":"2024-07-12T04:01:41.301555Z","shell.execute_reply":"2024-07-12T04:01:42.546849Z"},"trusted":true},"execution_count":null,"outputs":[]}]}