{"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 pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn import datasets\nfrom sklearn.cluster import KMeans\nimport matplotlib.patches as mpatches\nfrom sklearn.metrics import silhouette_score\nimport math\nimport datetime as dt\nimport tensorflow as tf\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Conv2D,Dropout,Flatten,MaxPooling2D,BatchNormalization\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.utils import plot_model\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Klasörlere ayırma  \n- Hiyerarşik class yapısını rastgele bir şekilde oluşturmak için yapıyoruz. Bu işlem sonunda elimizdeki klasör yapısı:\n    - Train\n        - 0 (cats)\n        - 1 (dogs)\n    - Val\n        - 0 (cats)\n        - 1 (dogs)\n    - Test1","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nimport random\n\nrootdir= 'C:\\\\Users\\\\user\\\\Documents\\\\myPython\\\\ecodation\\\\dogs-cats\\\\train\\\\' #path of the original folder\nnew_root = \"C:\\\\Users\\\\user\\\\Documents\\\\myPython\\\\ecodation\\\\O1\"\n\nclasses = [\"0\", \"1\"]\n\nval_ratio = 0.15\ntest_ratio = 0.05\n\nfor cls in classes:\n    os.makedirs(new_root +'train\\\\' + cls)\n    os.makedirs(new_root +'val\\\\' + cls)\n   \n\n    src = rootdir + cls # Folder to copy images from\n\n    allFileNames = os.listdir(src)\n    np.random.shuffle(allFileNames)\n    train_FileNames, val_FileNames = np.split(np.array(allFileNames),\n                                                          [int(len(allFileNames)* (1 - (val_ratio + test_ratio)))])\n\n    train_FileNames = [src+'\\\\'+ name for name in train_FileNames.tolist()]\n    val_FileNames = [src+'\\\\' + name for name in val_FileNames.tolist()]\n   \n\n    print('Total images: ', len(allFileNames))\n    print('Training: ', len(train_FileNames))\n    print('Validation: ', len(val_FileNames))\n    \n\n    # Copy-pasting images\n    for name in train_FileNames:\n        shutil.copy(name, new_root +'train\\\\' + cls)\n\n    for name in val_FileNames:\n        shutil.copy(name, new_root +'val\\\\' + cls)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Klasör pathlerini oluşturma","metadata":{}},{"cell_type":"code","source":"train_data_dir= 'C:\\\\Users\\\\user\\\\Documents\\\\myPython\\\\ecodation\\\\cats-vs-dogs\\\\train\\\\'\nval_data_dir = 'C:\\\\Users\\\\user\\\\Documents\\\\myPython\\\\ecodation\\\\cats-vs-dogs\\\\val\\\\'\ntest_data_dir='C:\\\\Users\\\\user\\\\Documents\\\\myPython\\\\ecodation\\\\cats-vs-dogs\\\\test1\\\\'","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Flow from directory ile train,val ve testi oluşturma","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\nbatch_size=32\nimg_rows = 224\nimg_cols = 224\n\ntrain_datagen=ImageDataGenerator(\n    rotation_range=5,\n    rescale=1./255,\n    horizontal_flip=True,\n    shear_range=0.2,\n    zoom_range=0.2,\n    validation_split=0.2,\n    fill_mode='nearest'\n    )\n\ntrain_generator=train_datagen.flow_from_directory(\n    train_data_dir,\n    target_size=(img_rows,img_cols),\n    batch_size=batch_size,\n    class_mode='categorical')\n\n\nvalidation_generator=train_datagen.flow_from_directory(\n    val_data_dir,\n    target_size=(img_rows,img_cols),\n    batch_size=batch_size,\n    class_mode='categorical')\n\n\ntest_generator = train_datagen.flow_from_directory(\n    test_data_dir,\n    target_size=(img_rows,img_cols),\n    batch_size=batch_size,\n    class_mode=\"categorical\",\n    seed=42\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## CNN Modelini inşa etme","metadata":{}},{"cell_type":"code","source":"input_shape=(img_rows, img_cols, 3)\n\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape = input_shape))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.3))\n\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.3))\n\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.3))\nmodel.add(Dense(2, activation='softmax')) ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer= 'Adam',\n    loss = 'categorical_crossentropy',\n    metrics=['accuracy']\n)\nprint(model.summary())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs=5\nhistory = model.fit(\n    train_generator, \n    validation_data=validation_generator,\n    epochs=epochs\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Eğitim sonuçlarını görselleştirme","metadata":{}},{"cell_type":"code","source":"plt.figure(1, figsize = (15,8))\n   \nplt.subplot(221)  \nplt.plot(history.history['val_accuracy'])  \nplt.plot(history.history['accuracy'])  \nplt.title('model accuracy')  \nplt.ylabel('accuracy')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n    \nplt.subplot(222)  \nplt.plot(history.history['val_loss'])  \nplt.plot(history.history['loss'])  \nplt.title('model loss')  \nplt.ylabel('val_loss')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"performans = model.evaluate_generator(generator=validation_generator, steps=validation_generator.batch_size)\nprint('modelin test performansı %.2f%% ' % (performans[1]*100))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Resnet152V2 model ile tranfer learning","metadata":{}},{"cell_type":"code","source":"def layer_adder(bottom_model,num_classes):\n    top_model=bottom_model.output\n    top_model=GlobalAveragePooling2D()(top_model)\n    top_model=Dense(1024,activation='relu')(top_model)\n    top_model=Dropout(0.3)(top_model)\n    top_model=Dense(num_classes,activation='softmax')(top_model)\n    return top_model","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications import ResNet152V2\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense,Dropout,Activation,Flatten,GlobalAveragePooling2D\nfrom tensorflow.keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D\nfrom keras.layers.normalization import BatchNormalization\nfrom tensorflow.keras.models import Model\n\nimg_rows, img_cols = 224,224\n\nmodel2 = ResNet152V2(weights = \"imagenet\",\n                   include_top = False,\n                   input_shape =(img_rows,img_cols, 3))\nfor layer in model2.layers:\n    layer.trainable=False #katmanları dondur\n\n\n\nnum_classes=2\nFC_Head=layer_adder(model2,num_classes)\nmodel2=Model(inputs=model2.input,outputs=FC_Head)\nprint(model2.summary())#bu çalışcak","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model2.compile(\n    optimizer= 'Adam',\n    loss = 'categorical_crossentropy',\n    metrics=['accuracy']\n)\n\nepochs=5\nhistory = model2.fit(\n    train_generator, \n    validation_data=validation_generator,\n    epochs=epochs\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(1, figsize = (15,8))\n   \nplt.subplot(221)  \nplt.plot(history.history['val_accuracy'])  \nplt.plot(history.history['accuracy'])  \nplt.title('model accuracy')  \nplt.ylabel('accuracy')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n    \nplt.subplot(222)  \nplt.plot(history.history['val_loss'])  \nplt.plot(history.history['loss'])  \nplt.title('model loss')  \nplt.ylabel('val_loss')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"performans = model2.evaluate_generator(generator=validation_generator, steps=validation_generator.batch_size)\nprint('modelin test performansı %.2f%% ' % (performans[1]*100))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sonuç","metadata":{}},{"cell_type":"markdown","source":"- Kendi oluşturduğum CNN modelinin test başarısı : %72.27\n- Transfer learning  kullanarak eğittiğim Resnet152V2 modelinin test başarısı : %99.12","metadata":{}}]}