{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os,shutil\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.\nos.listdir('../input/train/train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"original_dataset_dir = '../input/train/train'\nbase_dir = '../data'\nif not os.path.isdir(base_dir): os.mkdir(base_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = os.path.join(base_dir,'train')\nif not os.path.isdir(train_dir): os.mkdir(train_dir)\ntest_dir = os.path.join(base_dir,'test')\nif not os.path.isdir(test_dir): os.mkdir(test_dir)\nvalidation_dir = os.path.join(base_dir,'validation')\nif not os.path.isdir(validation_dir): os.mkdir(validation_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_cats_dir = os.path.join(train_dir,'cats')\nif not os.path.isdir(train_cats_dir): os.mkdir(train_cats_dir)\n\ntrain_dogs_dir = os.path.join(train_dir,'dogs')\nif not os.path.isdir(train_dogs_dir): os.mkdir(train_dogs_dir)\n    \nvalidation_cats_dir = os.path.join(validation_dir,'cats')\nif not os.path.isdir(validation_cats_dir) : os.mkdir(validation_cats_dir)\nvalidation_dogs_dir = os.path.join(validation_dir,'dogs')\nif not os.path.isdir(validation_dogs_dir) : os.mkdir(validation_dogs_dir)\n\ntest_cats_dir = os.path.join(test_dir,'cats')\nif not os.path.isdir(test_cats_dir) : os.mkdir(test_cats_dir)\ntest_dogs_dir = os.path.join(test_dir,'dogs')\nif not os.path.isdir(test_dogs_dir) : os.mkdir(test_dogs_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(train_cats_dir,fname)\n    shutil.copyfile(src,dst)   \nfnames = ['cat.{}.jpg'.format(i) for i in range(1000,1500)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(validation_cats_dir,fname)\n    shutil.copyfile(src,dst)\nfnames = ['cat.{}.jpg'.format(i) for i in range(1500,2000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(test_cats_dir,fname)\n    shutil.copyfile(src,dst)\n\nfnames = ['dog.{}.jpg'.format(i) for i in range(1000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(train_dogs_dir,fname)\n    shutil.copyfile(src,dst)   \nfnames = ['dog.{}.jpg'.format(i) for i in range(1000,1500)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(validation_dogs_dir,fname)\n    shutil.copyfile(src,dst)\nfnames = ['dog.{}.jpg'.format(i) for i in range(1500,2000)]\nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname)\n    dst = os.path.join(test_dogs_dir,fname)\n    shutil.copyfile(src,dst)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Tree"},{"metadata":{"trusted":true},"cell_type":"code","source":"def showdir(path, depth):\n    if depth == 0:\n        print(\"root:[\" + path + \"]\")\n \n    for item in os.listdir(path):\n        if '.git' not in item:\n            print(\"|      \" * depth + \"|--\" + item)\n \n            newitem = os.path.join(path,item)\n            if os.path.isdir(newitem):\n                showdir(newitem, depth +1)\nshowdir(base_dir,0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\ncats = pd.Series([len(os.listdir(train_cats_dir)),len(os.listdir(validation_cats_dir)),len(os.listdir(test_cats_dir))])\ndogs = pd.Series([len(os.listdir(train_dogs_dir)),len(os.listdir(validation_dogs_dir)),len(os.listdir(test_dogs_dir))])\ndf = pd.DataFrame({'Cats':cats,'Dogs':dogs})\ndf.index = ['Train','Validation','Test']\ndf","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Conv2D,MaxPool2D,Flatten,Dense\nfrom keras import models","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = models.Sequential()\nmodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Conv2D(64,(3,3),activation='relu'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Conv2D(128,(3,3),activation='relu'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Conv2D(128,(3,3),activation='relu'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Flatten())\nmodel.add(Dense(512,activation='relu'))\nmodel.add(Dense(1,activation='sigmoid'))\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import optimizers\nmodel.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=20,class_mode='binary')\nvalidation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150,150),batch_size=20,class_mode='binary')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=30,validation_data=validation_generator,validation_steps=50)\nmodel.save('cats_and_dogs_small_1.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\ndef show(history,acc,val_acc,label):\n    epochs = range(1,31)\n    plt.plot(epochs,history.history[acc],label='Training '+label)\n    plt.plot(epochs,history.history[val_acc],label='Validation '+label)\n    plt.title('Training and Validation '+label)\n    plt.legend()\nplt.figure(figsize=(15,5))\nplt.subplot(121)\nshow(history,'acc','val_acc','acc')\nplt.subplot(122)\nshow(history,'loss','val_loss','loss')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Overfitting!\n> 僅僅在五個週期內達到最小值\n* 採用Data augmentation"},{"metadata":{},"cell_type":"markdown","source":"# Data augmentation"},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator(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":true},"cell_type":"code","source":"from keras.preprocessing import image\n\nfnames = [os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]\nimg_path = fnames[2] #任選一個\nimg = image.load_img(img_path, target_size=(150,150))\nx = image.img_to_array(img)\nx = x.reshape((1,)+x.shape)\n\ni = 0\nplt.figure(figsize=(8,8))\nfor batch in datagen.flow(x, batch_size=1):\n    plt.subplot(221+i)\n    imgplot = plt.imshow(image.array_to_img(batch[0]))\n    i +=1\n    if i%4 ==0:\n        break\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# ADD Dropout"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Dropout\nmodel_2 = models.Sequential()\nmodel_2.add(Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))\nmodel_2.add(MaxPool2D(2,2))\nmodel_2.add(Conv2D(64,(3,3),activation='relu'))\nmodel_2.add(MaxPool2D(2,2))\nmodel_2.add(Conv2D(128,(3,3),activation='relu'))\nmodel_2.add(MaxPool2D(2,2))\nmodel_2.add(Flatten())\nmodel_2.add(Dropout(0.5))\nmodel_2.add(Dense(512,activation='relu'))\nmodel_2.add(Dense(1,activation='sigmoid'))\n\nmodel_2.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_2.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc']) #0.0001","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./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')\n\ntest_datagen = ImageDataGenerator(rescale=1./255) #驗證資料不應該擴充\ntrain_generator = train_datagen.flow_from_directory(train_dir,target_size=(150,150),\n                                                    batch_size=32,\n                                                    class_mode='binary')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validation_generator = test_datagen.flow_from_directory(validation_dir,\n                                                        target_size=(150,150),\n                                                        batch_size=32,\n                                                        class_mode='binary')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history_2 = model_2.fit_generator(train_generator,\n                               steps_per_epoch=100,\n                               epochs=100,\n                               validation_data=validation_generator,\n                               validation_steps=50)\nmodel_2.save('cats_and_dogs_small_2.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def show_100(history,acc,val_acc,label):\n    epochs = range(1,100+1)\n    plt.plot(epochs,history.history[acc],label='Training '+label)\n    plt.plot(epochs,history.history[val_acc],label='Validation '+label)\n    plt.title('Training and Validation '+label)\n    plt.legend()\nplt.figure(figsize=(15,5))\nplt.subplot(121)\nshow_100(history_2,'acc','val_acc','acc')\nplt.subplot(122)\nshow_100(history_2,'loss','val_loss','loss')\nplt.show()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.3"}},"nbformat":4,"nbformat_minor":1}