{"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":"markdown","source":"<a href=\"https://colab.research.google.com/github/turusan-asak/Transfer_Learning_Project/blob/main/Transfer_Learning_Project.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>","metadata":{"id":"view-in-github"}},{"cell_type":"markdown","source":"## Görüntülerin Colab Ortamına İndirilmesi","metadata":{"id":"33r8IywGh2zi"}},{"cell_type":"code","source":"!wget https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip","metadata":{"id":"d9LxW2nXhDxB","outputId":"642c0c90-aac2-4389-9f55-38e908c782c0"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Zip Dosyasının Açılması","metadata":{"id":"8rDyapdciNn8"}},{"cell_type":"code","source":"# '-q' açılan dosyaların isimlerinin bastırılmasını engeller\n!unzip -q kagglecatsanddogs_5340.zip","metadata":{"id":"-o6us68ziH2D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Zip dosyasını silmek için komut\n!rm kagglecatsanddogs_5340.zip","metadata":{"id":"nu8vLDeEl1ec"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Gerekli Kütüphaneler","metadata":{"id":"B2bLK2OMrMwm"}},{"cell_type":"code","source":"import os\nfrom tqdm import tqdm #ilerleme çubuğu için\nimport cv2 #yeniden boyutlandırma ve görüntüleri yüklemek için OpenCV kütüphanesi\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport random","metadata":{"id":"oIPI9jteontZ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Görüntülerin Önişlemesi\nGörüntüleri sırasıyla okuyarak, hepsinin aynı boyuta getirilmesi (resizing), normalizasyon yapılması, her bir görüntüyü etiketiyle birlikte, [görüntü, etiket] formatında bir listeye eklenmesi, görüntülerin karıştırılması (shuffling).","metadata":{"id":"s18KVqAbrnTi"}},{"cell_type":"code","source":"categories = [\"Cat\", \"Dog\"]\ndir = \"PetImages\"\nsize = 128\n\nimages = []\ncounter = 0\n\nfor category in categories:\n  dir_path = os.path.join(dir, category)\n  label = categories.index(category) # etiket 0 -> Cat 1 -> Dog\n  for image in tqdm(os.listdir(dir_path)): # görüntülerin sırasıyla okunması\n    try:\n      img_path = os.path.join(dir_path, image)\n      img = cv2.imread(img_path)\n      img = cv2.resize(img, (size, size)) # görüntülerin aynı boyuta getirilmesi\n      images.append([img, label])\n      counter += 1\n    except:\n      print(image) # boyut değiştirirken sorun yaşanan dosyalar\n    if counter == 2500: # 2500 kedi ve 2500 köpek görüntüsü için sayaç\n      counter = 0\n      break\n\n","metadata":{"id":"ePGv-ovll3Dw","outputId":"2cb4d561-f68e-4527-d101-6da08be3428b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(images[300][0]);","metadata":{"id":"vQBQn_F3xo6D","outputId":"77f66c4c-ea5c-4094-87dd-9c695f0d8c4b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# görüntüleri karıştırmak için -> modelin sıralamadan bağımsız eğitilmesi için\nrandom.shuffle(images)","metadata":{"id":"YfCcwtfLx6sN"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# görüntüler karıştırıldıktan sonraki ilk 25 görüntü\nplt.figure(figsize=(25,25))\n\nfor i in range(25):\n  plt.subplot(5,5, i+1)\n  plt.imshow(images[i][0])\n  plt.axis(\"off\")\n","metadata":{"id":"60hoAFMj0n1M","outputId":"e0227c6f-f34a-40a5-b8fd-8ce9c7efe595"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# görüntüleri ve etiketleri ayrı listelere koyalım\n\nX = [] # görüntüler\nY = [] # etiketler\n\nfor x,y in images:\n  X.append(x)\n  Y.append(y)\n\ndel images # RAM'de yer açmak için siliyoruz çünkü zaten içindeki verilere sahibiz","metadata":{"id":"kf601derKBhe"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# görüntüler karıştırıldıktan sonraki son 25 görüntü\nplt.figure(figsize=(25,25))\n\nfor i in range(25):\n  plt.subplot(5,5, i+1)\n  plt.imshow(X[-i], cmap='gray')\n  plt.axis(\"off\")","metadata":{"id":"3n8ihX-hKtzi","outputId":"b886ce1c-a660-492f-cc20-9272e7a73cfd"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X[0].shape","metadata":{"id":"AuzTxVwgOSlF","outputId":"37290051-1493-477c-8537-2625c7943434"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# her görüntü size * size * 3 boyutunda -> 3 RGB fotoğraf olduğu için -> -1 yazınca kaç tane görüntü olduğunu hesaplar\nX = np.array(X).reshape(-1,size,size,3) \nY = np.array(Y).reshape(-1,1)","metadata":{"id":"TceHNywgLiyl"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = X / 255 # pikselleri 0 - 1 aralığına getirme (normalizasyon)","metadata":{"id":"wIx1K2jxqhUK"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X.shape","metadata":{"id":"7VpgubvLPIo9","outputId":"00f7ae87-0bc2-47b5-b7eb-7f65b28e9cc6"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Tranfer Learning (VGG16 Fine Tunning)\n","metadata":{"id":"tn8_o6uWftWu"}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras import layers\nfrom keras.layers import Dropout, Dense, GlobalMaxPooling2D\nfrom tensorflow.keras import optimizers\nfrom tensorflow.keras.applications import VGG16\nfrom keras.models import Model","metadata":{"id":"mI6YRTBagUAC"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Kaggle'dan alıntı : https://www.kaggle.com/code/bulentsiyah/dogs-vs-cats-classification-vgg16-fine-tuning/notebook\n\nimage_size = 128\ninput_shape = (image_size, image_size, 3)\n\nepochs = 5\nbatch_size = 16\n\npre_trained_model = VGG16(input_shape=input_shape, include_top=False, weights=\"imagenet\")\n    \nfor layer in pre_trained_model.layers[:15]:\n    layer.trainable = False\n\nfor layer in pre_trained_model.layers[15:]:\n    layer.trainable = True\n    \nlast_layer = pre_trained_model.get_layer('block5_pool')\nlast_output = last_layer.output\n    \n# Flatten the output layer to 1 dimension\nx = GlobalMaxPooling2D()(last_output)\n# Add a fully connected layer with 512 hidden units and ReLU activation\nx = Dense(512, activation='relu')(x)\n# Add a dropout rate of 0.5\nx = Dropout(0.5)(x)\n# Add a final sigmoid layer for classification\nx = layers.Dense(1, activation='sigmoid')(x)\n\nmodel = Model(pre_trained_model.input, x)\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),\n              metrics=['accuracy'])\n\nmodel.summary()","metadata":{"_uuid":"8c9f833c1441b657c779844912d0b8028218d454","id":"siFVwBCAfrVc","outputId":"75b8d308-9476-46b6-8e9b-f24c637fea2c","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ind = int(X.shape[0] * 0.8) # görüntülerin %80'i \nind # görüntülerin %80'ini almak için indeks numarası","metadata":{"id":"nGEVfI0psWQp","outputId":"cc2a8d8e-f977-4f19-88fb-cdbd6dbdf358"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(X[:ind], Y[:ind], batch_size=16, epochs=5, shuffle=True, validation_split=0.1)","metadata":{"id":"L3vvm6Ewrnco","outputId":"47d5ab84-9f7c-4056-b061-601b4426b621"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\nplt.plot(model.history.history['accuracy'])\nplt.plot(model.history.history['val_accuracy'])\nplt.title('Model Dogruluk Oranı')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='lower right')\nplt.savefig('result_21.png',dpi=300)","metadata":{"id":"lX8vZQi4u2Bu","outputId":"c96942b9-c63b-49a1-a785-2416b1abc14f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\nplt.plot(model.history.history['loss'])\nplt.plot(model.history.history['val_loss'])\nplt.title('Model Loss Değişimi')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='lower right')\nplt.savefig('result_22.png',dpi=300)","metadata":{"id":"pe6uXZoeIidl","outputId":"98695957-0a19-4ba7-8ca0-93fab7e86e91"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sıfırdan Model Eğitimi","metadata":{"id":"dL1sxqFjd0Ah"}},{"cell_type":"code","source":"from keras import Sequential\nfrom keras.layers import Conv2D, Activation, BatchNormalization, Flatten, Dense, Dropout, MaxPooling2D\nfrom sklearn.model_selection import train_test_split\nfrom keras.callbacks import ModelCheckpoint","metadata":{"id":"gvjUSGg2dE3m"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(filters = 32, kernel_size= (3,3), input_shape = (128,128,3), activation = 'relu'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(filters = 32, kernel_size= (3,3), activation = 'relu'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Conv2D(filters = 64, kernel_size= (3,3), activation = 'relu'))\nmodel.add(BatchNormalization())\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dense(32, activation='relu'))\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.summary()","metadata":{"id":"E0cho_PBlzhw","outputId":"941427e7-a778-4b1a-90bf-da006050e324"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(), metrics=['acc'])\n\nmodel_check = ModelCheckpoint('en_iyi_loss.h5',save_best_only=True,monitor='val_loss',mode='min') # en az val_loss değerine sahip modeli kaydetmek için","metadata":{"id":"SdaXkMe2rt-N"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ind = int(X.shape[0] * 0.8) # görüntülerin %80'i \nind2 = int(X.shape[0] * 0.9) # görüntülerin %90'ı","metadata":{"id":"epngiGg8vuGa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_generator = ImageDataGenerator(\n    rotation_range = 40,\n    shear_range = 0.2,\n    zoom_range = 0.2,\n    horizontal_flip = True,\n    fill_mode = 'nearest'\n)\n\ntrain_iterator = train_generator.flow(\n    X[:ind], \n    Y[:ind],\n    batch_size=64, \n)\n\nval_generator = ImageDataGenerator()\n\nval_iterator = val_generator.flow(\n    X[ind:ind2],\n    Y[ind:ind2],\n    batch_size=64, \n)\n","metadata":{"id":"ecVY9hoGBdcG"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_iterator, epochs=20, validation_data = val_iterator, callbacks=[model_check])","metadata":{"id":"Ft9DpVISt32n","outputId":"f51c5b85-2737-43be-b9dc-0bd8664cdcb9"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_iterator, epochs=30, validation_data = val_iterator, callbacks=[model_check])","metadata":{"id":"WVqCN5xsGwNC","outputId":"06f6a251-1cef-45c2-956e-f776b6afd914"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\nplt.plot(model.history.history['acc'])\nplt.plot(model.history.history['val_acc'])\nplt.title('Model Dogruluk Oranı')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='lower right')\nplt.savefig('result_1.png',dpi=300)","metadata":{"id":"hjXDfYS-BgbK","outputId":"5d6cee37-83dc-4a54-ca56-cac5d3aaf24a"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\nplt.plot(model.history.history['loss'])\nplt.plot(model.history.history['val_loss'])\nplt.title('Model Loss Değişimi')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='lower right')\nplt.savefig('result_2.png',dpi=300)","metadata":{"id":"HJcHJGJcIM1K","outputId":"a9946679-9e86-421f-ddef-d45b94fa8706"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# en yüksek validation skoru\nprint(f\"The highest val_acc : {max(model.history.history['val_acc'])}\")","metadata":{"id":"9S4-w6lTCtfi","outputId":"ea4d4f38-5175-4768-debd-28d0444b0c5c"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import load_model\nen_iyi_loss = load_model('en_iyi_loss.h5') # en az loss değerine sahip modeli yükler","metadata":{"id":"X5QK935_Lbuu"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, classification_report\n\n# ind2 indeksinden sonrası test verisi olarak tutmuştum, test verisi üzerinde en az loss değerine sahip modelimizi değerlendiriyoruz\nprint(confusion_matrix(Y[ind2:],en_iyi_loss.predict(X[ind2:]).round()))\nprint(classification_report(Y[ind2:],en_iyi_loss.predict(X[ind2:]).round()))","metadata":{"id":"r1sQGzFeL0rl","outputId":"0e1c1d5e-4ec8-419a-f276-97c7915ba43e"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# en son oluşturulan modeli kaydedip Colab'ten bilgisayara indirmek için .zip dosyası haline getiriyoruz\nmodel.save('my_model')\n!zip -r model.zip my_model","metadata":{"id":"inuIO7RAHqLc","outputId":"dbdaed57-f3f2-4c61-ea08-e7335e737f44"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.zip dosyasını bilgisayarımıza indirmek için\nfrom google.colab import files\nfiles.download('model.zip') ","metadata":{"id":"X1yDHfSuIbbn","outputId":"2a2b42c5-4be5-4cb9-d0c4-0136576403a2"},"execution_count":null,"outputs":[]}]}