{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.models import Sequential\nimport os, shutil\nimport zipfile","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"zip_ref = zipfile.ZipFile('../input/dogs-vs-cats/train.zip', 'r')\nzip_ref.extractall('train')\nzip_ref.close()\n\nzip_ref = zipfile.ZipFile('../input/dogs-vs-cats/test1.zip', 'r')\nzip_ref.extractall('test')\nzip_ref.close()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_full_dir = './train/train/'\ntest_full_dir = './test/test1/'\n\ncreate_if_not = ['training/dogs/','training/cats/','testing/']\nfor i in create_if_not:\n    if os.path.isdir(i) == 0:\n        os.makedirs(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_filenames = os.listdir(train_full_dir)\ncategories = []\nfor tr_filename in train_filenames:\n    category = tr_filename.split('.')[0]\n    if category == 'dog':\n        shutil.move(train_full_dir+ tr_filename, 'training/dogs/'+ tr_filename)\n    else:\n        shutil.move(train_full_dir+ tr_filename, 'training/cats/'+ tr_filename)\n\ntest_filenames = os.listdir(test_full_dir)\nfor t_filename in test_filenames:\n        shutil.move(test_full_dir+ t_filename, 'testing/'+ t_filename)\n        \nshutil.rmtree('./train')\nshutil.rmtree('./test')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Training Dog images: \",len(os.listdir('./training/dogs')))\nprint(\"Training Cat images: \",len(os.listdir('./training/cats')))\nprint(\"Testing images: \",len(os.listdir('./testing')))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_size = (180,180)\nbatch_size = 32\n\ntrain_ds = tf.keras.preprocessing.image_dataset_from_directory(\n    './training',\n    validation_split=0.2,\n    subset=\"training\",\n    seed=1337,\n    image_size=image_size,\n    batch_size=batch_size,\n)\nval_ds = tf.keras.preprocessing.image_dataset_from_directory(\n    './training',\n    validation_split=0.2,\n    subset=\"validation\",\n    seed=1337,\n    image_size=image_size,\n    batch_size=batch_size,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_names = train_ds.class_names","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"AUTOTUNE = tf.data.experimental.AUTOTUNE\ntrain_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\nval_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nnum_classes = 2\n\nmodel = Sequential([\n    layers.experimental.preprocessing.Rescaling(1./255, input_shape=(180, 180, 3)),\n    layers.experimental.preprocessing.RandomRotation(0.2),\n    layers.experimental.preprocessing.RandomZoom(0.2),\n\n    layers.Conv2D(16, 3, padding='same', activation='relu'),\n    layers.MaxPooling2D(),\n    layers.Conv2D(32, 3, padding='same', activation='relu'),\n    layers.MaxPooling2D(),\n    layers.Conv2D(64, 3, padding='same', activation='relu'),\n    layers.MaxPooling2D(),\n    layers.Flatten(),\n    layers.Dense(128, activation='relu'),\n    layers.Dense(num_classes)\n])\nmodel.compile(optimizer='adam',\n              loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs=50\ncallbacks = [keras.callbacks.ModelCheckpoint(\"./ckpt/save_at_{epoch}.h5\")]\nhistory = model.fit(train_ds, validation_data=val_ds,epochs=epochs, callbacks=callbacks)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('catsvsdogs-simple.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def display_training_curves(training, validation, title, subplot):\n    ax = plt.subplot(subplot)\n    ax.plot(training)\n    ax.plot(validation)\n    ax.set_title('model '+ title)\n    ax.set_ylabel(title)\n    ax.set_xlabel('epoch')\n    ax.legend(['training', 'validation'])\n\nplt.subplots(figsize=(10,10))\nplt.tight_layout()\ndisplay_training_curves(history.history['accuracy'], history.history['val_accuracy'], 'accuracy', 211)\ndisplay_training_curves(history.history['loss'], history.history['val_loss'], 'loss', 212)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import random\ntest_filenames = os.listdir('./testing')\nrand = random.choice(test_filenames)\nimage_path = './testing/' + rand\nimg = keras.preprocessing.image.load_img(image_path, target_size=(180, 180))\nimg_array = keras.preprocessing.image.img_to_array(img)\nimg_array = tf.expand_dims(img_array, 0)\n\npredictions = model.predict(img_array)\nscore = tf.nn.softmax(predictions[0])\n\nprint(\n    \"This image most likely belongs to {} with a {:.2f} percent confidence.\"\n    .format(class_names[np.argmax(score)].upper(), 100 * np.max(score))\n)\n\n\nfrom PIL import Image\nImage.open(image_path)  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}