{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Cats or dogs classifier\nResults given as 1 for dog, 0 for cat"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import zipfile\nimport os\nimport sys\nimport random\n\n\nval_ratio = 0.1\ntrain_dir = './train/'\ntest_dir  = './test/'\nval_dir   = './val/'\n\ndef unzip():\n    print('Unzipping...')\n    \n    with zipfile.ZipFile(\"../input/dogs-vs-cats-redux-kernels-edition/train.zip\",\"r\") as z:\n        z.extractall(\"./\")\n        \n    with zipfile.ZipFile(\"../input/dogs-vs-cats-redux-kernels-edition/test.zip\",\"r\") as z:\n        z.extractall(\"./\")\n        \n    print('Unzipped!')\n\ndef split_val_train():\n    print('Splitting train / val...')\n    try:\n        os.makedirs(train_dir+'cat/')\n        os.makedirs(train_dir+'dog/')\n        os.makedirs(val_dir)\n        os.makedirs(val_dir+'cat/')\n        os.makedirs(val_dir+'dog/')\n        os.makedirs(test_dir+'unknown/')\n    except OSError:\n        pass\n\n    dogs = []\n    cats = []\n    \n    for f in os.listdir(test_dir):\n        if not(os.path.isdir(test_dir+f)):\n            os.replace(test_dir + f, test_dir + 'unknown/' + f)\n\n    for f in os.listdir(train_dir):\n        s = f.split('.')\n        if len(s) > 2:\n            new_path = s[0] + '_' + s[1] + '.' + s[2]\n            os.replace(train_dir + f, train_dir + s[0] + '/' + new_path)\n            if s[0] == 'cat':\n                cats.append(new_path)\n            if s[0] == 'dog':\n                dogs.append(new_path)\n\n    print('Cur Dogs count:', len(dogs))\n    print('Cur Cats count:', len(cats))\n\n    dogs_val = random.sample(dogs, round(val_ratio*len(dogs)))\n    cats_val = random.sample(cats, round(val_ratio*len(cats)))\n\n    print('Target Dogs validation count:', len(dogs_val))\n    print('Target Cats validation count:', len(cats_val))\n    \n    for dog in dogs_val:\n        s = dog.split('.')\n        if len(s) > 1:\n            os.replace(train_dir+ 'dog/' + dog, val_dir + 'dog/' + dog)\n        \n    for cat in cats_val:\n        s = cat.split('.')\n        if len(s) > 1:\n            os.replace(train_dir+ 'cat/' + cat, val_dir + 'cat/' + cat)\n    \ndef prepare_data():\n    if not(os.path.exists(train_dir)):\n        unzip()\n        \n    if not(os.path.exists(val_dir)):\n        split_val_train()\n        \n    print('** Data prepared. Check out: **')\n        \n    print('Dogs count:', len(os.listdir(train_dir+'dog')))\n    print('Cats count:', len(os.listdir(train_dir+'cat')))\n\n    print('Dogs validation count:', len(os.listdir(val_dir+'dog')))\n    print('Cats validation count:', len(os.listdir(val_dir+'cat')))\n    \n    print('Test len:', len(os.listdir(test_dir+'unknown/')))\n\nprepare_data()\n\nimport numpy as np\nfrom tensorflow.python.keras.applications.resnet import ResNet50\nfrom tensorflow.python.keras.models import Sequential\nfrom tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D\n\nnum_classes = 2\nresnet_weights_path = '../input/resnet50/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'\n\nmy_new_model = Sequential()\nmy_new_model.add(ResNet50(include_top=False, pooling='avg', weights=resnet_weights_path))\nmy_new_model.add(Dense(num_classes, activation='softmax'))\n\n# Say not to train first layer (ResNet) model. It is already trained\nmy_new_model.layers[0].trainable = False\n\nmy_new_model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])\n\nfrom tensorflow.python.keras.applications.resnet import preprocess_input\nfrom tensorflow.python.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.python.keras.callbacks import ModelCheckpoint\n\nimage_size = 224\ndata_generator = ImageDataGenerator(preprocessing_function=preprocess_input,\n                                    shear_range=0.2,\n                                    zoom_range=0.2,\n                                    horizontal_flip=True)\ntest_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)\n\ntrain_generator = data_generator.flow_from_directory(\n        train_dir,\n        target_size=(image_size, image_size),\n        batch_size=24,\n        class_mode='categorical')\n\nvalidation_generator = test_datagen.flow_from_directory(\n        val_dir,\n        target_size=(image_size, image_size),\n        batch_size=24,\n        class_mode='categorical')\n\n# Создаем коллбек сохраняющий веса модели\ncheckpoint_path = \"./cp.ckpt\"\ncp_callback = ModelCheckpoint(filepath=checkpoint_path,\n                              save_weights_only=True,\n                              verbose=1,\n                              save_best_only=True)\ndoTrain = True\n\nif doTrain:\n    my_new_model.fit_generator(\n            train_generator,\n            steps_per_epoch=train_generator.n//24,\n            epochs=4,\n            validation_data=validation_generator,\n            validation_steps=validation_generator.n//24,\n            callbacks=[cp_callback])\n\n    \nmy_new_model.load_weights(checkpoint_path)\n\ntest_generator = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=(image_size, image_size),\n    class_mode=None,\n    shuffle=False,\n    seed=42,\n    batch_size=1)\n\n#loss, acc = my_new_model.evaluate(test_generator, test_labels, verbose=2)\nmy_new_model.evaluate_generator(generator=validation_generator, steps=validation_generator.n//32)\n\ntest_generator.reset()\n\npred = my_new_model.predict_generator(test_generator, steps=10, verbose=1)\n\npredicted_class_indices=np.argmax(pred,axis=1)\n\nprint(predicted_class_indices[0:10])\n\nprint(test_generator.filenames[0:10])","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}