{"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 os\nfrom pathlib import Path\nimport shutil as sh\nimport random\n\n\n# model\nfrom keras.models import Sequential\n\n# layers\nfrom keras.layers import Dense\nfrom keras.layers import Conv2D\nfrom keras.layers import MaxPool2D\nfrom keras.layers import Flatten\n\n# pretarined model\nfrom keras.applications import VGG16\n\n# kekeras.applicationss\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.preprocessing import image\n\n\n# visual stuffs\nimport matplotlib.pyplot as plt\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-03T15:36:19.761251Z","iopub.execute_input":"2023-11-03T15:36:19.761641Z","iopub.status.idle":"2023-11-03T15:36:27.810188Z","shell.execute_reply.started":"2023-11-03T15:36:19.761606Z","shell.execute_reply":"2023-11-03T15:36:27.808707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main_dir = '/kaggle/working/cats_dogs'\ntrain_dir = '/kaggle/working/cats_dogs/train'\ntest_dir = '/kaggle/working/cats_dogs/test'\nvalidation_dir = '/kaggle/working/cats_dogs/validation'\ntrain_cats_dir = '/kaggle/working/cats_dogs/train/cats'\ntest_cats_dir = '/kaggle/working/cats_dogs/test/cats'\nvalidation_cats_dir = '/kaggle/working/cats_dogs/validation/cats'\ntrain_dogs_dir = '/kaggle/working/cats_dogs/train/dogs'\ntest_dogs_dir = '/kaggle/working/cats_dogs/test/dogs'\nvalidation_dogs_dir = '/kaggle/working/cats_dogs/validation/dogs'\n\ndir_list = [\n    main_dir, train_dir, test_dir, validation_dir,\n    train_cats_dir, test_cats_dir, validation_cats_dir,\n    train_dogs_dir, test_dogs_dir, validation_dogs_dir   \n]\n\ndef create_dir(dir_str):\n    Path(dir_str).mkdir(parents=True, exist_ok=True)\n    \n\nfor dir_str in dir_list:\n    create_dir(dir_str)","metadata":{"execution":{"iopub.status.busy":"2023-11-03T15:43:38.921286Z","iopub.execute_input":"2023-11-03T15:43:38.922168Z","iopub.status.idle":"2023-11-03T15:43:38.929286Z","shell.execute_reply.started":"2023-11-03T15:43:38.922135Z","shell.execute_reply":"2023-11-03T15:43:38.928437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_images(files_dir):\n    files_list = []\n    for dirname, _, filenames in os.walk(files_dir):\n        for filename in filenames:\n            if filename.endswith('.jpg'):\n                files_list.append(os.path.join(dirname, filename))\n    return files_list","metadata":{"execution":{"iopub.status.busy":"2023-11-03T15:43:42.760907Z","iopub.execute_input":"2023-11-03T15:43:42.761275Z","iopub.status.idle":"2023-11-03T15:43:42.766569Z","shell.execute_reply.started":"2023-11-03T15:43:42.761244Z","shell.execute_reply":"2023-11-03T15:43:42.765750Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cats_dir = '/kaggle/input/cats-vs-dogs/PetImages/Cat'\ncats_list = get_images(cats_dir)\n\ndogs_dir = '/kaggle/input/cats-vs-dogs/PetImages/Dog'\ndogs_list = get_images(dogs_dir)\n\nprint(cats_list[0], cats_list[-1])\nprint(len(cats_list))\n\nprint(dogs_list[0], dogs_list[-1])\nprint(len(dogs_list))","metadata":{"execution":{"iopub.status.busy":"2023-11-03T15:43:42.907941Z","iopub.execute_input":"2023-11-03T15:43:42.908546Z","iopub.status.idle":"2023-11-03T15:43:52.530066Z","shell.execute_reply.started":"2023-11-03T15:43:42.908511Z","shell.execute_reply":"2023-11-03T15:43:52.529134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def split_train_test_validation(main_list, train_size, shuffle_times):\n    test_size = (len(main_list) - train_size)//2\n    \n    for _ in range(shuffle_times):\n        random.shuffle(main_list)\n    \n    train_list = main_list[:train_size]\n    val_test = main_list[train_size:]\n    test_list = val_test[:test_size]\n    validation_list = val_test[test_size:]\n    \n    print(len(train_list), len(test_list), len(validation_list))\n    print('*'*123)\n    return train_list, test_list, validation_list\n\ntrain_cats_list, test_cats_list, val_cats_list = split_train_test_validation(cats_list, 10000, 123)\n    \n    \ntrain_dogs_list, test_dogs_list, val_dogs_list = split_train_test_validation(dogs_list, 10000, 123)","metadata":{"execution":{"iopub.status.busy":"2023-11-03T15:43:52.531766Z","iopub.execute_input":"2023-11-03T15:43:52.532084Z","iopub.status.idle":"2023-11-03T15:43:54.954273Z","shell.execute_reply.started":"2023-11-03T15:43:52.532057Z","shell.execute_reply":"2023-11-03T15:43:54.953206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def move_file(source_img, move_dir):\n    file_name = source_img.split('/')[-1]\n    destination = move_dir + '/' + file_name\n    \n    sh.copyfile(source_img, destination)\n    \ndef move_files(source_list, move_dir):\n    for source_img in source_list:\n        move_file(source_img, move_dir)\n        \n        \nmove_files(train_cats_list, train_cats_dir)\nmove_files(test_cats_list, test_cats_dir)\nmove_files(val_cats_list, validation_cats_dir)\n\n\nmove_files(train_dogs_list, train_dogs_dir)\nmove_files(test_dogs_list, test_dogs_dir)\nmove_files(val_dogs_list, validation_dogs_dir)\n    ","metadata":{"execution":{"iopub.status.busy":"2023-11-03T15:43:54.955518Z","iopub.execute_input":"2023-11-03T15:43:54.955907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def check_files_moved(files_dir, file_type):\n    file_imgs = get_images(files_dir)\n    print(file_type)\n    print(len(file_imgs), file_imgs[0], file_imgs[-1])\n    print('*'*123)\n    \n    \ncheck_files_moved(train_cats_dir, 'train/cats')\ncheck_files_moved(test_cats_dir, 'test/cats')\ncheck_files_moved(validation_cats_dir, 'validation/cats')\n\ncheck_files_moved(train_dogs_dir, 'train/dogs')\ncheck_files_moved(test_dogs_dir, 'test/dogs')\ncheck_files_moved(validation_dogs_dir, 'validation/dogs')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen = ImageDataGenerator(rescale=1/255)\ntest_gen = ImageDataGenerator(rescale=1/255)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = train_gen.flow_from_directory(\n                    train_dir, \n                    target_size=(150, 150), \n                    batch_size=20, \n                    class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = test_gen.flow_from_directory(\n                    test_dir, \n                    target_size=(150, 150), \n                    batch_size=20, \n                    class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_generator = test_gen.flow_from_directory(\n                    validation_dir, \n                    target_size=(150, 150), \n                    batch_size=20, \n                    class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg = VGG16(weights='imagenet',\n            include_top=False,\n            input_shape=(150, 150, 3))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg.trainable = True\n\nfor layer in vgg.layers:\n    if layer.name == 'block5_conv1':\n        layer.trainable = True\n    else:\n        layer.trainable = False","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\n\nmodel.add(vgg)\nmodel.add(Flatten())\nmodel.add(Dense(200, activation='relu'))\nmodel.add(Dense(200, activation='relu'))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['acc'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hystory = model.fit(\n    train_generator, \n    steps_per_epoch=10, \n    epochs=20,\n    validation_data=valid_generator,\n    workers=32\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(valid_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(test_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}