{"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":"import zipfile\nimport os\nimport pandas as pd\nfrom numpy import asarray, save\nfrom keras_preprocessing.image import load_img, img_to_array\nfrom matplotlib import pyplot\nfrom random import seed, random\nfrom matplotlib.image import imread\nimport sys\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nwith zipfile.ZipFile('../input/dogs-vs-cats/train.zip', 'r') as z :\n    z.extractall()","metadata":{"execution":{"iopub.status.busy":"2021-12-22T04:31:05.668982Z","iopub.execute_input":"2021-12-22T04:31:05.669756Z","iopub.status.idle":"2021-12-22T04:31:25.550163Z","shell.execute_reply.started":"2021-12-22T04:31:05.669648Z","shell.execute_reply":"2021-12-22T04:31:25.549325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = \"./train/\"\ncategories = []\nphotos, labels = list(), list()\n\nfor image in os.listdir(filenames):\n    category = image.split('.')[0]\n    \n    if category == 'dog' :\n        categories.append(1)\n        photo = load_img(filenames + image, target_size=(200, 200))\n        photo = img_to_array(photo)\n        photos.append(photo)\n    else :    \n        categories.append(0)\n    \nphotos = asarray(photos)\nlabels = asarray(categories)\nprint(photos.shape, labels.shape)\n\nsave('dogs_vs_cats_photos.npy', photos)\nsave('dogs_vs_cats_labels.npy', labels)","metadata":{"execution":{"iopub.status.busy":"2021-12-22T04:31:45.124985Z","iopub.execute_input":"2021-12-22T04:31:45.125323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from numpy import load\n\nphotos = load('dogs_vs_cats_photos.npy')\nprint(photos.shape)\n\ndf = pd.DataFrame({'filename' : filenames, 'category' : categories})\ndf.head()\n\ndf['category'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-10-08T06:07:39.389025Z","iopub.status.idle":"2021-10-08T06:07:39.389321Z","shell.execute_reply.started":"2021-10-08T06:07:39.389172Z","shell.execute_reply":"2021-10-08T06:07:39.389187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from shutil import copyfile\n\ndataset_home = 'dataset_dogs_vs_cats/'\nsubdirs = ['train/', 'test/']\nfor subdir in subdirs:\n    labeldirs = ['dogs/', 'cats/']\n    for labldir in labeldirs:\n        newdir = dataset_home + subdir + labldir\n        os.makedirs(newdir, exist_ok=True)\n\nseed(1)\n\nval_ratio = 0.25\nfor image in os.listdir(filenames):\n    src = filenames + '/' + image\n    dst_dir = 'train/'\n    if random() < val_ratio:\n        dst_dir = 'test/'\n    if image.startswith('dog'):\n        dst = dataset_home + dst_dir + 'dogs/'  + image\n        copyfile(src, dst)\n    elif image.startswith('cat'):\n        dst = dataset_home + dst_dir + 'cats/'  + image\n        copyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2021-10-08T06:07:39.390641Z","iopub.status.idle":"2021-10-08T06:07:39.391026Z","shell.execute_reply.started":"2021-10-08T06:07:39.390826Z","shell.execute_reply":"2021-10-08T06:07:39.390846Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# define cnn model\ndef define_model():\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Flatten())\n    model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n    model.add(Dense(1, activation='sigmoid'))\n    \n    opt = SGD(lr=0.001, momentum=0.9)\n    model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n    return model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n    pyplot.subplot(211)\n    pyplot.title('Cross Entropy Loss')\n    pyplot.plot(history.history['loss'], color='blue', label='train')\n    pyplot.plot(history.history['val_loss'], color='orange', label='test')\n# plot accuracy\n    pyplot.subplot(212)\n    pyplot.title('Classification Accuracy')\n    pyplot.plot(history.history['accuracy'], color='blue', label='train')\n    pyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n    # save plot to file\n    filename = sys.argv[0].split('/')[-1]\n    pyplot.savefig(filename + '_plot.png')\n    pyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n    # define model\n    model = define_model()\n    # create data generator\n    datagen = ImageDataGenerator(rescale=1.0/255.0)\n\n    train_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/', class_mode='binary', batch_size=64, target_size=(200, 200))\n    test_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/', class_mode='binary', batch_size=64, target_size=(200, 200))\n\n    # fit model\n    history = model.fit_generator(train_it, steps_per_epoch=len(train_it), validation_data=test_it, validation_steps=len(test_it), epochs=20, verbose=0)\n    # evaluate model\n    _, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n    print('> %.3f' % (acc * 100.0))\n    # learning curves\n    summarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"execution":{"iopub.status.busy":"2021-10-07T10:24:18.723266Z","iopub.execute_input":"2021-10-07T10:24:18.72355Z","iopub.status.idle":"2021-10-07T10:49:31.15427Z","shell.execute_reply.started":"2021-10-07T10:24:18.723524Z","shell.execute_reply":"2021-10-07T10:49:31.153467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}