{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Step1 : Sorting Data"},{"metadata":{"trusted":false},"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nimport os\nimport zipfile","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1.1 create empty folders"},{"metadata":{"trusted":false},"cell_type":"code","source":"# create a base_dir\nbase_dir = 'dogs-vs-cats'\nos.mkdir(base_dir)\n# create train_dir and test_dir\ntrain_dir = os.path.join(base_dir, 'train')\nval_dir = os.path.join(base_dir,'val')\nos.mkdir(train_dir)\nos.mkdir(val_dir)\n# create cats and dogs'train directories \ntrain_cats_dir = os.path.join(train_dir, 'cats')\ntrain_dogs_dir = os.path.join(train_dir, 'dogs')\nos.mkdir(train_cats_dir)\nos.mkdir(train_dogs_dir)\n# create cats and dogs'test directories \nval_cats_dir = os.path.join(val_dir, 'cats')\nval_dogs_dir = os.path.join(val_dir, 'dogs')\nos.mkdir(val_cats_dir)\nos.mkdir(val_dogs_dir)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1.2 divide original training dataset into cats and dogs in train directory"},{"metadata":{"trusted":false},"cell_type":"code","source":"import random\nimport shutil\nfrom shutil import copyfile\nfrom shutil import move\n\n# classify original dataset\nsource_train = 'train'\nfilenames_train = os.listdir(source_train)\nrandom.sample(filenames_train,len(filenames_train))\nprint('shuffle done')\n\nfor filename in filenames_train:\n    filesource = os.path.join(source_train, filename)\n    if os.path.getsize(filesource)==0:\n        continue\n    \n    if filename.split('.')[0] == 'cat':\n        copyfile(filesource, os.path.join(train_cats_dir,filename))\n    elif filename.split('.')[0] == 'dog':\n        copyfile(filesource, os.path.join(train_dogs_dir,filename))\n\nprint('Dividing DONE !')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1.3 split dataset ( some images from train to val)"},{"metadata":{"trusted":false},"cell_type":"code","source":"split_rate = 0.3\n\nprint('begin moving cats')\n\n# move some cats images to val set\nfilenames_cats = os.listdir(train_cats_dir)\nrandom.sample(filenames_cats, len(filenames_cats))\ncats_len = len(filenames_cats)\ni = 0\nwhile len(os.listdir(val_cats_dir)) < split_rate * cats_len:\n    move(os.path.join(train_cats_dir,filenames_cats[i]), val_cats_dir)\n    i += 1\n    \nprint('begin moving dogs')\n\n# move some dogs images to val set\nfilenames_dogs = os.listdir(train_dogs_dir)\nrandom.sample(filenames_dogs, len(filenames_dogs))\ndogs_len = len(filenames_dogs)\n\ni = 0\nwhile len(os.listdir(val_dogs_dir)) < split_rate * dogs_len:\n    move(os.path.join(train_dogs_dir,filenames_dogs[i]), val_dogs_dir)\n    i += 1\n    \nprint('Spliting DONE !')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"train_dir = 'dogs-vs-cats\\\\train'\nval_dir = 'dogs-vs-cats\\\\val'\ntrain_cats_dir = 'dogs-vs-cats\\\\train\\\\cats'\ntrain_dogs_dir = 'dogs-vs-cats\\\\train\\\\dogs'\nval_cats_dir = 'dogs-vs-cats\\\\val\\\\cats'\nval_dogs_dir = 'dogs-vs-cats\\\\val\\\\dogs'","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"print('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(val_cats_dir)))\nprint('total validation dog images:',len(os.listdir(val_dogs_dir)))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step2 : Data preprocessing"},{"metadata":{"trusted":false},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1.0 / 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,\n                                  fill_mode = 'nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"val_datagen = ImageDataGenerator(rescale = 1.0 / 255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"train_generator = train_datagen.flow_from_directory(train_dir,\n                                                   batch_size = 50,\n                                                   class_mode = 'binary',\n                                                   target_size = (150,150))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"val_generator = val_datagen.flow_from_directory(val_dir,\n                                                batch_size = 50,\n                                                class_mode = 'binary',\n                                                target_size = (150,150))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step3 : Modeling and Compile"},{"metadata":{"trusted":false},"cell_type":"code","source":"from tensorflow.keras.optimizers import RMSprop","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(150,150,3)),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dropout(0.1),\n    tf.keras.layers.Dense(1024,activation='relu'),\n    tf.keras.layers.Dropout(0.4),\n    tf.keras.layers.Dense(512,activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer = RMSprop(lr=0.0001), \n          loss = 'binary_crossentropy', \n          metrics = ['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step4 : Training"},{"metadata":{"trusted":false},"cell_type":"code","source":"history = model.fit(train_generator,\n                   steps_per_epoch = 350,\n                   epochs = 10,\n                   validation_data = val_generator,\n                   validation_steps = 150,\n                   verbose = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"model.save_weights(\"model.h5\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step5 : Visualize the accuracy and loss"},{"metadata":{"trusted":false},"cell_type":"code","source":"acc = history.history[\"accuracy\"]\nval_acc = history.history[\"val_accuracy\"]\nloss = history.history[\"loss\"]\nval_loss = history.history[\"val_loss\"]\nepochs = range(len(acc))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.plot(epochs,acc,label='train_accuracy')\nplt.plot(epochs,val_acc,label='validation_accuracy')\nplt.title('accuracy')\nplt.legend()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"plt.plot(epochs,loss,label='train_loss')\nplt.plot(epochs,val_loss,label='validation_loss')\nplt.title('loss')\nplt.legend()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step6 : Predict"},{"metadata":{"trusted":false},"cell_type":"code","source":"test_filenames = os.listdir(\"test\\\\test1\")\nprint(\"number of test images:\",len(test_filenames))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale = 1. /255)\ntest_generator = test_datagen.flow_from_directory(\"test\",\n                                                 class_mode = None,\n                                                 batch_size = 1,\n                                                 target_size = (150,150),\n                                                 shuffle=False)   #shuffle = False !!!","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"test_generator.reset()  # reset is necessary\npredict = model.predict(test_generator, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Step 7 : Output prediction results"},{"metadata":{"trusted":false},"cell_type":"code","source":"import numpy as np\n\npredicted_class_indices = predict\npredicted_class_indices[predicted_class_indices >= 0.5] = 1\npredicted_class_indices[predicted_class_indices < 0.5] = 0\npredicted_class_indices = predicted_class_indices.ravel()\npredicted_class_indices = list(predicted_class_indices)\n\nlabels = (train_generator.class_indices)\nlabel = dict((v,k) for k,v in labels.items())","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# 建立代码标签与真实标签的关系\npredictions = [label[i] for i in predicted_class_indices]","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#建立预测结果和文件名之间的关系\nfilenames = test_generator.filenames","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#导出预测结果到 .csv 文件\nimport pandas as pd\ntest = pd.DataFrame({\"filenames\":filenames,\"predicted_class_indices\":predicted_class_indices, \"predictions\":predictions})\ntest.to_csv('test.csv',index = None,encoding = 'utf8')","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}