{"metadata":{"language_info":{"version":"3.6.4","name":"python","file_extension":".py","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python"},"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"}},"cells":[{"metadata":{"_uuid":"2de32751f0a5aa796956c99737a8d382560fed10","collapsed":true,"_cell_guid":"3f5791ff-74dd-4c06-89fb-d1e8f54f59a8"},"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 in \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 \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nfrom subprocess import check_output\n!uname -a\nprint(check_output([\"ls\", \"-l\", \"../input\"]).decode(\"utf8\"))\n#print(check_output([\"ls\", \"../input/train\"]).decode(\"utf8\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"12523d1d3d961a8b4cc8f800f93dae9365b14404","collapsed":true,"_cell_guid":"250e545a-4f4e-4a81-80b7-cbff3c0ea81d"},"source":"import os, shutil\noriginal_dataset_dir = '../input/train'\nbase_dir = './cats_and_dogs_small'\ntry:\n    os.mkdir(base_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntrain_dir = os.path.join(base_dir, 'train')\ntry:\n    os.mkdir(train_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\nvalidation_dir = os.path.join(base_dir, 'validation')\ntry:\n    os.mkdir(validation_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntest_dir = os.path.join(base_dir, 'test')\ntry:\n    os.mkdir(test_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntrain_cats_dir = os.path.join(train_dir, 'cats')\ntry:\n    os.mkdir(train_cats_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntrain_dogs_dir = os.path.join(train_dir, 'dogs')\ntry:\n    os.mkdir(train_dogs_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\nvalidation_cats_dir = os.path.join(validation_dir, 'cats')\ntry:\n    os.mkdir(validation_cats_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\nvalidation_dogs_dir = os.path.join(validation_dir, 'dogs')\ntry:\n    os.mkdir(validation_dogs_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntest_cats_dir = os.path.join(test_dir, 'cats')\ntry:\n    os.mkdir(test_cats_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\ntest_dogs_dir = os.path.join(test_dir, 'dogs')\ntry:\n    os.mkdir(test_dogs_dir)\nexcept FileExistsError:\n    print ('Directory already exists, no worries')\nfnames = ['cat.{}.jpg'.format(i) for i in range(1000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(train_cats_dir, fname)\n    shutil.copyfile(src, dst)\nfnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(validation_cats_dir, fname)\n    shutil.copyfile(src, dst)\nfnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(test_cats_dir, fname)\n    shutil.copyfile(src, dst)\nfnames = ['dog.{}.jpg'.format(i) for i in range(1000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(train_dogs_dir, fname)\n    shutil.copyfile(src, dst)\nfnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(validation_dogs_dir, fname)\n    shutil.copyfile(src, dst)\nfnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(test_dogs_dir, fname)\n    shutil.copyfile(src, dst)\n","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"ad3fb8b21be031be734e97e9aeff3aa4128d39b6","collapsed":true,"_cell_guid":"fea30a57-242d-459e-9a16-b06be613fc10"},"source":"!find . -type d\nprint('total training cat images:', len(os.listdir(train_cats_dir)))\nprint('total training dog images:', len(os.listdir(train_dogs_dir)))\nprint('total validation cat images:', len(os.listdir(validation_cats_dir)))\nprint('total validation dog images:', len(os.listdir(validation_dogs_dir)))\nprint('total test cat images:', len(os.listdir(test_cats_dir)))\nprint('total test dog images:', len(os.listdir(test_dogs_dir)))","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"d70bb21ce3fdb459014c46396c3a3788feb9e0c9","collapsed":true,"_cell_guid":"d9fde0fe-c533-47af-bdd4-1849d41ba253"},"source":"from keras import layers\nfrom keras import models\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3), activation='relu',\n    input_shape=(150, 150, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dense(1, activation='sigmoid'))\nmodel.summary()","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"868f3f555ea7336d9c5dc84a164334dc87866d3d","collapsed":true,"_cell_guid":"f605636e-e525-462b-b338-b6767eddf451"},"source":"from keras import optimizers\nmodel.compile(loss='binary_crossentropy',\n    optimizer=optimizers.RMSprop(lr=1e-4),\n    metrics=['acc'])\n\nfrom keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=20,\n    class_mode='binary')\nvalidation_generator = test_datagen.flow_from_directory(\n    validation_dir,\n    target_size=(150, 150),\n    batch_size=20,\n    class_mode='binary')","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"5b828d3828c2937fe50d294743b9b56b523d066d","collapsed":true,"_cell_guid":"b46a7563-1285-4566-b02f-758c40b2e04f"},"source":"def generator():\n    i=0\n    while True:\n        i += 1\n        yield i\n\ngen = generator()\nfor item in gen:\n    print(item)\n    if item > 3:\n        break\nprint (next(gen))\nprint (next(gen))","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"90af665a1d0122397e75d845c0f58f40b53dd1af","collapsed":true,"_cell_guid":"0dccfe3a-fceb-47ae-8c8e-4de4770cde7b"},"source":"data_batch, labels_batch = next(train_generator)\nprint('data batch shape:', data_batch.shape)\nprint('labels batch shape:', labels_batch.shape)\n","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"390a4c5d2c6db9623923a5883b76aee3f469750a","collapsed":true,"_cell_guid":"96360665-6e5d-40a3-8341-77c44ec89e85"},"source":"history = model.fit_generator(\n    train_generator,\n    steps_per_epoch=100,\n    epochs=5, # 30,\n    validation_data=validation_generator,\n    validation_steps=50)\nmodel.save('cats_and_dogs_small_1.h5')","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"60f4f1b356637b5186280704a8b5863403598493","collapsed":true,"_cell_guid":"9a2248a6-e04c-4a66-855e-36d89537fe06"},"source":"import matplotlib.pyplot as plt\nacc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1, len(acc) + 1)\nplt.plot(epochs, acc, 'bo', label='Training acc')\nplt.plot(epochs, val_acc, 'b', label='Validation acc')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\nplt.plot(epochs, loss, 'bo', label='Training loss')\nplt.plot(epochs, val_loss, 'b', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"f27069e9846d6b4f976b3d69095df9e97025145b","collapsed":true,"_cell_guid":"2c54e501-149d-41d5-9fe3-248ca3e3b8db"},"source":"from keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n    rotation_range=40,\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\nfrom keras.preprocessing import image\nfnames = [os.path.join(train_cats_dir, fname) for\n    fname in os.listdir(train_cats_dir)]\nimg_path = fnames[6]\nimg = image.load_img(img_path, target_size=(150, 150))\nx = image.img_to_array(img)\nprint ('Shape: ', x.shape)\nx = x.reshape((1,) + x.shape)\ni=0\nfor batch in datagen.flow(x, batch_size=1):\n    plt.figure(i)\n    imgplot = plt.imshow(image.array_to_img(batch[0]))\n    i += 1\n    if i % 4 == 0:\n        break\nplt.show()","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"2b9943c01ef8671fa9836d705d314a27718b3f8e","collapsed":true,"_cell_guid":"3dec9b39-0c75-4780-a262-af41b1b62a2c"},"source":"from keras import layers\nfrom keras import models\nfrom keras import optimizers\n\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3), activation='relu',\n    input_shape=(150, 150, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dense(1, activation='sigmoid'))\nmodel.compile(loss='binary_crossentropy',\n    optimizer=optimizers.RMSprop(lr=1e-4),\n    metrics=['acc'])\nmodel.summary()","execution_count":null,"cell_type":"code","outputs":[]},{"metadata":{"_uuid":"e177b08f28424e84ded897332c0cffc139afb2e9","collapsed":true,"_cell_guid":"f1444157-a322-4a2d-885a-a2245bf512a7"},"source":"train_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=40,\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,)\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary')\nvalidation_generator = test_datagen.flow_from_directory(\n    validation_dir,\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary')\nhistory = model.fit_generator(\n    train_generator,\n    steps_per_epoch=100,\n    epochs=2, # 100,\n    validation_data=validation_generator,\n    validation_steps=50)\nmodel.save('cats_and_dogs_small_2.h5')\n","execution_count":null,"cell_type":"code","outputs":[]}],"nbformat_minor":1,"nbformat":4}