{"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":"# 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\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n# import warnings\nimport warnings\n# filter warnings\nwarnings.filterwarnings('ignore')\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-15T20:15:49.831865Z","iopub.execute_input":"2023-07-15T20:15:49.832404Z","iopub.status.idle":"2023-07-15T20:15:50.150244Z","shell.execute_reply.started":"2023-07-15T20:15:49.832361Z","shell.execute_reply":"2023-07-15T20:15:50.148363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"    \n# Convolutional Neural Networks (CNN)\n\n* [Data Set Alımı](#1)\n* [Normalizasyon, Tekrar boyutlandırma, Etiket çözümleme](#2)\n* [Train-Test Split](#3)\n* [CNN (COnvolutional Neural Network)](#4)\n* [CNN Implementing with KERAS](#5)\n    * [Implementing update parameters](#6)\n    * [Implementing Prediction](#7)\n    * [Implementing Logistic Regression](#8)\n    * [Logistic Regression with Sklearn](#9)\n","metadata":{}},{"cell_type":"markdown","source":"<a id=\"1\"></a> <br>\n# Data Set Alımı\n\nData Set için digit recognizer datasetini kullanacağız.","metadata":{}},{"cell_type":"code","source":"# read train \ntrain = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\nprint(train.shape)\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:50.152257Z","iopub.execute_input":"2023-07-15T20:15:50.152620Z","iopub.status.idle":"2023-07-15T20:15:51.856844Z","shell.execute_reply.started":"2023-07-15T20:15:50.152592Z","shell.execute_reply":"2023-07-15T20:15:51.855740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Veriyi yükledikten sonra incelemeye başladığımızda ilk sütunun label sütunu yani sayıların oluşturduğunu görüyoruz. (0,1,2,3,4,5,6,7,8,9) Diğer sütunların ise pixsel değerlikleri olduğunu görürüz. Resmimiz 24*24 pikselden oluşuyor buda 784 adet sütuna denk geliyor.","metadata":{}},{"cell_type":"code","source":"# read train \ntest = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\nprint(test.shape)\ntest.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:51.858370Z","iopub.execute_input":"2023-07-15T20:15:51.858769Z","iopub.status.idle":"2023-07-15T20:15:52.919505Z","shell.execute_reply.started":"2023-07-15T20:15:51.858733Z","shell.execute_reply":"2023-07-15T20:15:52.918317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Test datasına baktığımzda 28000 test resminin olduğunu görürüz. 42000+28000 = 70000 resim toplamda bulunmaktadır. oran olarak %60 train %40 test verisi kullanılmıştır.<br>\nbir başka test ve train arasındaki fark ise train datasetinde 785 sütun varken test'te 784 sütunun olmasıdır. Aslında bu beklenen bir şeydir. Çünkü traine göre biz test datasında sonuç oluşturacağız. ","metadata":{}},{"cell_type":"code","source":"# put labels into y_train variable\nytrain = train[\"label\"]\n# Drop 'label' column\nxtrain = train.drop(labels = [\"label\"],axis = 1) ","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:52.922096Z","iopub.execute_input":"2023-07-15T20:15:52.922413Z","iopub.status.idle":"2023-07-15T20:15:52.983731Z","shell.execute_reply.started":"2023-07-15T20:15:52.922389Z","shell.execute_reply":"2023-07-15T20:15:52.981365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"ytrain = train dataetndeki label sütunu iken <br>\nxtrain = label sütunu haricindeki sütunlar olacaktır.","metadata":{}},{"cell_type":"code","source":"# visualize number of digits classes\nplt.figure(figsize=(15,7))\nsns.countplot(x=train[\"label\"], palette=\"icefire\")\nplt.title(\"sayıların datasetteki sayıları\")\nplt.xlabel(\"sayılar\")\nplt.ylabel(\"sayıların sayısı\")\nytrain.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:52.985638Z","iopub.execute_input":"2023-07-15T20:15:52.986071Z","iopub.status.idle":"2023-07-15T20:15:53.304496Z","shell.execute_reply.started":"2023-07-15T20:15:52.986032Z","shell.execute_reply":"2023-07-15T20:15:53.303197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"grafikte en çok kullanılan sayılar gösterilmektedir.Şimdi bu sayıların resimlerini çizdirelim.","metadata":{}},{"cell_type":"code","source":"k=[1,0,16,9,3,8,26,6,10,11]\na=1\nfor i in k:\n    plt.subplot(1,10,a)\n    img =xtrain.iloc[i].to_numpy()\n    img = img.reshape((28,28))\n    plt.imshow(img,cmap='gray')\n    plt.title(train.iloc[i,0])\n    plt.axis('off')\n    a=a+1\n  \n","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:53.305856Z","iopub.execute_input":"2023-07-15T20:15:53.306213Z","iopub.status.idle":"2023-07-15T20:15:53.835613Z","shell.execute_reply.started":"2023-07-15T20:15:53.306183Z","shell.execute_reply":"2023-07-15T20:15:53.834324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"datadan birkaç örnek gösterirsek, el yazısı rakamları görebiliriz. Bu kodda dikkat edilecek husus, to_numpy ve peşine gelen reshape komutudur. Bunun kullanım amacı sütunları matrix hale getirmesi ve istediğimiz şekilde bir matrix haline getirmesir.","metadata":{}},{"cell_type":"markdown","source":"<a id=\"2\"></a> <br>\n# Normalizasyon, Tekrar boyutlandırma, Etiket çözümleme\n\nNormalizsayon <br>\n&emsp;&emsp; * Bu datada ,Resmin griye çevrilmesidir.  Amacı CNN'e hız kazandırmaktır. <br>\nTekrar boyutlandırma<br>\n&emsp;&emsp; * Bunun amacı da keras kütüphanesinin 3 boyutlu çalışmasıdır. Yani kanal sayısını girmemiz gerekiyor. Normalde resmimiz 28*28 iken keras bizden x*x*x formatında bir şey bekler. Bizde 28*28*1 formatında yeniden boyutlandırma yaparak resmimizi  göndereceğiz.Buradaki 1 resmin gri olduğunu gösterir. 3 olsaydı resim renkli olacaktı. Yani 3 kanallı olduğunda red,green,blue olacaktı.. <br>\nEtiket çözümleme<br>\n&emsp;&emsp; Yine keras kütüphanesinin labelleri anlaması için yapılması gereken uygulamadır. Örnek vermek gerekirse 1= 0100000000 4=0000100000 2=0010000000 aslında yapılan olay çıkışlarımızı kerasın anlayabileceği hale getirmektir.","metadata":{}},{"cell_type":"code","source":"#Normalizasyon\nxtrain = xtrain / 255.0\ntest = test / 255.0\nprint(\"xtrain shape: \",xtrain.shape)\nprint(\"test shape: \",test.shape)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:53.836667Z","iopub.execute_input":"2023-07-15T20:15:53.836921Z","iopub.status.idle":"2023-07-15T20:15:53.904443Z","shell.execute_reply.started":"2023-07-15T20:15:53.836900Z","shell.execute_reply":"2023-07-15T20:15:53.903787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Normalizasyon için piksel değerlerini 255'e bölmemiz yeterli oalcaktır. Böylelikle piksel değerlikleri 0 ve 1 arasında değerler alacaktır.","metadata":{}},{"cell_type":"code","source":"# Yeniden Boyutlandırma\nxtrain = xtrain.values.reshape(-1,28,28,1)\ntest = test.values.reshape(-1,28,28,1)\nprint(\"xtrain shape: \",xtrain.shape)\nprint(\"test shape: \",test.shape)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:53.905119Z","iopub.execute_input":"2023-07-15T20:15:53.905331Z","iopub.status.idle":"2023-07-15T20:15:53.912238Z","shell.execute_reply.started":"2023-07-15T20:15:53.905311Z","shell.execute_reply":"2023-07-15T20:15:53.911471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"artık elimizde 28*28*1 lik 42000 xtrain datası ve 28*28*1 28000 tane de test datası bulunmaktadır. Dikkat edilecek olursa dataframi miz matrix haline getirilmiştir.","metadata":{}},{"cell_type":"code","source":"# Label Encoding \nfrom keras.utils.np_utils import to_categorical # convert to one-hot-encoding\nytrain = to_categorical(ytrain, num_classes = 10)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:53.913174Z","iopub.execute_input":"2023-07-15T20:15:53.913547Z","iopub.status.idle":"2023-07-15T20:15:53.924006Z","shell.execute_reply.started":"2023-07-15T20:15:53.913520Z","shell.execute_reply":"2023-07-15T20:15:53.922447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Keras bizim için hazır bir şekilde label encoding yapmaktadır.Burada dikkat edilecek husus num_classes = 10 bu sayının farklı girilmesi yanlış sonuçlar doğurabilir. ","metadata":{}},{"cell_type":"markdown","source":"<a id=\"3\"></a> <br>\n# Train-Test Split\n\nTrain datamızı train ve validation diye ikiye ayıracağız. Bundaki amacımız train ile modelimizi oluşturacağız validation ile modelimizi test yapacağız eğer doğruluğu iyi çıkarsa başlangıçta var olan test datamızı bu modele sokacağız. ","metadata":{}},{"cell_type":"markdown","source":"**** \n<strong> *** Önemli:</strong> Validation bir test prosedürüdür. Yani modelimizi test etmek için kullanacağız. Test datası da bir tahmin prosedürüdür. Dikkat edilecek olursa label test datasında yoktur. Yani sonuç yok sonuçları modele göre makine tahmin yürüterek ortaya çıkaracaktır. \n**** ","metadata":{}},{"cell_type":"code","source":"# Split the train and the validation set for the fitting\nfrom sklearn.model_selection import train_test_split\nxtrain, xval,ytrain, yval = train_test_split(xtrain,ytrain, test_size = 0.1, random_state=2)\nprint(\"x_train shape\",xtrain.shape)\nprint(\"x_test shape\",xval.shape)\nprint(\"y_train shape\",ytrain.shape)\nprint(\"y_test shape\",yval.shape)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T20:15:53.927941Z","iopub.execute_input":"2023-07-15T20:15:53.928681Z","iopub.status.idle":"2023-07-15T20:15:54.190126Z","shell.execute_reply.started":"2023-07-15T20:15:53.928634Z","shell.execute_reply":"2023-07-15T20:15:54.189355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"sklearn kütüphanesi bizim için bu ayırmayı otomatik yapıyor. Yine test_size önemli genelde %80 %20 seçilir biz burada %90 eğitim %10 doğrulama seçtik. random state ise her seferinde aynı sonuçlar çıksın diye kullanığımız bir kod bloğudur.","metadata":{}},{"cell_type":"markdown","source":"pre - processing yani ön işleme  bitti, kısaca özetlersek data alınır ve incelenir, makinenin anlayacağı br düzene datalar getirilir ve sonunda model oluşturma için data belli tablolara bölünür. Bundan sonraki adım makine modelini oluşturmaktır. Bu notebook için convolutional neural network üzerinde durulacaktır.","metadata":{}},{"cell_type":"markdown","source":"<a id=\"4\"></a> <br>\n# CNN (Convolutional Neural Network)\n\nKısaca anlatmak gerekirse resmin filtrelerden geçirerek kenar , yada daha ovallikler arayarak resimlerden özellik çıkartarak tahmin etme yöntemidir. <br> \nÖrnek ile açıklamak gerekirse tavşan ve köpeğe baktığımızda aralarında belirli farklar ollcaktır.\nKöpeğin kulakları ile tavşanın kulakları farklıdır, diş yapısı farklıdır gibi, işte bu farklı özellikleri çıkartmak için CNN filtreleri kullanır\nDaha sonra yeni oluşturduğu CNN maplar ile tahmin yürütme işlemi yapar.\n","metadata":{}},{"cell_type":"markdown","source":"*** \n## Padding\nCNN'de filtrelerden geçirme söz konusu oluduğunda resim üzerinde veri kaybı olacaktır. Bunun engellemenin bazı yöntemleri vardır. Bu yöntemler padding adı altında bulunmaktadır. Bu notebookda same padding yapılacaktır. Amaç örnek vermek gerekirse 7-7 bir resim bir filtreden geçirilirse 5-5 matrise dönüşür. Yani resmin en dış çerçevesi gider. <br>\nBunu engellemek için same padding yapıldığında aynı sayıda yani 7-7 oranında bir resim hala elimizde bulunur. Nasıl yapıldığına gelinirse resmin dışına bir çerçeve eklenir resim filtreden geçirilir. yani Resim 9-9 hale getirildikten sonra filtreden geçirilir.\n***","metadata":{}},{"cell_type":"markdown","source":"***\n## Pooling\nBir başka özellikde pooling özelliğidir. Bunun yapılmasındaki amaç modelimize hız kazandırmaktır. Aslında sub sampling yapıyoruz. Hız kazanıyoruz, over fitting engelleniyor. Nasıl yağıldığı ise daha önceden filtreden geçim resmimizi örneğin 2-2 bir pooling ile resimdeki en yüksek değeri , en küçük değeri veya ortalamasını alıyoruz. Genelde en yüksek değeri alındığında bu işleme Max Pooling de denilebilir.\n***","metadata":{}},{"cell_type":"markdown","source":"***\n## Flattening\nMatrix haldeki datanın uzatlmasıdır. Örneğin elimizde 3-3 bir matrix olsun bunu 6-1 hale getirilmesi işlemidir. Böylelikle makine öğrenmemizin inputları hazır hale gelirler.\n***","metadata":{}},{"cell_type":"markdown","source":"***\n## Full Connection\nArtık modelimizin son kısmını oluşturuyoruz. full connectin node lar arasındaki bağlantılardır. İstersek bu bağlantıları engelleyebiliriz ama full connection olduğunda input hidden layerdaki tüm nodelar ile bağlantı kurar. Ne kadar bğalantı o kadar doğru sonuç verir.\n***","metadata":{}},{"cell_type":"markdown","source":"Bu kadar genel bilgiden sonra kodlarımıza geçelim.","metadata":{}},{"cell_type":"markdown","source":"<a id=\"5\"></a> <br>\n# CNN Implementing with KERAS\n\nModelimizizi oluşturma kısmına geldik.\n\n","metadata":{}},{"cell_type":"markdown","source":"***\n## Create model\nModelimizi istediğimiz gibi tasarlayabiliriz. Örneğin ; <br> \nconv => max pool => dropout => conv => max pool => dropout => fully connected (2 layer)<br>\n\n***","metadata":{}},{"cell_type":"markdown","source":"con=Convolutinal neural network yani filtrelerden geçireceğiz.\nmax pool = pooling yapacağımız methot burada max alınmış. \ndropout= Full connection uzun sürdüğü için burda neronlar arası bazı nod ları yok sayacağız.\naynı işlemler tekralanacak.\n\nmodelimiz oluşturalım","metadata":{}},{"cell_type":"code","source":"# \nfrom sklearn.metrics import confusion_matrix\nimport itertools\n\nfrom keras.utils.np_utils import to_categorical # convert to one-hot-encoding\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\nfrom keras.optimizers import RMSprop,Adam\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau\n\nmodel = Sequential()\n#\nmodel.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu', input_shape = (28,28,1)))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n#\nmodel.add(Conv2D(filters =60, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))\n#model.add(Dropout(0.25))\n# fully connected\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\n#model.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\"))","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:25:57.806690Z","iopub.execute_input":"2023-07-15T21:25:57.807152Z","iopub.status.idle":"2023-07-15T21:25:57.886303Z","shell.execute_reply.started":"2023-07-15T21:25:57.807122Z","shell.execute_reply":"2023-07-15T21:25:57.884637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"birinci kısım kullanılan kütüphanlerin import edilmesi kısmıdır. Herhangi bir değiştirme yapılamaz.\nİkinci kısım yani Sequential aslında modelimizin oluşturulduğu kısımdır.\n","metadata":{}},{"cell_type":"markdown","source":"***\nmodel.add(Conv2D(filters = 8, kernel_size = (5,5),padding = 'Same', <br>\n                 activation ='relu', input_shape = (28,28,1)))<br>\nmodel.add(MaxPool2D(pool_size=(2,2)))<br>\nmodel.add(Dropout(0.25))<br>\n***\n\nBurdaki filters=8 filtre sayısını verirken ,kernel_size = (5,5) filtrenin büyüklüğünü verir. İstersek hem filtre sayısını hem de büyüklüğünü değiştirebiliriz.<br> Padding same seçilmiş ne olduğu üstte anlatıldı, başka padding methotları da bulunmaktadır.<br>activation ='relu', sigmoid gibi datayı şekillendirmek için kullanılır. <br>input_shape = (28,28,1) datamızı boyutunu vermemiz gerekir. Burada 28-28-1 'dir.<br>model.add(MaxPool2D(pool_size=(2,2))) pooling yapmamızı sağlar eğer stride yazılsaydı atlama değeri olacaktı. defalt değeri 1 dir bir sonraki katmanda stride 2-2 seçildi. Bunun anlamı pooling filtresi bir bir kaymayacak 2-2 kayacak.\n<br>model.add(Dropout(0.25) nodeların bazılarını rastgale kapattık. Bundaki amaç overfittingi engellemek ve hız kazanmaktır.","metadata":{}},{"cell_type":"markdown","source":"son kısımda farklı olarak flatten yapıldı. sonrasında iki katman daha oluşturularak model bitirildi. ","metadata":{}},{"cell_type":"markdown","source":"## Define optimizer\nLearning rate değiştirdiğimiz kısımdır. Hiç bir şey yapılmasa da modelimiz çalışır. Ama model çok yavaş ise bu öğrenme oranı düşürülerek hız kazanılabilir.","metadata":{}},{"cell_type":"code","source":"# Define the optimizer\noptimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:20:59.351924Z","iopub.execute_input":"2023-07-15T21:20:59.352347Z","iopub.status.idle":"2023-07-15T21:20:59.357094Z","shell.execute_reply.started":"2023-07-15T21:20:59.352318Z","shell.execute_reply":"2023-07-15T21:20:59.356331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Compile Model\nOluşturduğumuz modeli compile edelim.","metadata":{}},{"cell_type":"code","source":"# Compile the model\nmodel.compile(optimizer = optimizer , loss = \"categorical_crossentropy\", metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:26:00.518231Z","iopub.execute_input":"2023-07-15T21:26:00.518640Z","iopub.status.idle":"2023-07-15T21:26:00.529652Z","shell.execute_reply.started":"2023-07-15T21:26:00.518612Z","shell.execute_reply":"2023-07-15T21:26:00.528878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"modelimize optimizer loss ve metrics methotlarını yerleştirdik. Kısacası öğrenme oranını verdik categorical diyerek sonuçta ikiden fazla çıktı olacağını söyledik ve metric olarak da doğruluğa bakacağımızı modelimize bildirdik. ","metadata":{}},{"cell_type":"markdown","source":"***\n## Epochs and Batch Size\nIn the neural network terminology:\n\none epoch = one forward pass and one backward pass of all the training examples<br>\nbatch size = the number of training examples in one forward/backward pass. (The higher the batch size, the more memory space you'll need.)<br>\nnumber of iterations = number of passes, each pass using [batch size] number of examples. <br>\n\nÖrnek vermek gerekirse 100 adet inputunuz var. Bu 100 adet inputun üzerinden 10 tane eğitim örneği geçireceğiz yani batch sizemız 10 olacak. Böylelikle bir ileri ve geri propogation da 100/10= 10 adet iterasyona sahip oluruz. Epoch 5 olursa toplam iterasyon sayımız 10*5 = 50 olur. Bu sayıların arttırımı modelimizi güçlendirir ama zamanı da arttırır. Dikkatlice seçilmesi gerekir.\n***","metadata":{}},{"cell_type":"code","source":"batch=100\nepoch=40","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:26:50.982900Z","iopub.execute_input":"2023-07-15T21:26:50.983305Z","iopub.status.idle":"2023-07-15T21:26:50.987908Z","shell.execute_reply.started":"2023-07-15T21:26:50.983247Z","shell.execute_reply":"2023-07-15T21:26:50.987079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***\n## Data geliştirme (Data Augmentation)\n\nResimler üzerinde yaptığımız ufak değişikler ve oluturulan yeni özelliklere denir. ÖRnek vermek gerekirse resmin küçültülmesi büyütülmesi çevrilmesi gibi seçeneklerin değiştirilmesi ile yeni özelliklerin elde edilmesidir. Kodlar hazırdır, burada sadece değer değiştiriyoruz. \n***","metadata":{}},{"cell_type":"code","source":"# data augmentation\ndatagen = ImageDataGenerator(\n        featurewise_center=False,  # set input mean to 0 over the dataset\n        samplewise_center=False,  # set each sample mean to 0\n        featurewise_std_normalization=False,  # divide inputs by std of the dataset\n        samplewise_std_normalization=False,  # divide each input by its std\n        zca_whitening=False,  # dimesion reduction\n        rotation_range=5,  # randomly rotate images in the range 5 degrees\n        zoom_range = 0.1, # Randomly zoom image 10%\n        width_shift_range=0.1,  # randomly shift images horizontally 10%\n        height_shift_range=0.1,  # randomly shift images vertically 10%\n        horizontal_flip=False,  # randomly flip images\n        vertical_flip=False)  # randomly flip images\n\ndatagen.fit(xtrain)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:24:03.395593Z","iopub.execute_input":"2023-07-15T21:24:03.395952Z","iopub.status.idle":"2023-07-15T21:24:03.468798Z","shell.execute_reply.started":"2023-07-15T21:24:03.395924Z","shell.execute_reply":"2023-07-15T21:24:03.465994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***\n## Fit the model\nModelimizi oluşturduğumuza göre artık bu modeli fit edebiliriz. Doğruluğu arrtırmak için yukarıdaki bazı parametreler ile oynamak gerekebilir. Örnek data augmentation parametreleri, epoch ve batch sayısı, filtre sayısı, learnin rate gibi Buradan sonrası biraz deneme yanılma.  Güçlü bir bilgisayara ihtiyacınız olabilir.\n***","metadata":{}},{"cell_type":"code","source":"# Fit the model\nhistory = model.fit_generator(datagen.flow(xtrain,ytrain, batch_size=batch),\n                              epochs = epoch, validation_data = (xval,yval), steps_per_epoch=xtrain.shape[0] // batch)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:26:59.905023Z","iopub.execute_input":"2023-07-15T21:26:59.905406Z","iopub.status.idle":"2023-07-15T21:52:12.662602Z","shell.execute_reply.started":"2023-07-15T21:26:59.905376Z","shell.execute_reply":"2023-07-15T21:52:12.661174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['loss'], label='Training Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.title('Training and Validation Loss')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:52:12.919399Z","iopub.execute_input":"2023-07-15T21:52:12.919699Z","iopub.status.idle":"2023-07-15T21:52:13.158529Z","shell.execute_reply.started":"2023-07-15T21:52:12.919671Z","shell.execute_reply":"2023-07-15T21:52:13.156986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(test)\npredictions","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:52:13.161482Z","iopub.execute_input":"2023-07-15T21:52:13.161937Z","iopub.status.idle":"2023-07-15T21:52:21.289881Z","shell.execute_reply.started":"2023-07-15T21:52:13.161897Z","shell.execute_reply":"2023-07-15T21:52:21.288831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.argmax(predictions, axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:52:21.291104Z","iopub.execute_input":"2023-07-15T21:52:21.291396Z","iopub.status.idle":"2023-07-15T21:52:21.298103Z","shell.execute_reply.started":"2023-07-15T21:52:21.291371Z","shell.execute_reply":"2023-07-15T21:52:21.297068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions.shape","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:52:21.300477Z","iopub.execute_input":"2023-07-15T21:52:21.300880Z","iopub.status.idle":"2023-07-15T21:52:21.310736Z","shell.execute_reply.started":"2023-07-15T21:52:21.300849Z","shell.execute_reply":"2023-07-15T21:52:21.309327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = pd.DataFrame(data={\"ImageId\": range(1,28001),\"Label\":np.argmax(predictions, axis=1)})\nresult.to_csv(\"/kaggle/working/submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-07-15T21:52:41.549767Z","iopub.execute_input":"2023-07-15T21:52:41.551055Z","iopub.status.idle":"2023-07-15T21:52:41.586607Z","shell.execute_reply.started":"2023-07-15T21:52:41.551008Z","shell.execute_reply":"2023-07-15T21:52:41.584878Z"},"trusted":true},"execution_count":null,"outputs":[]}]}