diff --git a/image processing and models/arrest-tb-main.ipynb b/image processing and models/arrest-tb-main.ipynb new file mode 100644 index 0000000..3c5a65d --- /dev/null +++ b/image processing and models/arrest-tb-main.ipynb @@ -0,0 +1 @@ +{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#import tensor flow\nimport tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:21.563879Z","iopub.execute_input":"2021-07-02T07:05:21.564776Z","iopub.status.idle":"2021-07-02T07:05:28.909980Z","shell.execute_reply.started":"2021-07-02T07:05:21.564651Z","shell.execute_reply":"2021-07-02T07:05:28.908708Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"#import all libraries\nimport numpy as np\nimport os\nfrom sklearn.metrics import confusion_matrix\nimport seaborn as sn; sn.set(font_scale=1.4)\nfrom sklearn.utils import shuffle \nimport matplotlib.pyplot as plt \nimport cv2 \nimport tensorflow as tf \nfrom tqdm import tqdm\nfrom sklearn.metrics import classification_report\nfrom sklearn.model_selection import train_test_split\nimport numpy as np","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:28.911719Z","iopub.execute_input":"2021-07-02T07:05:28.912076Z","iopub.status.idle":"2021-07-02T07:05:29.981571Z","shell.execute_reply.started":"2021-07-02T07:05:28.912039Z","shell.execute_reply":"2021-07-02T07:05:29.980208Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom matplotlib import pyplot as plt #Ploting charts\nfrom glob import glob #retriving an array of files in directories\nfrom keras.models import Sequential #for neural network models\nfrom keras.layers import Dense, Dropout, Flatten, ZeroPadding2D, Conv2D, MaxPooling2D\nfrom keras.preprocessing.image import ImageDataGenerator #Data augmentation and preprocessing\nfrom keras.utils import to_categorical #For One-hot Encoding\nfrom keras.optimizers import Adam, SGD, RMSprop #For Optimizing the Neural Network\nfrom keras.callbacks import EarlyStopping","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:29.984463Z","iopub.execute_input":"2021-07-02T07:05:29.985037Z","iopub.status.idle":"2021-07-02T07:05:30.056681Z","shell.execute_reply.started":"2021-07-02T07:05:29.984959Z","shell.execute_reply":"2021-07-02T07:05:30.055824Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"class_names = ['negative','positive']\nclass_names_label = {class_name:i for i, class_name in enumerate(class_names)}\n\nnb_classes = len(class_names)\n\nIMAGE_SIZE = (299,299)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:30.058207Z","iopub.execute_input":"2021-07-02T07:05:30.058652Z","iopub.status.idle":"2021-07-02T07:05:30.063810Z","shell.execute_reply.started":"2021-07-02T07:05:30.058616Z","shell.execute_reply":"2021-07-02T07:05:30.062609Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"#load the data\ndef load_data():\n \"\"\"\n Load the data:\n - 14,034 images to train the network.\n - 3,000 images to evaluate how accurately the network learned to classify images.\n \"\"\"\n \n datasets = [\"../input/mainhsv/main(HSV)/training\", \"../input/mainhsv/main(HSV)/testing\"]\n output = []\n \n # Iterate through training and test sets\n for dataset in datasets:\n \n images = []\n labels = []\n \n print(\"Loading {}\".format(dataset))\n \n # Iterate through each folder corresponding to a category\n for folder in os.listdir(dataset):\n label = class_names_label[folder]\n \n # Iterate through each image in our folder\n for file in tqdm(os.listdir(os.path.join(dataset, folder))):\n \n # Get the path name of the image\n img_path = os.path.join(os.path.join(dataset, folder), file)\n \n # Open and resize the img\n image = cv2.imread(img_path)\n image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n image = cv2.resize(image, IMAGE_SIZE) \n \n # Append the image and its corresponding label to the output\n images.append(image)\n labels.append(label)\n \n images = np.array(images, dtype = 'float32')\n labels = np.array(labels, dtype = 'int32') \n \n output.append((images, labels))\n\n return output","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:30.065689Z","iopub.execute_input":"2021-07-02T07:05:30.066226Z","iopub.status.idle":"2021-07-02T07:05:30.080612Z","shell.execute_reply.started":"2021-07-02T07:05:30.066187Z","shell.execute_reply":"2021-07-02T07:05:30.079056Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"(train_images, train_labels), (test_images, test_labels) = load_data()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:30.084799Z","iopub.execute_input":"2021-07-02T07:05:30.085159Z","iopub.status.idle":"2021-07-02T07:05:31.931282Z","shell.execute_reply.started":"2021-07-02T07:05:30.085126Z","shell.execute_reply":"2021-07-02T07:05:31.929661Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stderr","text":" 16%|█▌ | 3/19 [00:00<00:00, 25.35it/s]","output_type":"stream"},{"name":"stdout","text":"Loading ../input/mainhsv/main(HSV)/training\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 19/19 [00:00<00:00, 38.03it/s]\n100%|██████████| 23/23 [00:00<00:00, 44.97it/s]\n 46%|████▌ | 6/13 [00:00<00:00, 56.91it/s]","output_type":"stream"},{"name":"stdout","text":"Loading ../input/mainhsv/main(HSV)/testing\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 13/13 [00:00<00:00, 57.38it/s]\n100%|██████████| 14/14 [00:00<00:00, 31.57it/s]\n","output_type":"stream"}]},{"cell_type":"code","source":"train_images, train_labels = shuffle(train_images, train_labels, random_state=25)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:31.933301Z","iopub.execute_input":"2021-07-02T07:05:31.933932Z","iopub.status.idle":"2021-07-02T07:05:31.973687Z","shell.execute_reply.started":"2021-07-02T07:05:31.933866Z","shell.execute_reply":"2021-07-02T07:05:31.972248Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"n_train = train_labels.shape[0]\nn_test = test_labels.shape[0]\n\nprint (\"Number of training examples: {}\".format(n_train))\nprint (\"Number of testing examples: {}\".format(n_test))\nprint (\"Each image is of size: {}\".format(IMAGE_SIZE))","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:31.976639Z","iopub.execute_input":"2021-07-02T07:05:31.977011Z","iopub.status.idle":"2021-07-02T07:05:31.984385Z","shell.execute_reply.started":"2021-07-02T07:05:31.976965Z","shell.execute_reply":"2021-07-02T07:05:31.983246Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"Number of training examples: 42\nNumber of testing examples: 27\nEach image is of size: (299, 299)\n","output_type":"stream"}]},{"cell_type":"code","source":"import pandas as pd\n\n_, train_counts = np.unique(train_labels, return_counts=True)\n_, test_counts = np.unique(test_labels, return_counts=True)\npd.DataFrame({'train': train_counts,\n 'test': test_counts}, \n index=class_names\n ).plot.bar()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:31.986568Z","iopub.execute_input":"2021-07-02T07:05:31.987196Z","iopub.status.idle":"2021-07-02T07:05:32.509374Z","shell.execute_reply.started":"2021-07-02T07:05:31.987147Z","shell.execute_reply":"2021-07-02T07:05:32.508489Z"},"trusted":true},"execution_count":9,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{}}]},{"cell_type":"code","source":"plt.pie(train_counts,\n explode=(0, 0) , \n labels=class_names,\n autopct='%1.1f%%')\nplt.axis('equal')\nplt.title('Proportion of each observed category')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:32.510745Z","iopub.execute_input":"2021-07-02T07:05:32.511282Z","iopub.status.idle":"2021-07-02T07:05:32.626143Z","shell.execute_reply.started":"2021-07-02T07:05:32.511247Z","shell.execute_reply":"2021-07-02T07:05:32.625187Z"},"trusted":true},"execution_count":10,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{}}]},{"cell_type":"code","source":"train_images = train_images / 255.0 \ntest_images = test_images / 255.0","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:32.627506Z","iopub.execute_input":"2021-07-02T07:05:32.628051Z","iopub.status.idle":"2021-07-02T07:05:32.673475Z","shell.execute_reply.started":"2021-07-02T07:05:32.627991Z","shell.execute_reply":"2021-07-02T07:05:32.672246Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"code","source":"#visualize data\ndef display_examples(class_names, images, labels):\n \"\"\"\n Display 25 images from the images array with its corresponding labels\n \"\"\"\n \n fig = plt.figure(figsize=(10,10))\n fig.suptitle(\"Some examples of images of the dataset\", fontsize=16)\n for i in range(10):\n plt.subplot(5,5,i+1)\n plt.xticks([])\n plt.yticks([])\n plt.grid(False)\n plt.imshow(images[i], cmap=plt.cm.binary)\n plt.xlabel(class_names[labels[i]])\n plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:32.675151Z","iopub.execute_input":"2021-07-02T07:05:32.675559Z","iopub.status.idle":"2021-07-02T07:05:32.682901Z","shell.execute_reply.started":"2021-07-02T07:05:32.675514Z","shell.execute_reply":"2021-07-02T07:05:32.682067Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"display_examples(class_names, train_images, train_labels)\nprint(train_labels)\nprint(class_names)","metadata":{"trusted":true},"execution_count":22,"outputs":[{"name":"stdout","text":"[1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1\n 0 1 0 1 0]\n['negative', 'positive']\n","output_type":"stream"}]},{"cell_type":"code","source":"model = tf.keras.Sequential([\n tf.keras.layers.Conv2D(8, (3, 3), activation = 'relu', input_shape = (299, 299, 3)),\n tf.keras.layers.MaxPooling2D((2,2),strides=(2, 2)),\n tf.keras.layers.Flatten(),\n tf.keras.layers.Dense(8, activation=tf.nn.relu),\n tf.keras.layers.Dense(2, activation=tf.nn.softmax)\n])\n","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:33.496946Z","iopub.execute_input":"2021-07-02T07:05:33.497420Z","iopub.status.idle":"2021-07-02T07:05:33.641149Z","shell.execute_reply.started":"2021-07-02T07:05:33.497371Z","shell.execute_reply":"2021-07-02T07:05:33.639904Z"},"trusted":true},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:33.642573Z","iopub.execute_input":"2021-07-02T07:05:33.642884Z","iopub.status.idle":"2021-07-02T07:05:33.653862Z","shell.execute_reply.started":"2021-07-02T07:05:33.642855Z","shell.execute_reply":"2021-07-02T07:05:33.652346Z"},"trusted":true},"execution_count":15,"outputs":[{"name":"stdout","text":"Model: \"sequential\"\n_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\nconv2d (Conv2D) (None, 297, 297, 8) 224 \n_________________________________________________________________\nmax_pooling2d (MaxPooling2D) (None, 148, 148, 8) 0 \n_________________________________________________________________\nflatten (Flatten) (None, 175232) 0 \n_________________________________________________________________\ndense (Dense) (None, 8) 1401864 \n_________________________________________________________________\ndense_1 (Dense) (None, 2) 18 \n=================================================================\nTotal params: 1,402,106\nTrainable params: 1,402,106\nNon-trainable params: 0\n_________________________________________________________________\n","output_type":"stream"}]},{"cell_type":"code","source":"model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:33.655764Z","iopub.execute_input":"2021-07-02T07:05:33.656138Z","iopub.status.idle":"2021-07-02T07:05:33.680414Z","shell.execute_reply.started":"2021-07-02T07:05:33.656095Z","shell.execute_reply":"2021-07-02T07:05:33.679195Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_images, train_labels, batch_size=128, epochs=30, validation_split = 0.4)\n","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:06:26.680706Z","iopub.execute_input":"2021-07-02T07:06:26.681073Z","iopub.status.idle":"2021-07-02T07:06:45.480169Z","shell.execute_reply.started":"2021-07-02T07:06:26.681042Z","shell.execute_reply":"2021-07-02T07:06:45.478970Z"},"trusted":true},"execution_count":18,"outputs":[{"name":"stdout","text":"Epoch 1/30\n1/1 [==============================] - 1s 730ms/step - loss: 0.5560 - accuracy: 0.7200 - val_loss: 1.0650 - val_accuracy: 0.5882\nEpoch 2/30\n1/1 [==============================] - 1s 615ms/step - loss: 0.5541 - accuracy: 0.7200 - val_loss: 1.0973 - val_accuracy: 0.6471\nEpoch 3/30\n1/1 [==============================] - 1s 628ms/step - loss: 0.5527 - accuracy: 0.7200 - val_loss: 1.1342 - val_accuracy: 0.5882\nEpoch 4/30\n1/1 [==============================] - 1s 615ms/step - loss: 0.5580 - accuracy: 0.6800 - val_loss: 1.1138 - val_accuracy: 0.5882\nEpoch 5/30\n1/1 [==============================] - 1s 597ms/step - loss: 0.5517 - accuracy: 0.7200 - val_loss: 1.0983 - val_accuracy: 0.6471\nEpoch 6/30\n1/1 [==============================] - 1s 617ms/step - loss: 0.5515 - accuracy: 0.7200 - val_loss: 1.0894 - val_accuracy: 0.5882\nEpoch 7/30\n1/1 [==============================] - 1s 606ms/step - loss: 0.5513 - accuracy: 0.7200 - val_loss: 1.0812 - val_accuracy: 0.5882\nEpoch 8/30\n1/1 [==============================] - 1s 598ms/step - loss: 0.5510 - accuracy: 0.7200 - val_loss: 1.0760 - val_accuracy: 0.5882\nEpoch 9/30\n1/1 [==============================] - 1s 626ms/step - loss: 0.5508 - accuracy: 0.7200 - val_loss: 1.0734 - val_accuracy: 0.5882\nEpoch 10/30\n1/1 [==============================] - 1s 601ms/step - loss: 0.5505 - accuracy: 0.7200 - val_loss: 1.0730 - val_accuracy: 0.5882\nEpoch 11/30\n1/1 [==============================] - 1s 595ms/step - loss: 0.5502 - accuracy: 0.7200 - val_loss: 1.0745 - val_accuracy: 0.5882\nEpoch 12/30\n1/1 [==============================] - 1s 615ms/step - loss: 0.5500 - accuracy: 0.7200 - val_loss: 1.0775 - val_accuracy: 0.5882\nEpoch 13/30\n1/1 [==============================] - 1s 587ms/step - loss: 0.5497 - accuracy: 0.7200 - val_loss: 1.0818 - val_accuracy: 0.5882\nEpoch 14/30\n1/1 [==============================] - 1s 564ms/step - loss: 0.5495 - accuracy: 0.7200 - val_loss: 1.0870 - val_accuracy: 0.5882\nEpoch 15/30\n1/1 [==============================] - 1s 590ms/step - loss: 0.5492 - accuracy: 0.7200 - val_loss: 1.0931 - val_accuracy: 0.5882\nEpoch 16/30\n1/1 [==============================] - 1s 608ms/step - loss: 0.5490 - accuracy: 0.7200 - val_loss: 1.0998 - val_accuracy: 0.5882\nEpoch 17/30\n1/1 [==============================] - 1s 613ms/step - loss: 0.5487 - accuracy: 0.7200 - val_loss: 1.1069 - val_accuracy: 0.5882\nEpoch 18/30\n1/1 [==============================] - 1s 626ms/step - loss: 0.5485 - accuracy: 0.7200 - val_loss: 1.1130 - val_accuracy: 0.5882\nEpoch 19/30\n1/1 [==============================] - 1s 610ms/step - loss: 0.5483 - accuracy: 0.7200 - val_loss: 1.1191 - val_accuracy: 0.6471\nEpoch 20/30\n1/1 [==============================] - 1s 602ms/step - loss: 0.5472 - accuracy: 0.7200 - val_loss: 1.2122 - val_accuracy: 0.5294\nEpoch 21/30\n1/1 [==============================] - 1s 627ms/step - loss: 0.5344 - accuracy: 0.7600 - val_loss: 1.6089 - val_accuracy: 0.5294\nEpoch 22/30\n1/1 [==============================] - 1s 623ms/step - loss: 0.7344 - accuracy: 0.7200 - val_loss: 1.1124 - val_accuracy: 0.6471\nEpoch 23/30\n1/1 [==============================] - 1s 606ms/step - loss: 0.5435 - accuracy: 0.7600 - val_loss: 0.9275 - val_accuracy: 0.5882\nEpoch 24/30\n1/1 [==============================] - 1s 617ms/step - loss: 0.5481 - accuracy: 0.7200 - val_loss: 0.8174 - val_accuracy: 0.6471\nEpoch 25/30\n1/1 [==============================] - 1s 622ms/step - loss: 0.5518 - accuracy: 0.7200 - val_loss: 0.7567 - val_accuracy: 0.5882\nEpoch 26/30\n1/1 [==============================] - 1s 605ms/step - loss: 0.5644 - accuracy: 0.7200 - val_loss: 0.7046 - val_accuracy: 0.5882\nEpoch 27/30\n1/1 [==============================] - 1s 633ms/step - loss: 0.5888 - accuracy: 0.7200 - val_loss: 0.6838 - val_accuracy: 0.5882\nEpoch 28/30\n1/1 [==============================] - 1s 618ms/step - loss: 0.5985 - accuracy: 0.6800 - val_loss: 0.6759 - val_accuracy: 0.5882\nEpoch 29/30\n1/1 [==============================] - 1s 693ms/step - loss: 0.6030 - accuracy: 0.6800 - val_loss: 0.6759 - val_accuracy: 0.5882\nEpoch 30/30\n1/1 [==============================] - 1s 760ms/step - loss: 0.6029 - accuracy: 0.6800 - val_loss: 0.6893 - val_accuracy: 0.5882\n","output_type":"stream"},{"execution_count":18,"output_type":"execute_result","data":{"text/plain":"108"},"metadata":{}}]},{"cell_type":"code","source":"print(test_labels)\nprint(class_names)\nwith open(\"lables.txt\",\"w\") as f:\n for item in class_names:\n f.write(\"%s\\n\"%item)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:20:44.338153Z","iopub.execute_input":"2021-07-02T07:20:44.338670Z","iopub.status.idle":"2021-07-02T07:20:44.346207Z","shell.execute_reply.started":"2021-07-02T07:20:44.338637Z","shell.execute_reply":"2021-07-02T07:20:44.345369Z"},"trusted":true},"execution_count":34,"outputs":[{"name":"stdout","text":"[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1]\n['negative', 'positive']\n","output_type":"stream"}]},{"cell_type":"code","source":"def plot_accuracy_loss(history):\n \"\"\"\n Plot the accuracy and the loss during the training of the nn.\n \"\"\"\n fig = plt.figure(figsize=(10,5))\n\n # Plot accuracy\n plt.subplot(221)\n plt.plot(history.history['accuracy'],'bo--', label = \"accuracy\")\n plt.plot(history.history['val_accuracy'], 'ro--', label = \"val_accuracy\")\n plt.title(\"train_acc vs val_acc\")\n plt.ylabel(\"accuracy\")\n plt.xlabel(\"epochs\")\n plt.legend()\n\n # Plot loss function\n plt.subplot(222)\n plt.plot(history.history['loss'],'bo--', label = \"loss\")\n plt.plot(history.history['val_loss'], 'ro--', label = \"val_loss\")\n plt.title(\"train_loss vs val_loss\")\n plt.ylabel(\"loss\")\n plt.xlabel(\"epochs\")\n\n plt.legend()\n plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.093030Z","iopub.status.idle":"2021-07-02T07:05:54.093602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_accuracy_loss(history)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.094503Z","iopub.status.idle":"2021-07-02T07:05:54.095254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss = model.evaluate(test_images, test_labels,batch_size=200)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.096129Z","iopub.status.idle":"2021-07-02T07:05:54.096660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"probability_model = tf.keras.Sequential([model, \n tf.keras.layers.Softmax()])","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.097631Z","iopub.status.idle":"2021-07-02T07:05:54.098178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = probability_model.predict(test_images)\npredicted_label = np.argmax(predictions, axis =1)\nprint(predicted_label.shape)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.099113Z","iopub.status.idle":"2021-07-02T07:05:54.099647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import metrics\n# Predicted values\ny_pred = predicted_label\n# Actual values\ny_act = test_labels\nprint(metrics.confusion_matrix(y_act, y_pred))\nprint(metrics.classification_report(y_act, y_pred))","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.100746Z","iopub.status.idle":"2021-07-02T07:05:54.101542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_image(i, predictions_array, true_label, img):\n true_label, img = true_label[i], img[i]\n plt.grid(False)\n plt.xticks([])\n plt.yticks([])\n\n plt.imshow(img, cmap=plt.cm.binary)\n\n predicted_label = np.argmax(predictions_array)\n if predicted_label == true_label:\n color = 'green'\n else:\n color = 'red'\n\n plt.xlabel(\"{} {:2.0f}% ({})\".format(class_names[predicted_label],\n 100*np.max(predictions_array),\n '',\n class_names[true_label]),\n color=color)\n\ndef plot_value_array(i, predictions_array, true_label):\n true_label = true_label[i]\n plt.grid(False)\n plt.xticks(range(10))\n plt.yticks([])\n thisplot = plt.bar(range(10), predictions_array, color=\"#777777\")\n plt.ylim([0, 1])\n print(predicted_label.shape)\n predicted_label = np.argmax(predictions_array)\n \n thisplot[predicted_label].set_color('red')\n thisplot[true_label].set_color('green')\n\n","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.105545Z","iopub.status.idle":"2021-07-02T07:05:54.106204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nnum_rows = 5\nnum_cols = 2\nnum_images = num_rows*num_cols\nplt.figure(figsize=(2*2*num_cols, 2*num_rows))\nfor i in range(9):\n plt.subplot(num_rows, 2*num_cols, 2*i+1)\n plot_image(i, predictions[i], test_labels, test_images)\n \nplt.tight_layout()\nplt.show()\n\n","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.107229Z","iopub.status.idle":"2021-07-02T07:05:54.107783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('model')","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.108596Z","iopub.status.idle":"2021-07-02T07:05:54.109228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model='./model'\nconverter = tf.lite.TFLiteConverter.from_saved_model(model) # path to the SavedModel directory\n\nconverter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE] # for dynamic range quantized model \nconverter.target_spec.supported_types = [tf.float16] # for floating range quantized model\n\ntflite_model = converter.convert() \n\nwith open('quantized_model.tflite', 'wb') as f:\n f.write(tflite_model)\nwith open('floating_model.tflite', 'wb') as f:\n f.write(tflite_model)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.110059Z","iopub.status.idle":"2021-07-02T07:05:54.110583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\n\n# Load the TFLite model and allocate tensors.\ninterpreter = tf.lite.Interpreter(model_path=\"quantized_model.tflite\")\ninterpreter.allocate_tensors()\n\n# Get input and output tensors.\ninput_details = interpreter.get_input_details()\noutput_details = interpreter.get_output_details()\n\n# Test the model on random input data.\ninput_shape = input_details[0]['shape']\ninput_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)\ninterpreter.set_tensor(input_details[0]['index'], input_data)\n\ninterpreter.invoke()\n\n# The function `get_tensor()` returns a copy of the tensor data.\n# Use `tensor()` in order to get a pointer to the tensor.\noutput_data = interpreter.get_tensor(output_details[0]['index'])\nprint(output_data)","metadata":{"execution":{"iopub.status.busy":"2021-07-02T07:05:54.111720Z","iopub.status.idle":"2021-07-02T07:05:54.112389Z"},"trusted":true},"execution_count":null,"outputs":[]}]} \ No newline at end of file