{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","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":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"zip_ref = zipfile.ZipFile('../input/dogs-vs-cats-redux-kernels-edition/train.zip', 'r')\nzip_ref.extractall('train')\nzip_ref.close()\n\ntrain_full_dir = './train/train/'\n\ncreate_if_not = ['training/dogs/','training/cats/']\nfor i in create_if_not:\n    if os.path.isdir(i) == 0:\n        os.makedirs(i)\ntrain_filenames = os.listdir(train_full_dir)\ncategories = []\nfor tr_filename in train_filenames[:8000]:\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\n        \nshutil.rmtree('./train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"width = 180\nheight = 180\ndepth = 3\nimage_size = (width,height)\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\nnum_classes = len(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":"data_augmentation = tf.keras.Sequential([\n    layers.experimental.preprocessing.RandomFlip(\"horizontal\"),\n    layers.experimental.preprocessing.RandomRotation(0.1),\n    layers.experimental.preprocessing.RandomZoom(0.1),\n])\n\nrest_of_the_model = tf.keras.Sequential([\n    layers.Conv2D(64, (5,5), activation = 'relu', padding = 'same'),\n    layers.MaxPool2D(2, strides = 2),\n    layers.Conv2D(128, (3,3), activation = 'relu', padding = 'same'),\n    layers.Conv2D(128, (3,3), activation = 'relu', padding = 'same'),\n    layers.MaxPool2D(2, strides = 2),\n    layers.Conv2D(256, (3,3), activation = 'relu', padding = 'same'),\n    layers.Conv2D(256, (3,3), activation = 'relu', padding = 'same'),\n    layers.MaxPool2D(2, strides = 2),\n    \n    layers.Flatten(),\n    layers.Dense(units=512, activation='elu'),\n    layers.Dropout(0.5),\n    layers.Dense(units=128, activation='elu'),\n    layers.Dropout(0.5),\n    layers.Dense(units=2, activation='softmax'),\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"input_shape = (180,180,3)\n    \ninputs = layers.Input(shape=input_shape)\nx = data_augmentation(inputs)\nx = keras.layers.experimental.preprocessing.Rescaling(1.0 / 255)(x)\noutputs = rest_of_the_model(x)\n\nmodel = keras.Model(inputs, outputs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=keras.optimizers.SGD(),loss=\"sparse_categorical_crossentropy\",metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_ds, epochs=20, validation_data=val_ds,)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('t1.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_weights('./t1.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_ds, epochs=50, validation_data=val_ds,)","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":"zip_ref = zipfile.ZipFile('../input/dogs-vs-cats-redux-kernels-edition/test.zip', 'r')\nzip_ref.extractall()\nzip_ref.close()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_path = './test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import random\ntest_filenames = os.listdir(test_path)\nrand = random.choice(test_filenames)\nimage_path = test_path + 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)\n#score = tf.nn.softmax(predictions[0])\n\nprint(\n\"This image most likely belongs to {} class with a {:.2f} percent confidence.\"\n.format(class_names[np.argmax(predictions)].upper(), 100 * np.max(predictions)))\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}