{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-09T14:47:09.980745Z","iopub.execute_input":"2022-04-09T14:47:09.981315Z","iopub.status.idle":"2022-04-09T14:47:09.993187Z","shell.execute_reply.started":"2022-04-09T14:47:09.981276Z","shell.execute_reply":"2022-04-09T14:47:09.99161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Overview\nThis notebook uses a CNN with 4 convolutional layers to distinguish between photos of dogs and cats.\n\nTraining accuracy after 25 epochs is about 96% while validation accuracy is around 89% so there is some overfitting going on.\n\nThe images come in different sizes and originally an ImageDataGenerator was used to resize to a fixed size 150 x 150.  The ImageDataGenerator was also used for rescaling of the pixel value by dividing by 255.  It was noticed that the CPU bottlenecked the training process, which took some 75 seconds per epoch with GPU acceleration.\n\nSince the repetitive resizing-on-the-fly is performed by the CPU and therefore contributed to the CPU bottleneck, code was added to separately resize the source images before training and store the results to disk.  The training algorithm was then applied to the resized images.  This is the current flow, with the ImageDataGenerator still performing the pixel rescaling.  The CPU still bottlenecks training but training time has been reduced to 26 seconds per epoch, with as well as without GPU accelaration.\n\nThe remaining CPU bottlenecking is likely caused by the repetitive fetching of data and training of tha data, a flow that can be further optimized.","metadata":{}},{"cell_type":"code","source":"%matplotlib inline\n\nimport zipfile\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport shutil\n\nimport tensorflow as tf\nfrom tensorflow.keras import utils\nimport keras_preprocessing\nfrom keras_preprocessing import image\nfrom keras_preprocessing.image import ImageDataGenerator\n\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.optimizers import RMSprop","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:12.236195Z","iopub.execute_input":"2022-04-09T14:47:12.236762Z","iopub.status.idle":"2022-04-09T14:47:12.244287Z","shell.execute_reply.started":"2022-04-09T14:47:12.236724Z","shell.execute_reply":"2022-04-09T14:47:12.243622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Check for availability and use of GPU.","metadata":{}},{"cell_type":"code","source":"!nvidia-smi\nprint(tf.test.is_gpu_available())\nprint(tf.test.gpu_device_name())\nprint(tf.config.experimental.list_physical_devices(device_type='GPU'))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:13.828483Z","iopub.execute_input":"2022-04-09T14:47:13.828736Z","iopub.status.idle":"2022-04-09T14:47:14.569768Z","shell.execute_reply.started":"2022-04-09T14:47:13.828708Z","shell.execute_reply":"2022-04-09T14:47:14.568105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Empty the /kaggle/working directory so you can run this notebook multiple times.","metadata":{}},{"cell_type":"code","source":"working_dir = \"/kaggle/working/\"\nfor rootdir, dirs, files in os.walk(working_dir):\n    for subdir in dirs:\n        shutil.rmtree(subdir)","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:14.646985Z","iopub.execute_input":"2022-04-09T14:47:14.647764Z","iopub.status.idle":"2022-04-09T14:47:16.459307Z","shell.execute_reply.started":"2022-04-09T14:47:14.647723Z","shell.execute_reply":"2022-04-09T14:47:16.458551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Unzip the training set in the working directory.","metadata":{}},{"cell_type":"code","source":"input_dir = \"/kaggle/input/dogs-vs-cats/\"\n\nlocal_zip = input_dir + 'train.zip'\nzip_ref = zipfile.ZipFile(local_zip, 'r')\nzip_ref.extractall(working_dir)\nzip_ref.close()","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:16.461Z","iopub.execute_input":"2022-04-09T14:47:16.461264Z","iopub.status.idle":"2022-04-09T14:47:22.728643Z","shell.execute_reply.started":"2022-04-09T14:47:16.46123Z","shell.execute_reply":"2022-04-09T14:47:22.727867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Unzip the test set.","metadata":{}},{"cell_type":"code","source":"local_zip = input_dir + 'test1.zip'\nzip_ref = zipfile.ZipFile(local_zip, 'r')\nzip_ref.extractall(working_dir)\nzip_ref.close()","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:23.538519Z","iopub.execute_input":"2022-04-09T14:47:23.538778Z","iopub.status.idle":"2022-04-09T14:47:27.065406Z","shell.execute_reply.started":"2022-04-09T14:47:23.53875Z","shell.execute_reply":"2022-04-09T14:47:27.064692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Do not try to see the files in the training or test set in the data panel on the right as it will hang the browser.\n\nPrint the names of a few files in the training set.","metadata":{}},{"cell_type":"code","source":"train_dir = working_dir + 'train/'\nfor dirname, _, filenames in os.walk(train_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:27.070947Z","iopub.execute_input":"2022-04-09T14:47:27.073624Z","iopub.status.idle":"2022-04-09T14:47:27.135492Z","shell.execute_reply.started":"2022-04-09T14:47:27.073572Z","shell.execute_reply":"2022-04-09T14:47:27.13466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Print the names of a few files in the test set.","metadata":{}},{"cell_type":"code","source":"test_dir = working_dir + 'test1/'\nfor dirname, _, filenames in os.walk(test_dir):\n    for filename in filenames[0:3]:\n        print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:27.140549Z","iopub.execute_input":"2022-04-09T14:47:27.14358Z","iopub.status.idle":"2022-04-09T14:47:27.179092Z","shell.execute_reply.started":"2022-04-09T14:47:27.143539Z","shell.execute_reply":"2022-04-09T14:47:27.178469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Plot a few training images.","metadata":{}},{"cell_type":"code","source":"image_files = [\"/kaggle/working/train/dog.918.jpg\",\n               \"/kaggle/working/train/dog.7156.jpg\",\n               \"/kaggle/working/train/dog.10335.jpg\"]\n\nfor i, img_dir in enumerate(image_files):\n  img = mpimg.imread(img_dir)\n  plt.imshow(img)\n  plt.axis('Off')\n  plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:27.183853Z","iopub.execute_input":"2022-04-09T14:47:27.186479Z","iopub.status.idle":"2022-04-09T14:47:27.844937Z","shell.execute_reply.started":"2022-04-09T14:47:27.186443Z","shell.execute_reply":"2022-04-09T14:47:27.844171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Print the number of training and test images.","metadata":{}},{"cell_type":"code","source":"print(len(os.listdir(train_dir)))\nprint(len(os.listdir(test_dir)))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:30.255704Z","iopub.execute_input":"2022-04-09T14:47:30.256556Z","iopub.status.idle":"2022-04-09T14:47:30.285226Z","shell.execute_reply.started":"2022-04-09T14:47:30.256515Z","shell.execute_reply":"2022-04-09T14:47:30.284315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Separate Resizing\nResize the training images and put the results in a new training directory.","metadata":{}},{"cell_type":"code","source":"destination_dir = working_dir + 'train_resized/'\nif (os.path.isdir(destination_dir) == False):\n    os.mkdir(destination_dir)\n\nfor dirname, _, filenames in os.walk(train_dir):\n    for filename in filenames:\n        input_path = os.path.join(dirname, filename)\n        img = image.load_img(input_path, target_size=(150, 150))\n        x = image.img_to_array(img)\n#         x = np.divide(x, 255.0)\n        output_path = os.path.join(destination_dir, filename)\n        utils.save_img(output_path, x, data_format='channels_last', file_format='jpeg', scale=False)\n        \ntrain_dir = working_dir + 'train_resized/'","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:47:31.059957Z","iopub.execute_input":"2022-04-09T14:47:31.06022Z","iopub.status.idle":"2022-04-09T14:48:51.903319Z","shell.execute_reply.started":"2022-04-09T14:47:31.060192Z","shell.execute_reply":"2022-04-09T14:48:51.902501Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Move the training images to separate subfolders so we can use an ImageDataGenerator and have it automatically create the labels from the subfolder names.","metadata":{}},{"cell_type":"code","source":"dog_files = [name for name in os.listdir(train_dir) if (name.split('.')[0]=='dog')]\nprint(dog_files[:3])\nprint(len(dog_files))\ncat_files = [name for name in os.listdir(train_dir) if (name.split('.')[0]=='cat')]\nprint(cat_files[:3])\nprint(len(cat_files))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:49:45.488449Z","iopub.execute_input":"2022-04-09T14:49:45.488719Z","iopub.status.idle":"2022-04-09T14:49:45.535672Z","shell.execute_reply.started":"2022-04-09T14:49:45.488689Z","shell.execute_reply":"2022-04-09T14:49:45.534862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_subs_dir = working_dir + 'train_subs/'\nif (os.path.isdir(train_subs_dir) == False):\n    os.mkdir(train_subs_dir)\n\ntrain_subs_dog_dir = train_subs_dir + 'dog/'\nif (os.path.isdir(train_subs_dog_dir) == False):\n    os.mkdir(train_subs_dog_dir)\n\ntrain_subs_cat_dir = train_subs_dir + 'cat/'\nif (os.path.isdir(train_subs_cat_dir) == False):\n    os.mkdir(train_subs_cat_dir)\n\nprint(train_subs_dir)\nprint(train_subs_dog_dir)\nprint(train_subs_cat_dir)\n\nfor name in dog_files:\n    shutil.copyfile(train_dir + name, train_subs_dog_dir + name)\n    \nfor name in cat_files:\n    shutil.copyfile(train_dir + name, train_subs_cat_dir + name)","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:49:52.951597Z","iopub.execute_input":"2022-04-09T14:49:52.951878Z","iopub.status.idle":"2022-04-09T14:49:54.767396Z","shell.execute_reply.started":"2022-04-09T14:49:52.951849Z","shell.execute_reply":"2022-04-09T14:49:54.766614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for dirname, _, filenames in os.walk(train_subs_dog_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))\n\nfor dirname, _, filenames in os.walk(train_subs_cat_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:49:57.045528Z","iopub.execute_input":"2022-04-09T14:49:57.046076Z","iopub.status.idle":"2022-04-09T14:49:57.085113Z","shell.execute_reply.started":"2022-04-09T14:49:57.046038Z","shell.execute_reply":"2022-04-09T14:49:57.084337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(os.listdir(train_subs_dog_dir)))\nprint(len(os.listdir(train_subs_cat_dir)))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:49:58.392112Z","iopub.execute_input":"2022-04-09T14:49:58.392656Z","iopub.status.idle":"2022-04-09T14:49:58.414785Z","shell.execute_reply.started":"2022-04-09T14:49:58.392618Z","shell.execute_reply":"2022-04-09T14:49:58.414107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Use the last 2500 dog images and the last 2500 cat images as the validation set.","metadata":{}},{"cell_type":"code","source":"val_subs_dir = working_dir + 'val_subs/'\nif (os.path.isdir(val_subs_dir) == False):\n    os.mkdir(val_subs_dir)\n\nval_subs_dog_dir = val_subs_dir + 'dog/'\nif (os.path.isdir(val_subs_dog_dir) == False):\n    os.mkdir(val_subs_dog_dir)\n\nval_subs_cat_dir = val_subs_dir + 'cat/'\nif (os.path.isdir(val_subs_cat_dir) == False):\n    os.mkdir(val_subs_cat_dir)","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:02.397925Z","iopub.execute_input":"2022-04-09T14:50:02.398561Z","iopub.status.idle":"2022-04-09T14:50:02.405346Z","shell.execute_reply.started":"2022-04-09T14:50:02.398518Z","shell.execute_reply":"2022-04-09T14:50:02.404448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for name in dog_files[:2500]:\n    os.rename(train_subs_dog_dir + name, val_subs_dog_dir + name)\nfor name in cat_files[:2500]:\n    os.rename(train_subs_cat_dir + name, val_subs_cat_dir + name)","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:04.390926Z","iopub.execute_input":"2022-04-09T14:50:04.391443Z","iopub.status.idle":"2022-04-09T14:50:04.495633Z","shell.execute_reply.started":"2022-04-09T14:50:04.391403Z","shell.execute_reply":"2022-04-09T14:50:04.494871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_subs_dog_dir)\nprint(len(os.listdir(train_subs_dog_dir)))\nfor dirname, _, filenames in os.walk(train_subs_dog_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))\n\nprint(train_subs_cat_dir)\nprint(len(os.listdir(train_subs_cat_dir)))\nfor dirname, _, filenames in os.walk(train_subs_cat_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))\n\nprint(val_subs_dog_dir)\nprint(len(os.listdir(val_subs_dog_dir)))\nfor dirname, _, filenames in os.walk(val_subs_dog_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))\n\nprint(val_subs_cat_dir)\nprint(len(os.listdir(val_subs_cat_dir)))\nfor dirname, _, filenames in os.walk(val_subs_cat_dir):\n    for filename in filenames[:3]:\n        print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:07.336483Z","iopub.execute_input":"2022-04-09T14:50:07.337273Z","iopub.status.idle":"2022-04-09T14:50:07.398016Z","shell.execute_reply.started":"2022-04-09T14:50:07.337227Z","shell.execute_reply":"2022-04-09T14:50:07.397308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create the image data generators.","metadata":{}},{"cell_type":"code","source":"train_subs_dir = working_dir + 'train_subs/'\nval_subs_dir = working_dir + 'val_subs/'\n\ntraining_datagen = ImageDataGenerator(\n      rescale = 1./255,\n#       rotation_range=20,\n#       width_shift_range=0.2,\n#       height_shift_range=0.2,\n#       shear_range=0.2,\n#       zoom_range=0.2,\n#       horizontal_flip=True,\n#       fill_mode='nearest'\n)\n\ntrain_generator = training_datagen.flow_from_directory(\n    train_subs_dir,\n    target_size=(150,150),\n    class_mode='binary',\n    batch_size=128\n)\n\nvalidation_datagen = ImageDataGenerator(rescale = 1./255)\n\nvalidation_generator = validation_datagen.flow_from_directory(\n    val_subs_dir,\n    target_size=(150,150),\n    class_mode='binary',\n    batch_size=128\n)","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:30.973163Z","iopub.execute_input":"2022-04-09T14:50:30.973568Z","iopub.status.idle":"2022-04-09T14:50:31.784901Z","shell.execute_reply.started":"2022-04-09T14:50:30.973525Z","shell.execute_reply":"2022-04-09T14:50:31.784198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create the model.","metadata":{}},{"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    # Note the input shape is the desired size of the image 150x150 with 3 bytes color\n    # This is the first convolution\n    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.MaxPooling2D(2, 2),\n    # The second convolution\n    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    # The third convolution\n    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    # The fourth convolution\n    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    # Flatten the results to feed into a DNN\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dropout(0.5),\n    # 512 neuron hidden layer\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:37.140878Z","iopub.execute_input":"2022-04-09T14:50:37.141626Z","iopub.status.idle":"2022-04-09T14:50:37.5779Z","shell.execute_reply.started":"2022-04-09T14:50:37.141592Z","shell.execute_reply":"2022-04-09T14:50:37.577029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Compile the model.","metadata":{}},{"cell_type":"code","source":"model.compile(loss = 'binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n\n# model.compile(optimizer = RMSprop(learning_rate=0.0001), \n#                 loss = 'binary_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:43.745559Z","iopub.execute_input":"2022-04-09T14:50:43.745851Z","iopub.status.idle":"2022-04-09T14:50:43.760654Z","shell.execute_reply.started":"2022-04-09T14:50:43.745801Z","shell.execute_reply":"2022-04-09T14:50:43.759875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create callbacks.","metadata":{}},{"cell_type":"code","source":"class myCallback(tf.keras.callbacks.Callback):\n  def on_epoch_end(self, epoch, logs={}):\n    if(logs.get('accuracy')>0.99):\n      print(\"\\nReached 99% accuracy, cancelling training\")\n      self.model.stop_training = True","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:50:46.018449Z","iopub.execute_input":"2022-04-09T14:50:46.018712Z","iopub.status.idle":"2022-04-09T14:50:46.0237Z","shell.execute_reply.started":"2022-04-09T14:50:46.018683Z","shell.execute_reply":"2022-04-09T14:50:46.022958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Train the model.","metadata":{}},{"cell_type":"code","source":"callbacks = myCallback()\nmodel.fit(train_generator,\n          validation_data = validation_generator,\n          epochs=25,\n          batch_size=128,\n          verbose = 0,\n          validation_steps=3,\n          callbacks=callbacks\n         )\n\nmodel.save(\"rps.h5\")","metadata":{"execution":{"iopub.status.busy":"2022-04-09T14:51:24.320278Z","iopub.execute_input":"2022-04-09T14:51:24.320988Z","iopub.status.idle":"2022-04-09T15:02:41.746837Z","shell.execute_reply.started":"2022-04-09T14:51:24.32095Z","shell.execute_reply":"2022-04-09T15:02:41.746057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Results\n## No separate resizing, no acceleration\nTraining duration per epoch: unknown, at least 6 minutes.\n\n## No separate resizing, GPU acceleration\nTraining duration per epoch: ~75 seconds\n\n## Separate resizing, no acceleration\nTraining duration per epoch: ~31 seconds\n\n## Separate resizing, GPU acceleration\nTraining duration per epoch: ~31 seconds","metadata":{}},{"cell_type":"code","source":"print(len(os.listdir(test_dir)))\ntest_files = os.listdir(test_dir)\nprint(test_files[:3])\nid_strings = [name.split('.')[0] for name in os.listdir(test_dir)]\ntest_ids = list(map(int, id_strings))\ntest_ids.sort()\n# print(test_ids) # it looks like test_ids - ie. the numbers in the test image file names - is simply a list from 1 thru 12500\nprint(min(test_ids))\nprint(max(test_ids))\nsorted_id_strings = [(test_dir+str(test_id)+'.jpg') for test_id in test_ids]\nprint(sorted_id_strings[:10])","metadata":{"execution":{"iopub.status.busy":"2022-04-04T19:38:15.137387Z","iopub.execute_input":"2022-04-04T19:38:15.137752Z","iopub.status.idle":"2022-04-04T19:38:15.187574Z","shell.execute_reply.started":"2022-04-04T19:38:15.137703Z","shell.execute_reply":"2022-04-04T19:38:15.185524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for name in sorted_id_strings[:10]:\n    img = image.load_img(name, target_size=(150, 150))\n    x = image.img_to_array(img)\n    x = np.divide(x, 255.0)\n    x = np.expand_dims(x, axis=0)\n    \n    images = np.vstack([x])\n    classes = model.predict(images)\n    print(name)\n    print(classes[0][0])\n    if classes[0][0]>0.5:\n      print(\"Dog\")\n    else:\n      print(\"Cat\")\n    plt.imshow(img)\n    plt.axis('Off')\n    plt.show()\n    print()","metadata":{"execution":{"iopub.status.busy":"2022-04-04T19:38:15.189196Z","iopub.execute_input":"2022-04-04T19:38:15.189652Z","iopub.status.idle":"2022-04-04T19:38:17.392343Z","shell.execute_reply.started":"2022-04-04T19:38:15.189603Z","shell.execute_reply":"2022-04-04T19:38:17.391295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = []\n\nfor name in sorted_id_strings:\n    img = image.load_img(name, target_size=(150, 150))\n    x = image.img_to_array(img)\n    x = np.divide(x, 255.0)\n    x = np.expand_dims(x, axis=0)\n    \n    images = np.vstack([x])\n    classes = model.predict(images)\n    if classes[0][0]>0.5:\n      prediction = 1 # Dog\n    else:\n      prediction = 0 # Cat\n    predictions.append(prediction)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T19:38:17.394081Z","iopub.execute_input":"2022-04-04T19:38:17.394763Z","iopub.status.idle":"2022-04-04T19:48:49.114526Z","shell.execute_reply.started":"2022-04-04T19:38:17.394714Z","shell.execute_reply":"2022-04-04T19:48:49.113495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(predictions))\ndf = pd.DataFrame()\ndf['id'] = test_ids\ndf['label'] = predictions\nprint(df)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T19:48:49.116213Z","iopub.execute_input":"2022-04-04T19:48:49.116579Z","iopub.status.idle":"2022-04-04T19:48:49.163782Z","shell.execute_reply.started":"2022-04-04T19:48:49.116519Z","shell.execute_reply":"2022-04-04T19:48:49.16239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T19:48:49.168672Z","iopub.execute_input":"2022-04-04T19:48:49.168934Z","iopub.status.idle":"2022-04-04T19:48:49.199477Z","shell.execute_reply.started":"2022-04-04T19:48:49.168888Z","shell.execute_reply":"2022-04-04T19:48:49.198484Z"},"trusted":true},"execution_count":null,"outputs":[]}]}