{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from keras.datasets import cifar10\n", "from keras.utils import to_categorical\n", "\n", "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n", "\n", "# Normalize pixel values\n", "x_train = x_train.astype('float32') / 255.0\n", "x_test = x_test.astype('float32') / 255.0\n", "\n", "# One-hot encode the labels\n", "y_train = to_categorical(y_train, num_classes=10)\n", "y_test = to_categorical(y_test, num_classes=10)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\n", "\n", "model = Sequential()\n", "model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)))\n", "model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))\n", "model.add(MaxPooling2D((2, 2)))\n", "model.add(Dropout(0.25))\n", "\n", "model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\n", "model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\n", "model.add(MaxPooling2D((2, 2)))\n", "model.add(Dropout(0.25))\n", "\n", "model.add(Flatten())\n", "model.add(Dense(512, activation='relu'))\n", "model.add(Dropout(0.5))\n", "model.add(Dense(10, activation='softmax'))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss='categorical_crossentropy',\n", " metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "352/352 [==============================] - 69s 195ms/step - loss: 1.6485 - accuracy: 0.3958 - val_loss: 1.2859 - val_accuracy: 0.5282\n", "Epoch 2/50\n", "352/352 [==============================] - 68s 193ms/step - loss: 1.2111 - accuracy: 0.5655 - val_loss: 0.9605 - val_accuracy: 0.6640\n", "Epoch 3/50\n", "352/352 [==============================] - 73s 208ms/step - loss: 1.0086 - accuracy: 0.6435 - val_loss: 0.8589 - val_accuracy: 0.6952\n", "Epoch 4/50\n", "352/352 [==============================] - 101s 288ms/step - loss: 0.8924 - accuracy: 0.6857 - val_loss: 0.7665 - val_accuracy: 0.7336\n", "Epoch 5/50\n", "352/352 [==============================] - 69s 197ms/step - loss: 0.8080 - accuracy: 0.7136 - val_loss: 0.7567 - val_accuracy: 0.7392\n", "Epoch 6/50\n", "352/352 [==============================] - 69s 197ms/step - loss: 0.7429 - accuracy: 0.7398 - val_loss: 0.6749 - val_accuracy: 0.7666\n", "Epoch 7/50\n", "352/352 [==============================] - 71s 202ms/step - loss: 0.6849 - accuracy: 0.7584 - val_loss: 0.7045 - val_accuracy: 0.7512\n", "Epoch 8/50\n", "352/352 [==============================] - 75s 214ms/step - loss: 0.6489 - accuracy: 0.7703 - val_loss: 0.6511 - val_accuracy: 0.7778\n", "Epoch 9/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.6011 - accuracy: 0.7880 - val_loss: 0.6165 - val_accuracy: 0.7866\n", "Epoch 10/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.5679 - accuracy: 0.8005 - val_loss: 0.6104 - val_accuracy: 0.7870\n", "Epoch 11/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.5338 - accuracy: 0.8103 - val_loss: 0.6394 - val_accuracy: 0.7878\n", "Epoch 12/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.5041 - accuracy: 0.8208 - val_loss: 0.5970 - val_accuracy: 0.7942\n", "Epoch 13/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.4798 - accuracy: 0.8284 - val_loss: 0.5972 - val_accuracy: 0.8032\n", "Epoch 14/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.4508 - accuracy: 0.8380 - val_loss: 0.5943 - val_accuracy: 0.8000\n", "Epoch 15/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.4290 - accuracy: 0.8470 - val_loss: 0.6002 - val_accuracy: 0.8002\n", "Epoch 16/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.4112 - accuracy: 0.8536 - val_loss: 0.6042 - val_accuracy: 0.8038\n", "Epoch 17/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3918 - accuracy: 0.8590 - val_loss: 0.6220 - val_accuracy: 0.7956\n", "Epoch 18/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3798 - accuracy: 0.8650 - val_loss: 0.6229 - val_accuracy: 0.8052\n", "Epoch 19/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3636 - accuracy: 0.8699 - val_loss: 0.6045 - val_accuracy: 0.8090\n", "Epoch 20/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3456 - accuracy: 0.8763 - val_loss: 0.6035 - val_accuracy: 0.8086\n", "Epoch 21/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3341 - accuracy: 0.8798 - val_loss: 0.6066 - val_accuracy: 0.8118\n", "Epoch 22/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.3196 - accuracy: 0.8854 - val_loss: 0.6200 - val_accuracy: 0.8054\n", "Epoch 23/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.3076 - accuracy: 0.8889 - val_loss: 0.6121 - val_accuracy: 0.8036\n", "Epoch 24/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.3041 - accuracy: 0.8927 - val_loss: 0.6166 - val_accuracy: 0.8058\n", "Epoch 25/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2892 - accuracy: 0.8978 - val_loss: 0.6202 - val_accuracy: 0.8082\n", "Epoch 26/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2808 - accuracy: 0.8987 - val_loss: 0.6370 - val_accuracy: 0.8126\n", "Epoch 27/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2791 - accuracy: 0.9014 - val_loss: 0.6416 - val_accuracy: 0.8132\n", "Epoch 28/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2661 - accuracy: 0.9062 - val_loss: 0.6206 - val_accuracy: 0.8070\n", "Epoch 29/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2627 - accuracy: 0.9073 - val_loss: 0.6165 - val_accuracy: 0.8148\n", "Epoch 30/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2551 - accuracy: 0.9108 - val_loss: 0.6796 - val_accuracy: 0.8084\n", "Epoch 31/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2521 - accuracy: 0.9110 - val_loss: 0.6634 - val_accuracy: 0.8148\n", "Epoch 32/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2434 - accuracy: 0.9137 - val_loss: 0.6582 - val_accuracy: 0.8082\n", "Epoch 33/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2403 - accuracy: 0.9138 - val_loss: 0.6734 - val_accuracy: 0.8084\n", "Epoch 34/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2346 - accuracy: 0.9172 - val_loss: 0.6654 - val_accuracy: 0.8066\n", "Epoch 35/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2287 - accuracy: 0.9198 - val_loss: 0.6993 - val_accuracy: 0.8088\n", "Epoch 36/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2340 - accuracy: 0.9176 - val_loss: 0.6680 - val_accuracy: 0.8082\n", "Epoch 37/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2196 - accuracy: 0.9228 - val_loss: 0.6933 - val_accuracy: 0.8144\n", "Epoch 38/50\n", "352/352 [==============================] - 76s 216ms/step - loss: 0.2199 - accuracy: 0.9228 - val_loss: 0.6392 - val_accuracy: 0.8126\n", "Epoch 39/50\n", "352/352 [==============================] - 76s 215ms/step - loss: 0.2190 - accuracy: 0.9236 - val_loss: 0.6644 - val_accuracy: 0.8172\n", "Epoch 40/50\n", "352/352 [==============================] - 77s 220ms/step - loss: 0.2114 - accuracy: 0.9254 - val_loss: 0.6753 - val_accuracy: 0.8140\n", "Epoch 41/50\n", "352/352 [==============================] - 74s 210ms/step - loss: 0.2058 - accuracy: 0.9286 - val_loss: 0.6879 - val_accuracy: 0.8130\n", "Epoch 42/50\n", "352/352 [==============================] - 73s 208ms/step - loss: 0.2038 - accuracy: 0.9280 - val_loss: 0.6891 - val_accuracy: 0.8178\n", "Epoch 43/50\n", "352/352 [==============================] - 75s 214ms/step - loss: 0.2085 - accuracy: 0.9265 - val_loss: 0.6986 - val_accuracy: 0.8160\n", "Epoch 44/50\n", "352/352 [==============================] - 77s 219ms/step - loss: 0.2026 - accuracy: 0.9286 - val_loss: 0.6906 - val_accuracy: 0.8046\n", "Epoch 45/50\n", "352/352 [==============================] - 104s 296ms/step - loss: 0.1975 - accuracy: 0.9297 - val_loss: 0.7136 - val_accuracy: 0.8130\n", "Epoch 46/50\n", "352/352 [==============================] - 72s 205ms/step - loss: 0.2015 - accuracy: 0.9296 - val_loss: 0.6834 - val_accuracy: 0.8092\n", "Epoch 47/50\n", "352/352 [==============================] - 72s 205ms/step - loss: 0.1904 - accuracy: 0.9335 - val_loss: 0.6789 - val_accuracy: 0.8156\n", "Epoch 48/50\n", "352/352 [==============================] - 75s 212ms/step - loss: 0.1879 - accuracy: 0.9347 - val_loss: 0.7115 - val_accuracy: 0.8162\n", "Epoch 49/50\n", "352/352 [==============================] - 77s 218ms/step - loss: 0.1856 - accuracy: 0.9346 - val_loss: 0.7351 - val_accuracy: 0.8122\n", "Epoch 50/50\n", "352/352 [==============================] - 74s 211ms/step - loss: 0.1834 - accuracy: 0.9361 - val_loss: 0.7103 - val_accuracy: 0.8200\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch_size = 128\n", "epochs = 50\n", "\n", "model.fit(x_train, y_train,\n", " batch_size=batch_size,\n", " epochs=epochs,\n", " validation_split=0.1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test loss: 0.7982190847396851\n", "Test accuracy: 0.7968000173568726\n" ] } ], "source": [ "score = model.evaluate(x_test, y_test, verbose=0)\n", "print(f'Test loss: {score[0]}')\n", "print(f'Test accuracy: {score[1]}')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "390/390 [==============================] - 97s 247ms/step - loss: 0.9107 - accuracy: 0.6928 - val_loss: 0.6933 - val_accuracy: 0.7650\n", "Epoch 2/50\n", "390/390 [==============================] - 100s 257ms/step - loss: 0.8106 - accuracy: 0.7224 - val_loss: 0.6537 - val_accuracy: 0.7749\n", "Epoch 3/50\n", "390/390 [==============================] - 96s 246ms/step - loss: 0.7845 - accuracy: 0.7299 - val_loss: 0.6504 - val_accuracy: 0.7822\n", "Epoch 4/50\n", "390/390 [==============================] - 93s 237ms/step - loss: 0.7672 - accuracy: 0.7350 - val_loss: 0.6664 - val_accuracy: 0.7761\n", "Epoch 5/50\n", "390/390 [==============================] - 96s 246ms/step - loss: 0.7436 - accuracy: 0.7443 - val_loss: 0.6713 - val_accuracy: 0.7691\n", "Epoch 6/50\n", "390/390 [==============================] - 95s 242ms/step - loss: 0.7276 - accuracy: 0.7493 - val_loss: 0.6087 - val_accuracy: 0.7958\n", "Epoch 7/50\n", "390/390 [==============================] - 93s 238ms/step - loss: 0.7221 - accuracy: 0.7492 - val_loss: 0.6521 - val_accuracy: 0.7838\n", "Epoch 8/50\n", "390/390 [==============================] - 99s 253ms/step - loss: 0.7092 - accuracy: 0.7545 - val_loss: 0.6414 - val_accuracy: 0.7822\n", "Epoch 9/50\n", "390/390 [==============================] - 97s 249ms/step - loss: 0.6963 - accuracy: 0.7605 - val_loss: 0.5902 - val_accuracy: 0.7986\n", "Epoch 10/50\n", "390/390 [==============================] - 90s 231ms/step - loss: 0.6905 - accuracy: 0.7616 - val_loss: 0.6284 - val_accuracy: 0.7890\n", "Epoch 11/50\n", "390/390 [==============================] - 85s 217ms/step - loss: 0.6846 - accuracy: 0.7606 - val_loss: 0.5959 - val_accuracy: 0.8034\n", "Epoch 12/50\n", "390/390 [==============================] - 86s 221ms/step - loss: 0.6759 - accuracy: 0.7647 - val_loss: 0.6337 - val_accuracy: 0.7914\n", "Epoch 13/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.6675 - accuracy: 0.7686 - val_loss: 0.6242 - val_accuracy: 0.7947\n", "Epoch 14/50\n", "390/390 [==============================] - 91s 234ms/step - loss: 0.6705 - accuracy: 0.7676 - val_loss: 0.6022 - val_accuracy: 0.7946\n", "Epoch 15/50\n", "390/390 [==============================] - 88s 226ms/step - loss: 0.6559 - accuracy: 0.7724 - val_loss: 0.6387 - val_accuracy: 0.7818\n", "Epoch 16/50\n", "390/390 [==============================] - 88s 227ms/step - loss: 0.6446 - accuracy: 0.7756 - val_loss: 0.6323 - val_accuracy: 0.7935\n", "Epoch 17/50\n", "390/390 [==============================] - 88s 227ms/step - loss: 0.6514 - accuracy: 0.7748 - val_loss: 0.5713 - val_accuracy: 0.8084\n", "Epoch 18/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.6500 - accuracy: 0.7753 - val_loss: 0.6053 - val_accuracy: 0.7970\n", "Epoch 19/50\n", "390/390 [==============================] - 88s 226ms/step - loss: 0.6371 - accuracy: 0.7797 - val_loss: 0.5728 - val_accuracy: 0.8037\n", "Epoch 20/50\n", "390/390 [==============================] - 90s 230ms/step - loss: 0.6281 - accuracy: 0.7828 - val_loss: 0.5671 - val_accuracy: 0.8131\n", "Epoch 21/50\n", "390/390 [==============================] - 87s 222ms/step - loss: 0.6257 - accuracy: 0.7799 - val_loss: 0.5519 - val_accuracy: 0.8133\n", "Epoch 22/50\n", "390/390 [==============================] - 87s 223ms/step - loss: 0.6203 - accuracy: 0.7845 - val_loss: 0.5605 - val_accuracy: 0.8143\n", "Epoch 23/50\n", "390/390 [==============================] - 89s 229ms/step - loss: 0.6205 - accuracy: 0.7851 - val_loss: 0.5704 - val_accuracy: 0.8075\n", "Epoch 24/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.6113 - accuracy: 0.7870 - val_loss: 0.5804 - val_accuracy: 0.8053\n", "Epoch 25/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.6066 - accuracy: 0.7885 - val_loss: 0.5350 - val_accuracy: 0.8210\n", "Epoch 26/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.6116 - accuracy: 0.7879 - val_loss: 0.5985 - val_accuracy: 0.8009\n", "Epoch 27/50\n", "390/390 [==============================] - 88s 227ms/step - loss: 0.6057 - accuracy: 0.7903 - val_loss: 0.5751 - val_accuracy: 0.8096\n", "Epoch 28/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.6032 - accuracy: 0.7922 - val_loss: 0.5915 - val_accuracy: 0.8031\n", "Epoch 29/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.6055 - accuracy: 0.7878 - val_loss: 0.6113 - val_accuracy: 0.8034\n", "Epoch 30/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5959 - accuracy: 0.7921 - val_loss: 0.5415 - val_accuracy: 0.8230\n", "Epoch 31/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5904 - accuracy: 0.7971 - val_loss: 0.5385 - val_accuracy: 0.8208\n", "Epoch 32/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5876 - accuracy: 0.7952 - val_loss: 0.5533 - val_accuracy: 0.8160\n", "Epoch 33/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5902 - accuracy: 0.7945 - val_loss: 0.5819 - val_accuracy: 0.8108\n", "Epoch 34/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5878 - accuracy: 0.7952 - val_loss: 0.5956 - val_accuracy: 0.8055\n", "Epoch 35/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5837 - accuracy: 0.7982 - val_loss: 0.5445 - val_accuracy: 0.8203\n", "Epoch 36/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5773 - accuracy: 0.7998 - val_loss: 0.5764 - val_accuracy: 0.8081\n", "Epoch 37/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5763 - accuracy: 0.7982 - val_loss: 0.5113 - val_accuracy: 0.8290\n", "Epoch 38/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5695 - accuracy: 0.8028 - val_loss: 0.5255 - val_accuracy: 0.8279\n", "Epoch 39/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5743 - accuracy: 0.8021 - val_loss: 0.5300 - val_accuracy: 0.8269\n", "Epoch 40/50\n", "390/390 [==============================] - 89s 229ms/step - loss: 0.5691 - accuracy: 0.8035 - val_loss: 0.5385 - val_accuracy: 0.8244\n", "Epoch 41/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5675 - accuracy: 0.8013 - val_loss: 0.5401 - val_accuracy: 0.8199\n", "Epoch 42/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5690 - accuracy: 0.8019 - val_loss: 0.5816 - val_accuracy: 0.8117\n", "Epoch 43/50\n", "390/390 [==============================] - 89s 227ms/step - loss: 0.5611 - accuracy: 0.8069 - val_loss: 0.5632 - val_accuracy: 0.8143\n", "Epoch 44/50\n", "390/390 [==============================] - 89s 228ms/step - loss: 0.5647 - accuracy: 0.8025 - val_loss: 0.5038 - val_accuracy: 0.8345\n", "Epoch 45/50\n", "390/390 [==============================] - 88s 227ms/step - loss: 0.5617 - accuracy: 0.8048 - val_loss: 0.5606 - val_accuracy: 0.8207\n", "Epoch 46/50\n", "390/390 [==============================] - 88s 226ms/step - loss: 0.5575 - accuracy: 0.8044 - val_loss: 0.6000 - val_accuracy: 0.8049\n", "Epoch 47/50\n", "390/390 [==============================] - 88s 227ms/step - loss: 0.5603 - accuracy: 0.8076 - val_loss: 0.5683 - val_accuracy: 0.8095\n", "Epoch 48/50\n", "390/390 [==============================] - 82s 211ms/step - loss: 0.5580 - accuracy: 0.8070 - val_loss: 0.5356 - val_accuracy: 0.8258\n", "Epoch 49/50\n", "390/390 [==============================] - 84s 215ms/step - loss: 0.5531 - accuracy: 0.8088 - val_loss: 0.5358 - val_accuracy: 0.8207\n", "Epoch 50/50\n", "390/390 [==============================] - 88s 226ms/step - loss: 0.5531 - accuracy: 0.8101 - val_loss: 0.5430 - val_accuracy: 0.8236\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Optimize the model\n", "from keras.preprocessing.image import ImageDataGenerator\n", "\n", "datagen = ImageDataGenerator(\n", " rotation_range=15,\n", " width_shift_range=0.1,\n", " height_shift_range=0.1,\n", " horizontal_flip=True\n", ")\n", "\n", "datagen.fit(x_train)\n", "\n", "model.fit(datagen.flow(x_train, y_train, batch_size=batch_size),\n", " steps_per_epoch=len(x_train) // batch_size,\n", " epochs=epochs,\n", " validation_data=(x_test, y_test))\n", " " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test loss: 0.5430349111557007\n", "Test accuracy: 0.8235999941825867\n" ] } ], "source": [ "# Evaluate the model again\n", "score = model.evaluate(x_test, y_test, verbose=0)\n", "print(f'Test loss: {score[0]}')\n", "print(f'Test accuracy: {score[1]}')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Save model\n", "model.save('cifar10_cnn.keras')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1/1 [==============================] - 0s 99ms/step\n", "The model predicted the image as: ship\n" ] }, { "data": { "image/png": "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228fd9+XvvQl95d/+ZeBZjTx7r//frd06dLQ05g0ktwzzzwz9u9KpeKamprcAw88MHbf6Oioq6urc3/3d38XYIYT45Pb6Zxza9ascTfeeGOQ+UyW3t5eJ8lt377dOTdz1/OT2+nczFxP55ybM2eO+8d//MfPfS2n/JVQoVDQ66+/rvb29nH3t7e3a+fOnYFmNTn279+vlpYWtbW16dvf/rbee++90FOaNAcOHFBPT8+4dU2n07r66qtn3LpK0rZt29TQ0KDFixfrtttuU29vb+gpnZX+/n5JUn19vaSZu56f3M4TZtJ6lstlbdmyRUNDQ1qxYsXnvpZTvgkdOXJE5XJZjY2N4+5vbGxUT09PoFlNvOXLl+vxxx/XSy+9pJ/85Cfq6enRypUr1dfXF3pqk+LE2s30dZWkjo4OPfHEE3rllVf00EMPaffu3br22muVz+dDT+2MOOe0bt06XXnllVqyZImkmbmep9pOaeas5969e1VbW6t0Oq3bb79dzzzzjC666KLPfS2nXIr2p/nkl5c550xfaDbVdXR0jP33JZdcohUrVuiLX/yiHnvsMa1bty7gzCbXTF9XSbr55pvH/nvJkiVatmyZWltb9fzzz2v16tUBZ3Zm7rrrLr311lt67bXXTnpsJq3np23nTFnPCy+8UG+++aaOHz+uf/mXf9GaNWu0ffv2scc/r7Wc8ldCc+fOVTweP6kD9/b2ntSpZ5Kamhpdcskl2r9/f+ipTIoT7/w719ZVkpqbm9Xa2jot1/buu+/Wc889p1dffXXcV67MtPX8tO08lem6nqlUShdccIGWLVumrq4uLV26VD/+8Y8/97Wc8k0olUrpsssu09atW8fdv3XrVq1cuTLQrCZfPp/XO++8o+bm5tBTmRRtbW1qamoat66FQkHbt2+f0esqSX19feru7p5Wa+uc01133aWnn35ar7zyitra2sY9PlPW87O281Sm43qeinNO+Xz+81/LCX+rwyTYsmWLSyaT7qc//al7++233dq1a11NTY17//33Q09twvzwhz9027Ztc++9957btWuX+9M//VOXzWan9TYODAy4N954w73xxhtOktu4caN744033G9+8xvnnHMPPPCAq6urc08//bTbu3ev+853vuOam5tdLpcLPHOb023nwMCA++EPf+h27tzpDhw44F599VW3YsUKd/7550+r7fzBD37g6urq3LZt29zhw4fHbsPDw2M1M2E9P2s7Z8p6rl+/3u3YscMdOHDAvfXWW+7ee+91sVjMvfzyy865z3ctp0UTcs65v/3bv3Wtra0ulUq5P/zDPxz3lsmZ4Oabb3bNzc0umUy6lpYWt3r1ardv377Q0zorr776qpN00m3NmjXOuY/f1nv//fe7pqYml06n3VVXXeX27t0bdtJn4HTbOTw87Nrb2928efNcMpl0CxcudGvWrHEHDx4MPW2TU22fJPfoo4+O1cyE9fys7Zwp6/lnf/ZnY8+n8+bNc3/0R3801oCc+3zXkq9yAAAEM+VfEwIAzFw0IQBAMDQhAEAwNCEAQDA0IQBAMDQhAEAwNCEAQDA0IQBAMDQhAEAwNCEAQDA0IQBAMDQhAEAw/x/1q5GfGsoNkwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Choose image from testing set and predict the label\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Define the labels of the dataset\n", "labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']\n", "\n", "# Choose a random image from the test set\n", "index = np.random.randint(0, x_test.shape[0])\n", "img = x_test[index]\n", "\n", "# Display the image\n", "plt.imshow(img)\n", "\n", "# Add a dimension to the image so that it can be passed to the model\n", "img = np.expand_dims(img, axis=0)\n", "\n", "# Get the model prediction\n", "predicted_label = model.predict(img)\n", "predicted_label = labels[np.argmax(predicted_label)]\n", "print(f'The model predicted the image as: {predicted_label}')" ] } ], "metadata": { "kernelspec": { "display_name": "ml", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }