{"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":"# Import Libraries","metadata":{"id":"vXUed3x_ROCm"}},{"cell_type":"markdown","source":"\n## Install TensorFlow 2\n","metadata":{"id":"3iIKvXgjjCn-"}},{"cell_type":"code","source":"!pip install tensorflow-gpu -q","metadata":{"execution":{"iopub.status.busy":"2021-08-23T13:59:43.984929Z","iopub.execute_input":"2021-08-23T13:59:43.985458Z","iopub.status.idle":"2021-08-23T14:02:14.879335Z","shell.execute_reply.started":"2021-08-23T13:59:43.985411Z","shell.execute_reply":"2021-08-23T14:02:14.878049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\ntf.__version__","metadata":{"id":"NOPPPUZXi5EX","outputId":"910e46e1-0c69-4484-ad12-f3a7dd719b59","execution":{"iopub.status.busy":"2021-08-23T14:02:14.88149Z","iopub.execute_input":"2021-08-23T14:02:14.882008Z","iopub.status.idle":"2021-08-23T14:02:21.750658Z","shell.execute_reply.started":"2021-08-23T14:02:14.881967Z","shell.execute_reply":"2021-08-23T14:02:21.749691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n## Import other libraries\n","metadata":{"id":"QCtpZMqgVevt"}},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport cv2 as cv\n\nnp.set_printoptions(precision=7)\n%matplotlib inline\n\nimport tensorflow_datasets as tfds\n\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nfrom collections import Counter\nfrom tensorflow.keras.utils import to_categorical, plot_model\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.preprocessing import image\n\nfrom PIL import Image","metadata":{"id":"JLQflrey92oM","execution":{"iopub.status.busy":"2021-08-23T14:02:21.752307Z","iopub.execute_input":"2021-08-23T14:02:21.752664Z","iopub.status.idle":"2021-08-23T14:02:23.009402Z","shell.execute_reply.started":"2021-08-23T14:02:21.752631Z","shell.execute_reply":"2021-08-23T14:02:23.008259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create Directory for Dataset","metadata":{"id":"WudbjGbRKtkm"}},{"cell_type":"code","source":"import os\nimport errno\n\n\ntry:\n    data_dir = 'dataset'\n    os.mkdir(data_dir)\nexcept OSError as e:\n    if e.errno == errno.EEXIST:\n        print('Directory  created.')\n    else:\n        raise","metadata":{"id":"Cse5dJMVKhtC","execution":{"iopub.status.busy":"2021-08-23T14:02:23.010701Z","iopub.execute_input":"2021-08-23T14:02:23.011028Z","iopub.status.idle":"2021-08-23T14:02:23.020504Z","shell.execute_reply.started":"2021-08-23T14:02:23.010995Z","shell.execute_reply":"2021-08-23T14:02:23.019338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n# TFDS Datasets\n","metadata":{"id":"zmQ7qknjMxn3"}},{"cell_type":"markdown","source":"## Choose Dataset Cifar10","metadata":{"id":"2dZdD1gGK2Oe"}},{"cell_type":"code","source":"dataset_name = \"cifar10\"\n","metadata":{"id":"ij2opdRk-ewl","execution":{"iopub.status.busy":"2021-08-23T14:02:23.02444Z","iopub.execute_input":"2021-08-23T14:02:23.024826Z","iopub.status.idle":"2021-08-23T14:02:23.035971Z","shell.execute_reply.started":"2021-08-23T14:02:23.02479Z","shell.execute_reply":"2021-08-23T14:02:23.035057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n## Download Dataset\n","metadata":{"id":"QfO4wRKVJLmA"}},{"cell_type":"code","source":"(train_set, test_set), dataset_info =  tfds.load( \n              name=dataset_name, \n              split=[\"train\", \"test\"], \n              with_info=True, \n              data_dir=data_dir\n          )","metadata":{"id":"OxUXKmEY-Ol_","execution":{"iopub.status.busy":"2021-08-23T14:02:23.038685Z","iopub.execute_input":"2021-08-23T14:02:23.039191Z","iopub.status.idle":"2021-08-23T14:03:43.938156Z","shell.execute_reply.started":"2021-08-23T14:02:23.039148Z","shell.execute_reply":"2021-08-23T14:03:43.933263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dataset Information","metadata":{"id":"TQ3bpnBXLINW"}},{"cell_type":"code","source":"print(dataset_info)","metadata":{"id":"36i05Arn-OjO","outputId":"e33ca675-c795-47a3-bd1a-67a6a690d1fb","execution":{"iopub.status.busy":"2021-08-23T14:03:43.93945Z","iopub.status.idle":"2021-08-23T14:03:43.940192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Detailed Information","metadata":{"id":"708VwPzwM_HP"}},{"cell_type":"code","source":"class_names =  dataset_info.features[\"label\"].names\n\nprint('image shape    :', dataset_info.features['image'].shape)\nprint('image dtype    :', dataset_info.features['image'].dtype)\nprint()\nprint('num class      : ',dataset_info.features[\"label\"].num_classes)\nprint('class label    :', dataset_info.features[\"label\"].names)\nprint()\nprint('num train data :', dataset_info.splits[\"train\"].num_examples)\nprint('num test data  :', dataset_info.splits[\"test\"].num_examples)","metadata":{"id":"lnLcUXJ4LNm4","outputId":"538e6852-95ef-4efc-a563-3cbc1789acf7","execution":{"iopub.status.busy":"2021-08-23T14:03:43.941851Z","iopub.status.idle":"2021-08-23T14:03:43.942411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Show Images","metadata":{"id":"MPNr62rbMEQg"}},{"cell_type":"code","source":"fig = tfds.show_examples(train_set, dataset_info)","metadata":{"id":"DQ26eh1bK4FL","outputId":"3ccfe12c-6805-48ae-be44-9fad6e1c4e08","execution":{"iopub.status.busy":"2021-08-23T14:03:43.943833Z","iopub.status.idle":"2021-08-23T14:03:43.944358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocess Image\n\nConvert and Resize Dataset to Numpy","metadata":{"id":"-g-uvLzaOFex"}},{"cell_type":"code","source":"input_shape = (80, 80, 3)","metadata":{"id":"6CtwzB8aOJ1o","execution":{"iopub.status.busy":"2021-08-23T14:03:43.945396Z","iopub.status.idle":"2021-08-23T14:03:43.945901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Convert Data Train","metadata":{"id":"OvpUB5orPMxG"}},{"cell_type":"code","source":"X_train = []\ny_train = []\n\nfor example in tfds.as_numpy(train_set):\n    new_img = example['image']\n    new_img = cv.resize(new_img, input_shape[:2],interpolation = cv.INTER_AREA) \n    X_train.append(new_img)\n    y_train.append(example['label'])\n\ndel train_set","metadata":{"id":"R4oDsNX3DvgI","execution":{"iopub.status.busy":"2021-08-23T14:03:43.947003Z","iopub.status.idle":"2021-08-23T14:03:43.947506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = np.asarray(X_train)\ny_train = np.asarray(y_train)\n\nprint('X_train.shape =',X_train.shape)\nprint('y_train.shape =',y_train.shape)","metadata":{"id":"k7otV0KuO1ai","outputId":"be2d3f8f-1404-4b88-b37b-308eabc40275","execution":{"iopub.status.busy":"2021-08-23T14:03:43.948759Z","iopub.status.idle":"2021-08-23T14:03:43.949279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Convert Data Test","metadata":{"id":"iBom4ufgPKpw"}},{"cell_type":"code","source":"X_test = []\ny_test = []\n\nfor example in tfds.as_numpy(test_set):\n    new_img = example['image']\n    new_img = cv.resize(new_img, input_shape[:2],interpolation = cv.INTER_AREA) \n    X_test.append(new_img)\n    y_test.append(example['label'])\n\ndel test_set","metadata":{"id":"Wa7NxpiIO9oA","execution":{"iopub.status.busy":"2021-08-23T14:03:43.950211Z","iopub.status.idle":"2021-08-23T14:03:43.950664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = np.asarray(X_test)\ny_test = np.asarray(y_test)\n\nprint('X_test.shape =',X_test.shape)\nprint('y_test.shape =',y_test.shape)","metadata":{"id":"q9yUF0PnO9oG","outputId":"898dde67-c09b-481a-aadd-4c264fe4fb40","execution":{"iopub.status.busy":"2021-08-23T14:03:43.951532Z","iopub.status.idle":"2021-08-23T14:03:43.951998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Split Data Train into Train and Val","metadata":{"id":"VhXsSGsff8DF"}},{"cell_type":"code","source":"X_val   = X_train[-300:]\ny_val   = y_train[-300:]\n\nX_train = X_train[:-300]\ny_train = y_train[:-300]","metadata":{"id":"OX8aYbPTPU7I","execution":{"iopub.status.busy":"2021-08-23T14:03:43.952967Z","iopub.status.idle":"2021-08-23T14:03:43.95343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('X_train.shape =',X_train.shape)\nprint('y_train.shape =',y_train.shape)\n\nprint('\\nX_val.shape  =',X_val.shape)\nprint('y_val.shape  =',y_val.shape)\n\nprint('\\nX_test.shape  =',X_test.shape)\nprint('y_test.shape  =',y_test.shape)","metadata":{"id":"gXp-9MiACjKC","outputId":"57234601-6f5d-4524-9061-8ffc72f0bd43","execution":{"iopub.status.busy":"2021-08-23T14:03:43.954424Z","iopub.status.idle":"2021-08-23T14:03:43.954874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# One hot y labels","metadata":{"id":"uCth0VqQgKrv"}},{"cell_type":"code","source":"y_train_hot = to_categorical(y_train, 102)\ny_val_hot   = to_categorical(y_val, 102)\ny_test_hot  = to_categorical(y_test, 102)\n\nprint('y_train_hot.shape =',y_train_hot.shape)\nprint('y_val_hot.shape   =',y_val_hot.shape)\nprint('y_test_hot.shape  =',y_test_hot.shape)","metadata":{"id":"k_YwRi7LcQ-Z","outputId":"167586fa-e08a-4e91-db30-3c97d98b9e48","execution":{"iopub.status.busy":"2021-08-23T14:03:43.956006Z","iopub.status.idle":"2021-08-23T14:03:43.956504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n# Classification Model","metadata":{"id":"pAQ6ToaNIPkp"}},{"cell_type":"markdown","source":"## Create Model\n\n Using inception-resnet-v2","metadata":{"id":"7iCiF6K_exEJ"}},{"cell_type":"code","source":"model = tf.keras.applications.inception_resnet_v2.InceptionResNetV2(weights='imagenet', include_top=False, input_shape=(80, 80, 3))","metadata":{"id":"b4qO7Yy8Ydi6","execution":{"iopub.status.busy":"2021-08-23T14:03:43.957513Z","iopub.status.idle":"2021-08-23T14:03:43.958018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = model.layers[-1].output\nx = GlobalAveragePooling2D() (x)\npredictions = Dense(102, activation='softmax') (x)\n\nmyModel = Model(inputs=model.input, outputs=predictions)","metadata":{"id":"pt9KtIlvYdiy","execution":{"iopub.status.busy":"2021-08-23T14:03:43.958865Z","iopub.status.idle":"2021-08-23T14:03:43.95933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Visualize Model","metadata":{"id":"mXIVniKSVMk6"}},{"cell_type":"code","source":"myModel.summary()","metadata":{"id":"I857GpI0VKBl","outputId":"d2d6a89f-b5ad-41a4-cee2-ce838785230d","execution":{"iopub.status.busy":"2021-08-23T14:03:43.960905Z","iopub.status.idle":"2021-08-23T14:03:43.961434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model(model, show_shapes=True,\n    show_layer_names=False,\n    rankdir='LR',\n    expand_nested=False,\n    dpi=60\n)","metadata":{"id":"L0PLc3WWQHRz","outputId":"fec67675-a99e-43f8-f3d1-9635b98d77df","execution":{"iopub.status.busy":"2021-08-23T14:03:43.962515Z","iopub.status.idle":"2021-08-23T14:03:43.962964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Compile Model\n\n","metadata":{"id":"Ts7C2Q6-eqkc"}},{"cell_type":"code","source":"myModel.compile(\n      loss='categorical_crossentropy',\n      optimizer=tf.keras.optimizers.Adam(), \n      metrics=['accuracy']\n  )","metadata":{"id":"3T0kqQFSYdiv","execution":{"iopub.status.busy":"2021-08-23T14:03:43.964082Z","iopub.status.idle":"2021-08-23T14:03:43.964553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n# Data Augmentation","metadata":{"id":"vuSAtshgIcDZ"}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    channel_shift_range=0.1,\n    horizontal_flip=True\n)","metadata":{"id":"sTO9Y0cBciBq","execution":{"iopub.status.busy":"2021-08-23T14:03:43.965676Z","iopub.status.idle":"2021-08-23T14:03:43.966165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  Callbacks\n* Checkpoint\n* Learning Rate Annealing","metadata":{"id":"lIeAVaflemPn"}},{"cell_type":"code","source":"from tensorflow.keras.callbacks import ModelCheckpoint, LearningRateScheduler\n\ndef lr_schedule(epoch):\n    lr = 1e-3\n    if (epoch > 30):\n        lr *= 0.01\n    elif (epoch > 20):\n        lr *= 0.1\n    return lr\n\nlr_callback = LearningRateScheduler(lr_schedule)\n\nmyCheckpoint = ModelCheckpoint(filepath='./dataset/my_model.h5', \n                               monitor='val_accuracy',\n                               save_best_only=True,\n                              )","metadata":{"id":"rg1BjBlUUk8D","execution":{"iopub.status.busy":"2021-08-23T14:03:43.96702Z","iopub.status.idle":"2021-08-23T14:03:43.967509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train the Model","metadata":{"id":"Zzd6TLORJN4V"}},{"cell_type":"code","source":"history_all = []","metadata":{"id":"AHQGTDNKGaPD","execution":{"iopub.status.busy":"2021-08-23T14:03:43.968497Z","iopub.status.idle":"2021-08-23T14:03:43.968942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nepochs = 12","metadata":{"id":"_WOpRsOvcuTu","execution":{"iopub.status.busy":"2021-08-23T14:03:43.970441Z","iopub.status.idle":"2021-08-23T14:03:43.970874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"augmented_train = datagen.flow(\n    X_train, y_train_hot, batch_size\n)\n\nhistory = myModel.fit(\n    augmented_train,\n    validation_data=(X_val, y_val_hot),\n    epochs=epochs, \n    steps_per_epoch=len(X_train)/64,\n    callbacks=[lr_callback, myCheckpoint],\n    verbose=2)\n\nhistory_all.append(history)","metadata":{"id":"thhXcVAhcjpS","outputId":"09be8ee9-fa66-40df-e858-dad1d40aaef5","execution":{"iopub.status.busy":"2021-08-23T14:03:43.972048Z","iopub.status.idle":"2021-08-23T14:03:43.972499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Plot Current History Training","metadata":{"id":"bxcRw7jjeZyQ"}},{"cell_type":"code","source":"plt.rcParams['figure.figsize'] = [7, 5]\n\nplt.plot(history.history['accuracy'], label='train')\nplt.plot(history.history['val_accuracy'], label='val')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.show()\n\n","metadata":{"id":"UggWSFRVcjmh","outputId":"40c03558-68ed-4188-f819-0d5d4341cea3","execution":{"iopub.status.busy":"2021-08-23T14:03:43.973467Z","iopub.status.idle":"2021-08-23T14:03:43.973898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Plot All History Training","metadata":{"id":"ZMkyAKpsG524"}},{"cell_type":"code","source":"hist_train = []\nhist_val = []\n\nfor h in history_all:\n    hist_train.append(h.history['accuracy'][1:])\n    hist_val.append(h.history['val_accuracy'][1:])","metadata":{"id":"ZPHNIgmCG9NR","execution":{"iopub.status.busy":"2021-08-23T14:03:43.974704Z","iopub.status.idle":"2021-08-23T14:03:43.975134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hist_train = np.array(hist_train).reshape(-1)\nhist_val = np.array(hist_val).reshape(-1)","metadata":{"id":"SJSKCoxZIufX","execution":{"iopub.status.busy":"2021-08-23T14:03:43.975952Z","iopub.status.idle":"2021-08-23T14:03:43.976401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.rcParams['figure.figsize'] = [7, 5] \n\nplt.plot(hist_train, label='train')\nplt.plot(hist_val, label='val')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.show()\n\n","metadata":{"id":"eY6zx3SwG527","outputId":"be1d662a-84c6-428a-ff1e-c2c7e1e07937","execution":{"iopub.status.busy":"2021-08-23T14:03:43.977418Z","iopub.status.idle":"2021-08-23T14:03:43.977841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluate Model\n","metadata":{"id":"XmrH2R-6eXXJ"}},{"cell_type":"code","source":"myModel.load_weights('./dataset/my_model.h5')\nscores = myModel.evaluate(X_test, y_test_hot)","metadata":{"id":"qqlxMhbiczyi","outputId":"6988c1c8-bf8a-40b8-c5bb-1f49d9c3563b","execution":{"iopub.status.busy":"2021-08-23T14:03:43.978748Z","iopub.status.idle":"2021-08-23T14:03:43.979378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Test loss    :', scores[0])\nprint('Test accuracy: %.2f%%' % (scores[1]*100))","metadata":{"id":"vruBMuSHc1oI","outputId":"6a87f5f8-a543-4cbc-f47f-faf9d8cf09ce","execution":{"iopub.status.busy":"2021-08-23T14:03:43.980364Z","iopub.status.idle":"2021-08-23T14:03:43.980819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Re-Evaluate Model\n","metadata":{}},{"cell_type":"code","source":"train_scores = myModel.evaluate(X_train, y_train_hot)\ntest_scores  = myModel.evaluate(X_test, y_test_hot)\nval_scores   = myModel.evaluate(X_val, y_val_hot)","metadata":{"execution":{"iopub.status.busy":"2021-08-23T14:03:43.981666Z","iopub.status.idle":"2021-08-23T14:03:43.982114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Train Loss: %.5f with Accuracy: %.1f%%' % (train_scores[0], (train_scores[1]*100)))\nprint('Test  Loss: %.5f with Accuracy: %.1f%%' % (test_scores[0], (test_scores[1]*100)))\nprint('Val   Loss: %.5f with Accuracy: %.1f%%' % (val_scores[0], (val_scores[1]*100)))","metadata":{"execution":{"iopub.status.busy":"2021-08-23T14:03:43.982938Z","iopub.status.idle":"2021-08-23T14:03:43.983396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n# Test the image from the internet \n","metadata":{}},{"cell_type":"code","source":"!wget -O 'data_test_0.jpg' 'https://scx1.b-cdn.net/csz/news/800/2018/2-dog.jpg' \n!wget -O 'data_test_1.jpg' 'https://static.toiimg.com/thumb/msid-67586673,width-800,height-600,resizemode-75,imgsize-3918697,pt-32,y_pad-40/67586673.jpg'\n!wget -O 'data_test_2.jpg' 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Green_tree_frog.jpg/799px-Green_tree_frog.jpg'\n!wget -O 'data_test_3.jpg' 'https://bsmedia.business-standard.com/_media/bs/img/article/2019-10/15/full/1571086349-8577.jpg'\n!wget -O 'data_test_4.jpg' 'https://www.om.org/img/h55955_42-62.jpg'","metadata":{"execution":{"iopub.status.busy":"2021-08-23T14:03:43.984229Z","iopub.status.idle":"2021-08-23T14:03:43.984693Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n  new_img = Image.open('data_test_'+str(i)+'.jpg')\n  new_img = np.array(new_img)\n  new_img2 = cv.resize(new_img, input_shape[:2], interpolation=cv.INTER_AREA)\n  plt.imshow(new_img2)\n  plt.axis('off')\n  plt.show()\n\n  new_img2 = np.expand_dims(new_img2,0).astype(np.float64)\n  pred = myModel.predict(new_img2)\n  class_id = np.argmax(pred)\n  print('predicted id',class_id)\n  print('class prediction', class_names[class_id])","metadata":{"execution":{"iopub.status.busy":"2021-08-23T14:03:43.985668Z","iopub.status.idle":"2021-08-23T14:03:43.986119Z"},"trusted":true},"execution_count":null,"outputs":[]}]}