{"cells":[{"metadata":{"id":"k0NBYHWZHXNJ","outputId":"0d02a3ab-7dbe-4d7d-c40e-8f90fa53c4cc","trusted":false},"cell_type":"code","source":"from tensorflow.python.keras.preprocessing.image import ImageDataGenerator,load_img\nfrom tensorflow.python.keras.models import Sequential,model_from_json\nfrom tensorflow.python.keras.preprocessing import image\nfrom tensorflow.keras.callbacks            import ReduceLROnPlateau, ModelCheckpoint\nfrom tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense\nfrom keras.applications import VGG16\nfrom tensorflow.python.keras.optimizers import Adam\nimport numpy as np\nimport os \nfrom keras.preprocessing.image import img_to_array\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport os\nimport zipfile\nimport cv2\nimport shutil\nimport random\nimport pandas as pd\nfrom matplotlib.image import imread\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg","execution_count":null,"outputs":[]},{"metadata":{"id":"g1cOevkCqAiA"},"cell_type":"markdown","source":"## UPLOADING FILES\n\n---\n\n"},{"metadata":{"id":"krUjepA3JWkD","outputId":"759a03fe-3d5e-47c2-881b-cb8a219c55f8","trusted":false},"cell_type":"code","source":"file = files.upload()\np = os.path.abspath('kaggle.json')\nprint(p)","execution_count":null,"outputs":[]},{"metadata":{"id":"ZXkgZhLiJa8K","outputId":"0a456007-6acf-422e-fd57-fc625e3d8b96","trusted":false},"cell_type":"code","source":"!pip install kaggle","execution_count":null,"outputs":[]},{"metadata":{"id":"eZUCbYAkJesL","outputId":"fe79d145-ef07-4f93-dd1f-8626db5345a3","trusted":false},"cell_type":"code","source":"!mkdir ~/.kaggle\np = os.path.abspath('.kaggle')\nprint(p)\n!ls","execution_count":null,"outputs":[]},{"metadata":{"id":"iSCq0uhmJj76","outputId":"a0f27c66-b83e-4c6e-df6b-025454d9ce71","trusted":false},"cell_type":"code","source":"!mv /content/kaggle.json ~/.kaggle\n!kaggle competitions download -c dogs-vs-cats","execution_count":null,"outputs":[]},{"metadata":{"id":"RU_eRq9wJpkx","trusted":false},"cell_type":"code","source":"!unzip '/content/test1.zip'\n!unzip '/content/train.zip'","execution_count":null,"outputs":[]},{"metadata":{"id":"U2aQzz2LLFbb"},"cell_type":"markdown","source":"## Data Preparation\n\n---\n\n"},{"metadata":{"id":"FiflXFQHLE4d","trusted":false},"cell_type":"code","source":"# Каталог с набором данных\ndata_dir = '/content/train'\n# Каталог с данными для обучения\ntrain_dir = 'train01'\ntest_sub = 'final-dataset'\n# Каталог с данными для проверки\nval_dir = 'val'\n# Каталог с данными для тестирования\ntest_dir = 'test01'\n# Часть набора данных для тестирования\ntest_data_portion = 0.15\n# Часть набора данных для проверки\nval_data_portion = 0.15\n# Количество элементов данных в одном классе\nnb_images = 12500","execution_count":null,"outputs":[]},{"metadata":{"id":"1PfujcdcLY0i","trusted":false},"cell_type":"code","source":"def create_directory(dir_name):\n    if os.path.exists(dir_name):\n        shutil.rmtree(dir_name)\n    os.makedirs(dir_name)\n    os.makedirs(os.path.join(dir_name, \"cats\"))\n    os.makedirs(os.path.join(dir_name, \"dogs\"))","execution_count":null,"outputs":[]},{"metadata":{"id":"ed71M_t_L0ZG","trusted":false},"cell_type":"code","source":"create_directory(train_dir)\ncreate_directory(val_dir)\ncreate_directory(test_sub)\ncreate_directory(test_dir)","execution_count":null,"outputs":[]},{"metadata":{"id":"lzom4Nl6MXuT","trusted":false},"cell_type":"code","source":"def copy_images(start_index, end_index, source_dir, dest_dir):\n    for i in range(start_index, end_index):\n        shutil.copy2(os.path.join(source_dir, \"cat.\" + str(i) + \".jpg\"), \n                    os.path.join(dest_dir, \"cats\"))\n        shutil.copy2(os.path.join(source_dir, \"dog.\" + str(i) + \".jpg\"), \n                   os.path.join(dest_dir, \"dogs\"))","execution_count":null,"outputs":[]},{"metadata":{"id":"_D5nsPLUMh6U","outputId":"094c9321-8020-4e93-831a-34785b1557be","trusted":false},"cell_type":"code","source":"final_data = int(nb_images * 0.5)\nstart_val_data_idx = int(nb_images * (1 - val_data_portion - test_data_portion))\nstart_test_data_idx = int(nb_images * (1 - test_data_portion))\nprint(start_val_data_idx)\nprint(final_data)\nprint(start_test_data_idx)","execution_count":null,"outputs":[]},{"metadata":{"id":"-dmWu_JeMu3J","trusted":false},"cell_type":"code","source":"test = '/content/test1'\ncopy_images(0, final_data, data_dir, test_sub)\ncopy_images(0, start_val_data_idx, data_dir, train_dir)\ncopy_images(start_val_data_idx, start_test_data_idx, data_dir, val_dir)\ncopy_images(start_test_data_idx, nb_images, data_dir, test_dir)","execution_count":null,"outputs":[]},{"metadata":{"id":"Bdw53Ut7Hi56","trusted":false},"cell_type":"code","source":"img_width, img_height = 150, 150\ninput_shape = (img_width, img_height, 3)\nbatch_size = 10\nnb_train_samples = 17500\nnb_validation_samples = 3750\nnb_test_samples = 3750","execution_count":null,"outputs":[]},{"metadata":{"id":"Zy5XcgR18G2g","outputId":"c8f5b6ac-fa38-4028-8a9f-5b8a00b68a0b","trusted":false},"cell_type":"code","source":"# define location of dataset\nfolder = '/content/train/'\n# plot first few images\nfor i in range(9):\n\t# define subplot\n\tplt.subplot(330 + 1 + i)\n\t# define filename\n\tfilename = folder + 'dog.' + str(i) + '.jpg'\n\t# load image pixels\n\timage = imread(filename)\n\t# plot raw pixel data\n\tplt.imshow(image)\n# show the figure\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"id":"Bk3psLKrPrtu"},"cell_type":"markdown","source":"## Creating model\n\n---\n\n\n\n---\n\n"},{"metadata":{"id":"R_kzGrn0v-mj","outputId":"580d44a0-3d18-486f-99d3-f8ceb9b1dddf","trusted":false},"cell_type":"code","source":"vgg16_net = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))","execution_count":null,"outputs":[]},{"metadata":{"id":"hpzcB2Ue2-8F","trusted":false},"cell_type":"code","source":"datagen = ImageDataGenerator(rescale=1. / 255)","execution_count":null,"outputs":[]},{"metadata":{"id":"zyRorfApq-O-","outputId":"cb534695-726d-4eba-9d90-2060e81b5b8a","trusted":false},"cell_type":"code","source":"train_dir = '/content/train01'\ntrain_generator = datagen.flow_from_directory(\n    train_dir,\n    target_size=(img_width,img_height),\n    batch_size=batch_size,\n    class_mode=None,\n    shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"Wn1REjvnrgho","outputId":"a7e0f073-12eb-47ea-e6dd-d90605cff3f3","trusted":false},"cell_type":"code","source":"val_generator = datagen.flow_from_directory(\n    val_dir,\n    target_size=(img_width, img_height),\n    batch_size=batch_size,\n    class_mode=None,\n    shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"gjPrMZ4Hrm55","outputId":"1df220f5-5b38-46da-fa80-bc2b76a53365","trusted":false},"cell_type":"code","source":"test_generator = datagen.flow_from_directory(\n    test_dir,\n    target_size=(img_width, img_height),\n    batch_size=batch_size,\n    class_mode=None,\n    shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"6Z6qGHLhUq6G","trusted":false},"cell_type":"code","source":"features_train = vgg16_net.predict_generator(\n        train_generator, \n        nb_train_samples // batch_size)\nnp.save(open('/content/features_train.npy', 'wb'), features_train)","execution_count":null,"outputs":[]},{"metadata":{"id":"ZiV-rtdpl6cf","trusted":false},"cell_type":"code","source":"features_val = vgg16_net.predict_generator(\n        val_generator, nb_validation_samples // batch_size)\nnp.save(open('/content/features_val.npy', 'wb'), features_val)","execution_count":null,"outputs":[]},{"metadata":{"id":"xM289_XJmHJJ","trusted":false},"cell_type":"code","source":"features_test = vgg16_net.predict_generator(\n        test_generator, nb_test_samples // batch_size)\nnp.save(open('/content/features_test.npy', 'wb'), features_test)","execution_count":null,"outputs":[]},{"metadata":{"id":"3SZIFi3AQ7ka","trusted":false},"cell_type":"code","source":"labels_train =  np.array(\n        [0] * (nb_train_samples // 2) + [1] * (nb_train_samples // 2))\nlabels_val =  np.array(\n        [0] * (nb_validation_samples // 2) + [1] * (nb_validation_samples // 2))\nlabels_test =  np.array(\n        [0] * (nb_test_samples // 2) + [1] * (nb_test_samples // 2))","execution_count":null,"outputs":[]},{"metadata":{"id":"A8Kau3CaREqa","trusted":false},"cell_type":"code","source":"features_train = np.load(open('features_train.npy', 'rb'))\nfeatures_val = np.load(open('features_val.npy', 'rb'))\nfeatures_test = np.load(open('features_test.npy', 'rb'))","execution_count":null,"outputs":[]},{"metadata":{"id":"gytYv5crvv3E","trusted":false},"cell_type":"code","source":"def model_init_():\n  model = Sequential()\n  model.add(Flatten(input_shape=features_train.shape[1:]))\n  model.add(Dense(512, activation='relu'))\n  model.add(Dropout(0.5))\n  model.add(Dense(1, activation='sigmoid'))\n  return model\nmodel = model_init_()","execution_count":null,"outputs":[]},{"metadata":{"id":"Xhj5_qEmRKpI","trusted":false},"cell_type":"code","source":"model.compile(optimizer='Adam',\n              loss='binary_crossentropy', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"id":"YO7Lhx6Iidsj","trusted":false},"cell_type":"code","source":"сheckpoint = ModelCheckpoint('content/mnist-cnn.h5', \n                              monitor='val_acc', \n                              save_best_only=True,\n                              verbose=1)\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)","execution_count":null,"outputs":[]},{"metadata":{"id":"flfMS3niRNH3","outputId":"c27c17cf-dcfa-4e6e-bc46-47e09e26e5af","trusted":false},"cell_type":"code","source":"history = model.fit(features_train, labels_train,\n              epochs=30,\n              batch_size=64,\n              validation_data=(features_val, labels_val), \n              verbose=2,\n              callbacks=[сheckpoint, learning_rate_reduction])","execution_count":null,"outputs":[]},{"metadata":{"id":"WbBB761ElY9U","trusted":false},"cell_type":"code","source":"model.save('/content/model01.h5')","execution_count":null,"outputs":[]},{"metadata":{"id":"7WKEZgTykaue","outputId":"426202b2-4a69-4085-cb61-12e3e383315a","trusted":false},"cell_type":"code","source":"def plot_model_history(model_history, acc='accuracy', val_acc='val_accuracy'):\n    fig, axs = plt.subplots(1,2,figsize=(15,5))\n    axs[0].plot(range(1,len(model_history.history[acc])+1),model_history.history[acc])\n    axs[0].plot(range(1,len(model_history.history[val_acc])+1),model_history.history[val_acc])\n    axs[0].set_title('Model Accuracy')\n    axs[0].set_ylabel('Accuracy')\n    axs[0].set_xlabel('Epoch')\n    axs[0].set_xticks(np.arange(1,len(model_history.history[acc])+1),len(model_history.history[acc])/10)\n    axs[0].legend(['train', 'val'], loc='best')\n    axs[1].plot(range(1,len(model_history.history['loss'])+1),model_history.history['loss'])\n    axs[1].plot(range(1,len(model_history.history['val_loss'])+1),model_history.history['val_loss'])\n    axs[1].set_title('Model Loss')\n    axs[1].set_ylabel('Loss')\n    axs[1].set_xlabel('Epoch')\n    axs[1].set_xticks(np.arange(1,len(model_history.history['loss'])+1),len(model_history.history['loss'])/10)\n    axs[1].legend(['train', 'val'], loc='best')\n    plt.show()\n    \nplot_model_history(history)","execution_count":null,"outputs":[]},{"metadata":{"id":"sJRPBU5lRRSg","outputId":"5f734c15-f004-4188-b7eb-9607eebece43","trusted":false},"cell_type":"code","source":"scores = model.evaluate(features_test, labels_test, verbose=1)\nprint(\"Аккуратность на тестовых данных: %.2f%%\" % (scores[1]*100))","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}