diff --git a/.ipynb_checkpoints/YSA-checkpoint.ipynb b/.ipynb_checkpoints/YSA-checkpoint.ipynb new file mode 100644 index 0000000..96ee7af --- /dev/null +++ b/.ipynb_checkpoints/YSA-checkpoint.ipynb @@ -0,0 +1,1488 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Yapay Sinir Ağları\n", + "\n", + "Bu yazıyı ve kodları hazırlarken, Michael Nielson'ın açık kaynak Neural Networks and Deep Learning adlı [kitabından](http://neuralnetworksanddeeplearning.com) yararlandım.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numpy hatırlayalım" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](NumPy.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3, 2)\n", + "(2, 1)\n", + "[[1]\n", + " [2]\n", + " [3]]\n" + ] + } + ], + "source": [ + "e = np.array([[1,1],\n", + " [2,2],\n", + " [3,3,]])\n", + "f = np.array([[1],\n", + " [0]])\n", + "\n", + "print(np.shape(e))\n", + "print(np.shape(f))\n", + "print(e.dot(f))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 1]\n", + " [2 2]\n", + " [3 3]] \n", + "\n", + "[[1 2 3]\n", + " [1 2 3]] \n", + "\n" + ] + } + ], + "source": [ + "print(e,\"\\n\")\n", + "print(e.T,\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1] [1 2 3]\n", + "[2 2] [1 2 3]\n" + ] + } + ], + "source": [ + "for a, b in zip(e, e.T):\n", + " print(a,b)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n" + ] + } + ], + "source": [ + "dVeri = np.array([1,2,3])\n", + "def dFonk():\n", + " dVeri = 2 * dVeri\n", + "print(dVeri)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2 4 6]\n" + ] + } + ], + "source": [ + "dVeri = 2 * dVeri\n", + "print(dVeri)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 a\n", + "3 b\n", + "5 x\n", + "7 y\n" + ] + } + ], + "source": [ + "A = [1,3,5,7]\n", + "B = [\"a\",\"b\",\"x\",\"y\"]\n", + "for a,b in zip(A,B):\n", + " print(a,b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Yardimci Fonksiyonlar\n", + "\n", + "Sıgmoid fonksiyonu bir nöronun gelen toplam girdiyi, 0 ile 1 arasında bie çıktı değerine dönüştürür. Bu fonksiyonun türevi, kendisi ile 1den cıkarılmış halinin çarpınıma eşittir." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#### Yardimci Fonksiyonlar\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "def sigmoid_turevi(z):\n", + " return sigmoid(z)*(1-sigmoid(z))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ağı oluşturalım\n", + "Her bir katmanda kaç sinir hücresi olacağını bir listeden alarak, ağı oluşturan bir fonksiyon yazalım." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ag(katmanlar):\n", + " b = [np.random.randn(k, 1) for k in katmanlar[1:]] # bias degerleri (ilk katman haric)\n", + " W = [np.random.randn(k2, k1) for k1, k2 in zip(katmanlar[:-1],katmanlar[1:])]\n", + " return W, b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Örnek bir ağ" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[ 0.29721865 -1.68722801 -1.19931727]\n", + " [ 1.72890017 -0.7413104 0.13642544]\n", + " [ 0.76087426 2.03055655 -1.21882981]\n", + " [-0.92991474 0.94758249 -0.88114933]] \n", + "\n", + "[[ 0.06045751 -0.95326098 -1.16823026 -1.20507253]\n", + " [ 0.76818146 -1.60266147 1.87936828 -1.36899306]] \n", + "\n", + "bias :\n", + "[[ 0.90691754]\n", + " [-0.07374428]\n", + " [-1.76147276]\n", + " [-1.04148146]] \n", + "\n", + "[[ 0.99398613]\n", + " [ 2.08639626]] \n", + "\n" + ] + } + ], + "source": [ + "katmanlar = [3, 4, 2]\n", + "agirlik, bias = ag(katmanlar)\n", + "\n", + "print(\"agirlik :\")\n", + "for w in agirlik:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for b in bias:\n", + " print(b, \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### İleri Besleme\n", + "\n", + "![network.jpg](network.jpg)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![noronislem.JPG](noronislem.JPG)\n", + "\n", + "\n", + "Yukarıdaki yapay sinir ağı, 3 katmandan oluşmaktadır.\n", + "\n", + "> Birinci katman, girdi olarak $x_1$, $x_2$, $x_3$ verisini alir. \n", + "\n", + "ilk katmana özel olarak $a_i(1) = z_i(1) = x_i$dir. \n", + "\n", + "> Daha sonraki katmanlardaki nöronlar, bir önceki katmanın ağırlıklı toplamını girdi olarak kabul eder.\n", + "\n", + "\n", + "\n", + "Genel olarak,\n", + "\n", + "> $z_j(t) = \\sum_i w_{j,i}(t) \\times a_i(t-1) + b_j(t)$\n", + "\n", + "mesela $z_4(2) = w_{4,1}(2) \\times a_1(1) + w_{4,2}(2) \\times a_2(1) + w_{4,3}(2) \\times a_3(1) + b_4(2)$dir.\n", + "\n", + "> $w_{j,i}(t)$: $\\hspace{1cm}$ $(t-1)$'inci katmandaki $i$'nci nörondan $(t)$'inci katmandaki $j$nci nörona olan bağlantının ağırlık değeridir.\n", + "\n", + "Aynı şekilde\n", + "\n", + "> $b_{j}(t)$: $\\hspace{1cm}$ $(t)$'inci katmandaki $j$'nci nörona ait bias değeridir\n", + "\n", + "Bir nöronun çıktısı, sigmoid fonksiyonuna net girdi değeri verilerek hesaplanır.\n", + "\n", + "> $a_j(t) = \\sigma(z_j(t)) = \\frac{1}{1 + e^{z_j(t)}}$\n", + "\n", + "\n", + "#### İleri Besleme Algoritması\n", + "\n", + "Ağımız verilen girdi x ve ağırlık w, bias b değerlerine göre bir çıktı üretir. Vektörize edilerek yapılan işlem\n", + "\n", + "> $z(t) = w(t) \\cdot a(t-1) + b(t)$\n", + "\n", + "> $a(t) = \\sigma(z(t))$\n", + "\n", + "Her bir katmandaki nöronlar, önceki katmanlardaki nöron çıktılarını ağırlıklarıyla çarpıp son olarak bias(çapa ya da referans) değeri ekleyerek net girdi olan $z$ değerini bulurlar. Sonraki işlem ise, sigmoid ile çıktı değerini hesaplamaktır.\n", + "\n", + "\n", + "![vektorize.jpg](vektorize.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ileribesleme(a, agirlik, bias):\n", + " \"\"\"Katman katman yeni a degerleri hesaplaniyor\"\"\"\n", + " for w, b in zip(agirlik, bias):\n", + " z = np.dot(w, a)+b\n", + " a = sigmoid(z)\n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "katmanlar = [2, 3, 1]\n", + "agirlik, bias = ag(katmanlar)\n", + "\n", + "#girdi = [(0,0)]\n", + "#print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: [[0]\n", + " [0]] \n", + "\n", + "w: [[-0.85882301 0.16919212]\n", + " [ 0.20681862 0.16358916]\n", + " [ 2.0653042 -2.11029037]] \n", + "\n", + "b: [[-1.06762571]\n", + " [-0.03983092]\n", + " [-0.93356285]] \n", + "\n", + "Sonuc a: [[ 0.25585487]\n", + " [ 0.49004359]\n", + " [ 0.28220245]] \n", + "\n", + "a: [[ 0.25585487]\n", + " [ 0.49004359]\n", + " [ 0.28220245]] \n", + "\n", + "w: [[ 1.30604392 0.66338842 -0.13118192]] \n", + "\n", + "b: [[-0.36150485]] \n", + "\n", + "Sonuc a: [[ 0.56481382]] \n", + "\n" + ] + } + ], + "source": [ + "a = np.reshape([0,0], (2, 1))\n", + "for w, b in zip(agirlik, bias):\n", + " print(\"a:\", a, \"\\n\")\n", + " print(\"w:\", w, \"\\n\")\n", + " print(\"b:\", b, \"\\n\")\n", + " a = sigmoid(np.dot(w, a)+b)\n", + " print(\"Sonuc a:\", a, \"\\n\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.56481382]]\n" + ] + } + ], + "source": [ + "girdi = np.reshape([0,0], (2, 1))\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Yardımcı Türevler\n", + "\n", + "İleri Besleme algortimasına bakarak şu türevleri bulalım, bunlar bize geri besleme algoritmasında yardımcı olacak\n", + "\n", + "> \n", + "$$\n", + "\\frac{d z_j(t+1)}{d z_i(t)} = \n", + "\\frac{ d (\\sum_i w_{j,i}(t+1) \\times \\sigma(z_i(t)) + b_j(t+1))}{d z_i(t)}\n", + "=\n", + "w_{j,i}(t+1) \\times \\sigma'(z_i(t))\n", + "$$\n", + "\n", + "![back1.jpg](back1.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Geri Besleme\n", + "\n", + "Geri besleme algoritmasındaki kilit nokta,\n", + "bir nöronun ait girdideki değişim, hatayı nasıl etkiler sorusudur.\n", + "\n", + "\n", + "$$\n", + "\\Delta_j(t) =\n", + "\\frac{d Hata}{d z_j(t)}\n", + "$$\n", + "\n", + "Bu soruya vereceğimiz cevap ile, ağırlık ve bias değerlerini hatayı minimize edecek şekilde nasıl güncelleyeceğimizi bulacağız. Ve tabi gene gradyan iniş yöntemini kullanacağız.\n", + "\n", + "$$Hata = \\frac{1}{2} \\sum_j (y_j - a_j(T))^2$$\n", + "\n", + "$T$ ağdaki çıktı katmanıdır. Bu durumda çıktı katmanındaki j'inci nöronun hataya etkisi\n", + "\n", + "$$\n", + "\\Delta_j(T) =\n", + "\\frac{d Hata}{d z_j(T)} = \\frac{d Hata}{d a_j(T)} \\frac{d a_j(T)}{d z_j(T)}\n", + "= (a_j(T)-y_j ) \\frac{d a_j(T)}{d z_j(T)}\n", + "= (a_j(T)-y_j ) \\sigma'(z_j(T))\n", + "$$ \n", + "\n", + "Çıktı katmanındaki tüm nöronların hataya olan etkisini vektörize edersek\n", + "\n", + "> \n", + "$$\n", + "\\Delta(T) = \\frac{d Hata}{d z(T)} = (a(T)-y) \\sigma'(z(T))\n", + "$$\n", + "\n", + "Dikkat ederseniz, vektörize ettiğimizde indislerden kurtuluyoruz. Peki bir ara katmandan, önceki ara katmana hata nasıl yayılır?\n", + "\n", + "> \n", + "$$\n", + "\\Delta_i(t) =\n", + "\\frac{d Hata}{d z_i(t)} \n", + "= \n", + "\\sum_j \\frac{d Hata}{d z_j(t+1)} \\frac{d z_j(t+1)}{d z_i(t)}\n", + "= \n", + "\\sum_j \\Delta_j(t+1) \\frac{d z_j(t+1)}{d z_i(t)}\n", + "$$\n", + "\n", + "\n", + "Unutmayın ki, $(t)$'inci katmandaki nöron $i$'ye ait bir hata\n", + "$(t+1)$'inci katmandaki tüm $j$ nöronlarını etkiler. Sonuç olarak,\n", + "\n", + "> \n", + "$$\n", + "\\Delta_i(t) =\n", + "\\sum_j \\Delta_j(t+1) w_{j,i}(t+1) \\times \\sigma'(z_i(t))\n", + "$$\n", + "\n", + "$(t+1)$'inci katmandan $(t)$'inci katmana hatanın akışını vektörize edersek,\n", + "\n", + "$$\n", + "\\Delta(t) = w^T(t+1) \\cdot \\Delta(t+1) \\times \\sigma'(z(t))\n", + "$$\n", + "\n", + "![back2.jpg](back2.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Nöronlardaki hatanın güncellenmesi\n", + "\n", + "Çıktı katmanında\n", + "$$\n", + "\\Delta(T) = \\frac{d Hata}{d z(T)} = (a(T)-y) \\sigma'(z(T))\n", + "$$\n", + "\n", + "$(t+1)$'inci ara katmandan $(t)$'inci ara katmana hatanın akışı,\n", + "\n", + "$$\n", + "\\Delta(t) = w^T(t+1) \\cdot \\Delta(t+1) \\times \\sigma'(z(t))\n", + "$$\n", + "\n", + "### Ağırlık ve bias değerlerinin güncellenmesi\n", + "\n", + "Hatayı minimize eden en iyi parametreleri arıyoruz.\n", + "\n", + "Ağırlıktaki değişim\n", + "$$\n", + "\\frac{d Hata}{d w_{ji}(t)} = \\frac{d Hata}{d z_{j}(t)} \\frac{d z_{j}(t)}{d w_{ji}(t)} \n", + "= \\Delta_{j}(t) a_i(t-1)\n", + "$$\n", + "\n", + "Biasdeki değişim\n", + "$$\n", + "\\frac{d Hata}{d b_{j}(t)} = \\frac{d Hata}{d z_{j}(t)} \\frac{d z_{j}(t)}{d b_{j}(t)} \n", + "= \\Delta_{j}(t) \n", + "$$\n", + "\n", + "Geri Besleme algoritması neden hızlıdır?\n", + "\n", + "> Dikkat ederseniz $\\Delta_{j}(t)$ değerini sadece bir kez hesaplayıp, yeniden hesaplamadan bir çok yerde (Ağırlıktaki ve Biasdeki değişimde) tekrar tekrar kullanıyoruz. Bu bize hız kazandırıyor.\n", + "\n", + "![back3.jpg](back3.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def geribesleme(x,y, agirlik, bias): #girdi, cikti\n", + " delta_b = [np.zeros(b.shape) for b in bias]\n", + " delta_w = [np.zeros(w.shape) for w in agirlik]\n", + " \n", + " a = x\n", + " A = [a] # a degerleri\n", + " Z = [] # z degerleri\n", + " for w, b in zip(agirlik, bias):# z ve a degerlerini depolayalim\n", + " z = np.dot(w, a) + b\n", + " a = sigmoid(z)\n", + " Z.append(z)\n", + " A.append(a)\n", + " \n", + " hata = A[-1] - y # en son katmandaki hata\n", + " delta = hata * sigmoid_turevi(Z[-1])\n", + " delta_b[-1] = delta\n", + " delta_w[-1] = np.dot(delta, A[-2].T)\n", + " for k in range(2, len(katmanlar)):\n", + " delta = np.dot(agirlik[-k+1].T, delta) * sigmoid_turevi(Z[-k])\n", + " delta_b[-k] = delta\n", + " delta_w[-k] = np.dot(delta, A[-k-1].T)\n", + " return (delta_b, delta_w) " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradyan_inis(orneklem, adim, agirlik, bias):\n", + " delta_b = [np.zeros(b.shape) for b in bias]\n", + " delta_w = [np.zeros(w.shape) for w in agirlik]\n", + " \n", + " for x, y in orneklem:\n", + " # geri besleme tek bir x-y cifti icin w-b parametrelerinde degisimi verir\n", + " delta_bxy, delta_wxy = geribesleme(x, y, agirlik, bias)\n", + " # orneklemdeki farkli x-y ciftleri icin w-b degisimleri toplanir\n", + " delta_b = [nb+dnb for nb, dnb in zip(delta_b, delta_bxy)]\n", + " delta_w = [nw+dnw for nw, dnw in zip(delta_w, delta_wxy)]\n", + " \n", + " # w-b parametreleri turevlerinin tersi yonde guncelleniyor (gradyan_inis) \n", + " agirlik = [w-(adim/len(orneklem))*nw for w, nw in zip(agirlik, delta_w)]\n", + " bias = [b-(adim/len(orneklem))*nb for b, nb in zip(bias, delta_b)]\n", + " return agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ogrenme(veri, agirlik, bias, epochs = 30, sayi = 10, adim = 0.5, test_data=None):\n", + " \"\"\" epochs: kac kez tum veri kullaniacak\n", + " icinde sayi kadar ornek bulunan orneklemler(mini-batch)\n", + " gradyan-iniste kullaniliyor. Agirlik ve bias degerleri guncelleniyor.\n", + " Ogrenme:\n", + " en iyi Agirlik ve bias degerelerini bulmak\n", + " \"\"\"\n", + " veri = list(veri)\n", + " n = len(veri)\n", + "\n", + " if test_data:\n", + " test_data = list(test_data)\n", + " n_test = len(test_data)\n", + "\n", + " for j in range(epochs):\n", + " random.shuffle(veri)\n", + " for orneklem in [veri[k:k+sayi] for k in range(0, n, sayi)]:\n", + " w, b = gradyan_inis(orneklem, adim, agirlik, bias)\n", + " if test_data:\n", + " print(\"Epoch {} : {} / {}\".format(j, tahmin(test_data, w, b), n_test));\n", + " else:\n", + " print(\"Epoch {} complete\".format(j))\n", + " return agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def tahmin(test_data, agirlik, bias):\n", + " \"\"\"Return the number of test inputs for which the neural\n", + " network outputs the correct result. Note that the neural\n", + " network's output is assumed to be the index of whichever\n", + " neuron in the final layer has the highest activation.\"\"\"\n", + " test_results = [(np.argmax(ileribesleme(x, agirlik, bias)), y) for (x, y) in test_data]\n", + " return sum(int(x == y) for (x, y) in test_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Calisma\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "W = np.array([[1,1,1],[0,0,0]])" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n", + "(3,)\n" + ] + } + ], + "source": [ + "x = np.array([1,2,3])\n", + "print(x.T)\n", + "print(np.shape(x.T))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6 0]\n" + ] + } + ], + "source": [ + "print(np.dot(W,x))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1]\n", + " [2]\n", + " [3]]\n", + "(3, 1)\n" + ] + } + ], + "source": [ + "x = np.array([[1],[2],[3]])\n", + "print(x)\n", + "print(np.shape(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[6]\n", + " [0]]\n" + ] + } + ], + "source": [ + "print(np.dot(W,x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[4],\n", + " [9]]), array([[2],\n", + " [7]]), array([[0],\n", + " [0]]), array([[7],\n", + " [4]]), array([[1],\n", + " [0]])]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = np.random.randint(10, size=(5,2))\n", + "training_inputs = [np.reshape(x, (2, 1)) for x in X]\n", + "training_inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4],\n", + " [9]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "training_inputs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(training_inputs[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[4],\n", + " [9]]), array([[2],\n", + " [7]]), array([[0],\n", + " [0]])]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "training_inputs[0:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-0.09593291 0.17354599]\n", + " [-0.57961606 -0.35618948]\n", + " [-0.32218234 1.10238282]\n", + " [-0.88469027 1.35496269]\n", + " [ 0.28622968 1.10743193]]\n" + ] + } + ], + "source": [ + "# 1 ile 10 arasinda 100000 adet x1 ve x2\n", + "X = np.random.randn(100000,2)\n", + "print(X[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 0 0 0 0]\n" + ] + } + ], + "source": [ + "# ilk kolon ikinci kolondan buyukse, y=1\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "print(y[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "training_inputs = [np.reshape(x, (2, 1)) for x in X]" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "veri = zip(training_inputs,y)\n", + "print(veri)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X = np.random.randint(2, size=(100,2))\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "test_inputs = [np.reshape(x, (2, 1)) for x in X]\n", + "test_verisi = zip(test_inputs,y)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 : 80 / 100\n", + "Epoch 1 : 80 / 100\n", + "Epoch 2 : 80 / 100\n" + ] + } + ], + "source": [ + "katmanlar = [2, 10, 1]\n", + "agirlik, bias = ag(katmanlar)\n", + "agirlik, bias = ogrenme(veri, agirlik, bias, epochs = 3, test_data=test_verisi)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([array([[ 1.18095473, 0.53423322],\n", + " [-0.58155268, 0.10185382],\n", + " [-0.80426334, 0.26095208],\n", + " [ 0.76622115, 1.47263428],\n", + " [ 0.10961496, 0.0559628 ],\n", + " [-0.15497911, -1.04828676],\n", + " [-0.58667716, 1.26227533],\n", + " [ 1.31837991, -0.4234978 ],\n", + " [-0.53434866, 0.66481004],\n", + " [-2.14512623, -0.16385528]]),\n", + " array([[-0.38351141, -1.30812767, -0.40956386, 0.1505789 , 1.45330778,\n", + " -0.80897493, -0.74371651, 0.36516754, 2.10351043, -0.96184297]])],\n", + " [array([[ 1.27185787],\n", + " [ 0.32082366],\n", + " [ 0.30706861],\n", + " [ 0.27577491],\n", + " [-1.25779417],\n", + " [ 1.182 ],\n", + " [ 0.24413707],\n", + " [-1.63260298],\n", + " [ 1.41699634],\n", + " [-1.93241823]]), array([[-0.80143435]])])" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.68655399]]\n" + ] + } + ], + "source": [ + "girdi = [[100],[10]]\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.51525609]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:3: RuntimeWarning: overflow encountered in exp\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n" + ] + } + ], + "source": [ + "girdi = [[10],[1000]]\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import mnist_loader\n", + "training_data, validation_data, test_data = mnist_loader.load_data_wrapper()\n", + "training_data = list(training_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 2)" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = training_data[1:2]\n", + "np.shape(training_data[1:2])\n", + "#print(training_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "katmanlar = [784, 30, 10]\n", + "agirlik, bias = ag(katmanlar)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 : 1035 / 10000\n", + "Epoch 1 : 1034 / 10000\n", + "Epoch 2 : 1010 / 10000\n" + ] + }, + { + "data": { + "text/plain": [ + "([array([[-1.18772098, -0.13546604, -1.61934007, ..., 0.9554536 ,\n", + " 1.37470453, 1.54416376],\n", + " [ 0.7490318 , 0.04645829, 0.04544097, ..., 0.48730732,\n", + " -0.47316221, 0.79062721],\n", + " [-0.30534371, -0.4431419 , -0.11353317, ..., -2.49699752,\n", + " 1.31098953, -0.30979563],\n", + " ..., \n", + " [-0.47923463, 1.26768775, -0.38624203, ..., -1.4157727 ,\n", + " -0.97293826, -0.88493562],\n", + " [-0.85324024, 0.48001228, -0.23730557, ..., 0.05579599,\n", + " -1.45331804, -1.77638199],\n", + " [ 1.28490457, -0.73704989, -0.42869123, ..., -0.65351425,\n", + " -1.04373033, 0.65878372]]),\n", + " array([[ 1.01795030e+00, 1.35254362e+00, 6.65462082e-01,\n", + " -8.16932092e-01, 9.87519593e-01, -3.57652268e-01,\n", + " 9.68943988e-01, 1.19355951e+00, 2.66747361e+00,\n", + " 8.56533546e-01, -1.17443802e+00, -8.64342782e-02,\n", + " 4.46027009e-01, 1.40499062e-01, 1.30654501e+00,\n", + " 1.84455701e+00, -3.28845589e-01, -2.50770952e-01,\n", + " 7.88987407e-01, 1.22845982e+00, 1.45913093e+00,\n", + " -7.17835474e-01, 1.12468419e+00, 5.31309685e-01,\n", + " -9.61005460e-01, -1.15894928e+00, 1.38538248e-01,\n", + " -2.58157547e-01, 4.78491930e-01, -4.43656354e-01],\n", + " [ -3.26169183e-01, 1.04558842e+00, -4.17729030e-01,\n", + " -3.20814056e-02, -9.80352409e-01, -5.71746013e-01,\n", + " -1.21605700e+00, 3.92117706e-01, -5.45524555e-01,\n", + " -8.60851837e-01, -1.20087818e+00, -2.10361151e-02,\n", + " -1.40331209e+00, 3.18404653e-02, -2.13100866e-02,\n", + " -1.32245819e-01, -1.89781972e+00, -3.66242832e-01,\n", + " 8.18821691e-01, -1.85879904e+00, -1.31352778e-01,\n", + " -8.37960856e-02, -1.73885248e-01, -9.61540354e-02,\n", + " 3.40780337e-01, 5.58782647e-01, -1.84544905e-01,\n", + " -6.33812878e-01, 1.44680280e+00, 4.40596828e-01],\n", + " [ 9.43852180e-02, 8.04242687e-01, 1.12046255e-01,\n", + " 1.10337963e-01, -1.20387827e+00, 3.43285672e-02,\n", + " 3.11335879e-02, -1.15596282e+00, -5.17091088e-01,\n", + " -1.13807267e-01, -4.55960411e-01, 1.95897106e+00,\n", + " -2.94780158e-02, -6.45155379e-01, 1.18360556e+00,\n", + " -3.76884653e-01, 2.73046263e-01, -1.26310397e-02,\n", + " 4.93857274e-01, -8.48876141e-01, 6.53359362e-01,\n", + " -6.20787547e-01, -3.34259317e-01, 1.45749550e-01,\n", + " 6.34520238e-02, -8.61326389e-01, 1.01284844e+00,\n", + " -2.32098982e-01, 3.93096706e-01, 1.33216839e-01],\n", + " [ 7.48790562e-01, 2.81400133e-01, 1.55233028e+00,\n", + " 7.68583551e-01, -1.90091485e+00, 1.18208881e+00,\n", + " -4.10715668e-01, -5.12017583e-01, -1.62313824e-01,\n", + " 1.42214119e+00, -2.06378098e+00, -9.54432515e-01,\n", + " -7.99390023e-01, 1.00122127e+00, 5.16083112e-02,\n", + " 1.00387945e+00, -7.37804065e-01, -9.72083576e-01,\n", + " 5.47651579e-02, -2.37300072e-01, 4.73396222e-01,\n", + " 1.21645305e+00, 7.30625396e-01, 9.06705364e-01,\n", + " 1.38198638e+00, 2.90410489e-01, -9.08192685e-01,\n", + " -6.17696482e-01, 1.08405878e+00, -1.26849171e-01],\n", + " [ 2.01533258e-02, 1.43462788e-01, -4.24091683e-01,\n", + " -6.19572281e-02, 9.97945021e-01, 4.61629235e-01,\n", + " -1.63382534e-01, -2.08433741e-01, -1.18222988e+00,\n", + " 5.00106985e-01, 1.46233143e-01, 3.76343799e-01,\n", + " -3.19661331e-01, 1.17963464e+00, 6.92556786e-01,\n", + " 6.83266493e-02, 1.80584348e+00, 1.00324382e+00,\n", + " -1.18073922e-01, -1.61807175e+00, -1.86113130e-03,\n", + " -1.64941703e+00, 2.35203953e+00, -3.38488044e-01,\n", + " 2.55066985e+00, 7.96882174e-01, 7.67189320e-01,\n", + " -5.97696283e-01, 9.21681605e-01, 9.78628279e-01],\n", + " [ -9.39470784e-01, 5.37865958e-01, -1.24516137e-01,\n", + " 2.82964066e-01, 4.32216064e-01, -1.75693402e+00,\n", + " -5.30490398e-01, 1.34508267e+00, 1.24901509e+00,\n", + " -3.11743866e-01, -1.23009506e+00, 1.31654254e+00,\n", + " -8.36860030e-01, -1.19156137e+00, -9.81484702e-01,\n", + " -2.14908868e-01, 1.95639744e-01, -5.26153315e-01,\n", + " -7.66279833e-01, -1.90172854e-01, 1.18335199e+00,\n", + " -1.52647063e+00, -1.24392691e+00, -1.81794569e+00,\n", + " -5.55660733e-02, -2.69567828e-01, 4.12595001e-01,\n", + " -1.46017821e+00, -9.23643180e-01, -1.47016812e+00],\n", + " [ 3.76213250e-01, 9.94300975e-01, -1.31448841e+00,\n", + " 3.38016314e-01, 8.83271278e-01, -8.02433036e-01,\n", + " -5.33059923e-01, -9.42632733e-02, 1.13140741e+00,\n", + " 4.07784978e-01, -1.05157553e+00, -2.73212770e-01,\n", + " -1.04231405e+00, 4.53259526e-02, -9.35648607e-01,\n", + " -5.82719077e-01, 7.88373060e-01, -2.02552796e-01,\n", + " -1.76466765e+00, 3.23278097e-02, 2.22326203e+00,\n", + " -1.06020009e+00, -5.72939347e-01, -5.68152711e-01,\n", + " 5.61292355e-01, 1.17757995e+00, -1.04123442e+00,\n", + " 6.69700637e-01, 1.10325114e+00, 1.53119121e+00],\n", + " [ -7.18076051e-02, 4.77154904e-01, -2.28271606e+00,\n", + " 1.33202172e+00, 6.28802556e-01, 1.05624932e-01,\n", + " 3.08873073e-01, -2.07092514e+00, -1.34140031e-02,\n", + " -7.47297051e-01, -1.05689553e+00, -1.01790854e+00,\n", + " 5.80442896e-01, 1.05382255e+00, -6.85774539e-02,\n", + " 8.93896302e-02, 2.68780280e+00, -4.98569889e-01,\n", + " -9.63058688e-01, 7.19301998e-01, 1.34988137e+00,\n", + " -1.38335673e+00, 3.35222943e-01, -3.86576766e-01,\n", + " -1.23812194e+00, 1.63166545e+00, -5.64545254e-01,\n", + " -3.46921871e-01, -4.64495638e-01, -9.38292607e-02],\n", + " [ -2.19531904e+00, -2.68115995e-01, 3.06549260e-01,\n", + " -1.65609767e-01, 1.35214225e-01, 3.30980626e-01,\n", + " -1.18642666e+00, 1.86481445e+00, -4.39676495e-01,\n", + " 1.89171916e+00, 2.05139496e+00, 7.36725402e-01,\n", + " -2.09871377e-01, -1.34686080e+00, -6.57793670e-01,\n", + " 1.55012157e+00, -8.20650731e-01, -1.36021711e-01,\n", + " -2.41834683e-02, -3.87424505e-01, 1.38106641e+00,\n", + " -1.13705624e+00, -1.67566725e+00, 1.05134719e+00,\n", + " -1.10840434e+00, -9.17631052e-01, -1.47339332e+00,\n", + " -2.19626113e-01, 5.67522626e-01, 1.08848133e+00],\n", + " [ 3.16384336e-01, -8.59408448e-01, -1.40899144e+00,\n", + " -1.19303652e+00, 5.68009517e-01, 5.62018530e-02,\n", + " -5.25019315e-01, -3.84322235e-01, 1.37864467e+00,\n", + " 1.48473946e-01, 1.07183811e+00, 6.59898874e-01,\n", + " -6.56594537e-01, -4.16611670e-01, 1.95641044e-01,\n", + " -8.99512597e-01, 1.62553175e+00, -1.30936417e+00,\n", + " 5.60742343e-01, -1.37446102e+00, 1.18563281e+00,\n", + " -1.91939787e-01, -1.11618118e-01, -1.20180316e-01,\n", + " 2.58926459e-01, 7.91182294e-01, 1.18084552e+00,\n", + " 1.06375159e+00, -3.27087046e-01, 1.67994568e-01]])],\n", + " [array([[ 1.04959875],\n", + " [ 0.90030278],\n", + " [-1.20690014],\n", + " [-0.2387669 ],\n", + " [-0.51275495],\n", + " [ 1.26835956],\n", + " [ 0.50418079],\n", + " [-0.78007552],\n", + " [ 0.0938556 ],\n", + " [-1.08330376],\n", + " [-0.39385517],\n", + " [ 0.57556263],\n", + " [-0.28695118],\n", + " [ 0.46828876],\n", + " [ 1.02713998],\n", + " [ 0.53664695],\n", + " [ 1.72267342],\n", + " [ 0.28223999],\n", + " [-0.35348297],\n", + " [ 0.59075221],\n", + " [-0.23403876],\n", + " [-1.70599286],\n", + " [ 2.2388363 ],\n", + " [-1.08791493],\n", + " [ 0.55564671],\n", + " [-0.70640942],\n", + " [ 1.92349657],\n", + " [-1.52791439],\n", + " [ 0.51682992],\n", + " [ 0.33901905]]), array([[ 0.28111043],\n", + " [-0.37005242],\n", + " [ 1.25216018],\n", + " [ 0.27173082],\n", + " [ 1.21042982],\n", + " [ 0.02173274],\n", + " [ 0.07682395],\n", + " [-0.80273879],\n", + " [-0.34770322],\n", + " [ 0.38098875]])])" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ogrenme(training_data, agirlik, bias, 3, 10, 3.0, test_data=test_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "agirlik, bias = gradyan_inis(training_data[1:10],adim = 0.5, agirlik = agirlik, bias = bias)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([array([[-1.18772098, -0.13546604, -1.61934007, ..., 0.9554536 ,\n", + " 1.37470453, 1.54416376],\n", + " [ 0.7490318 , 0.04645829, 0.04544097, ..., 0.48730732,\n", + " -0.47316221, 0.79062721],\n", + " [-0.30534371, -0.4431419 , -0.11353317, ..., -2.49699752,\n", + " 1.31098953, -0.30979563],\n", + " ..., \n", + " [-0.47923463, 1.26768775, -0.38624203, ..., -1.4157727 ,\n", + " -0.97293826, -0.88493562],\n", + " [-0.85324024, 0.48001228, -0.23730557, ..., 0.05579599,\n", + " -1.45331804, -1.77638199],\n", + " [ 1.28490457, -0.73704989, -0.42869123, ..., -0.65351425,\n", + " -1.04373033, 0.65878372]]),\n", + " array([[ 1.01746272e+00, 1.35227310e+00, 6.65305437e-01,\n", + " -8.16958089e-01, 9.87360915e-01, -3.58077222e-01,\n", + " 9.68555040e-01, 1.19355122e+00, 2.66745432e+00,\n", + " 8.56334584e-01, -1.17445270e+00, -8.66845845e-02,\n", + " 4.45611269e-01, 1.40286508e-01, 1.30604778e+00,\n", + " 1.84405700e+00, -3.29337087e-01, -2.50849430e-01,\n", + " 7.88742894e-01, 1.22827507e+00, 1.45906924e+00,\n", + " -7.18273476e-01, 1.12452028e+00, 5.31006148e-01,\n", + " -9.61429460e-01, -1.15930685e+00, 1.38142368e-01,\n", + " -2.58364497e-01, 4.78100749e-01, -4.43745024e-01],\n", + " [ -3.24455354e-01, 1.04703707e+00, -4.17492815e-01,\n", + " -3.20060796e-02, -9.80088373e-01, -5.69956817e-01,\n", + " -1.21459201e+00, 3.92117829e-01, -5.45529474e-01,\n", + " -8.60621790e-01, -1.20087891e+00, -1.98771067e-02,\n", + " -1.40150017e+00, 3.21587182e-02, -1.95402122e-02,\n", + " -1.30460121e-01, -1.89603784e+00, -3.66161598e-01,\n", + " 8.19650656e-01, -1.85847659e+00, -1.31345577e-01,\n", + " -8.23132045e-02, -1.73610192e-01, -9.46719655e-02,\n", + " 3.42416713e-01, 5.59862061e-01, -1.82927359e-01,\n", + " -6.33462423e-01, 1.44798953e+00, 4.40890724e-01],\n", + " [ 5.67454887e-02, 8.00170377e-01, 8.91181158e-02,\n", + " 1.03637811e-01, -1.23104678e+00, 5.47115334e-03,\n", + " 1.70415382e-02, -1.15952489e+00, -5.26537399e-01,\n", + " -1.44758525e-01, -4.64307635e-01, 1.95318045e+00,\n", + " -5.98184181e-02, -6.75455632e-01, 1.14379498e+00,\n", + " -4.17173330e-01, 2.34106081e-01, -2.43107007e-02,\n", + " 4.71011878e-01, -8.82837713e-01, 6.43307587e-01,\n", + " -6.52554889e-01, -3.63214735e-01, 1.34556490e-01,\n", + " 4.04117124e-02, -8.94516587e-01, 9.83893059e-01,\n", + " -2.66724084e-01, 3.52624590e-01, 1.21500650e-01],\n", + " [ 7.37963698e-01, 2.80495451e-01, 1.54389810e+00,\n", + " 7.63366527e-01, -1.91077965e+00, 1.17443686e+00,\n", + " -4.13757547e-01, -5.15391704e-01, -1.68956088e-01,\n", + " 1.41843974e+00, -2.06901671e+00, -9.56132689e-01,\n", + " -8.08393872e-01, 9.98905962e-01, 4.07343019e-02,\n", + " 9.93006677e-01, -7.48409567e-01, -9.79456212e-01,\n", + " 5.35352855e-02, -2.40167618e-01, 4.72957055e-01,\n", + " 1.20598013e+00, 7.22440400e-01, 9.05418700e-01,\n", + " 1.37962684e+00, 2.86325335e-01, -9.18461263e-01,\n", + " -6.21555872e-01, 1.07351701e+00, -1.30512154e-01],\n", + " [ 1.97690979e-02, 1.43355897e-01, -4.24205748e-01,\n", + " -6.19628672e-02, 9.97642796e-01, 4.61251976e-01,\n", + " -1.63463260e-01, -2.08433788e-01, -1.18248886e+00,\n", + " 4.99926870e-01, 1.45981873e-01, 3.76292015e-01,\n", + " -3.19766369e-01, 1.17939092e+00, 6.92186112e-01,\n", + " 6.79693679e-02, 1.80550767e+00, 1.00323828e+00,\n", + " -1.18425465e-01, -1.61839829e+00, -2.15725456e-03,\n", + " -1.64978644e+00, 2.35194181e+00, -3.38847131e-01,\n", + " 2.55029350e+00, 7.96520385e-01, 7.67104574e-01,\n", + " -5.98026078e-01, 9.21313625e-01, 9.78609187e-01],\n", + " [ -9.39470835e-01, 5.37865948e-01, -1.24516176e-01,\n", + " 2.82964056e-01, 4.32216023e-01, -1.75693404e+00,\n", + " -5.30490435e-01, 1.34508266e+00, 1.24901507e+00,\n", + " -3.11743895e-01, -1.23009507e+00, 1.31654252e+00,\n", + " -8.36860055e-01, -1.19156140e+00, -9.81484753e-01,\n", + " -2.14908919e-01, 1.95639696e-01, -5.26153342e-01,\n", + " -7.66279839e-01, -1.90172881e-01, 1.18335199e+00,\n", + " -1.52647068e+00, -1.24392692e+00, -1.81794570e+00,\n", + " -5.55660974e-02, -2.69567862e-01, 4.12594950e-01,\n", + " -1.46017824e+00, -9.23643227e-01, -1.47016813e+00],\n", + " [ 3.48215553e-01, 9.91242127e-01, -1.32855895e+00,\n", + " 3.37704662e-01, 8.65097156e-01, -8.23267432e-01,\n", + " -5.45580585e-01, -9.44219008e-02, 1.12639168e+00,\n", + " 3.84492117e-01, -1.05614621e+00, -2.77511961e-01,\n", + " -1.05610434e+00, 2.00259179e-02, -9.63433341e-01,\n", + " -6.10308511e-01, 7.62020154e-01, -2.08351369e-01,\n", + " -1.78463270e+00, 8.66247214e-03, 2.20836657e+00,\n", + " -1.08481319e+00, -5.90311437e-01, -5.78414730e-01,\n", + " 5.37315082e-01, 1.14978956e+00, -1.05464234e+00,\n", + " 6.44233003e-01, 1.07529266e+00, 1.52494102e+00],\n", + " [ -1.09662232e-01, 4.69624472e-01, -2.29996181e+00,\n", + " 1.33005071e+00, 6.10147011e-01, 6.91517740e-02,\n", + " 2.91264812e-01, -2.07125302e+00, -2.01743967e-02,\n", + " -7.79220397e-01, -1.06300599e+00, -1.02318994e+00,\n", + " 5.50135531e-01, 1.01980386e+00, -1.08613974e-01,\n", + " 4.89800648e-02, 2.64842808e+00, -5.02326598e-01,\n", + " -9.97946234e-01, 6.86343720e-01, 1.33282759e+00,\n", + " -1.41422719e+00, 3.05726501e-01, -4.04752755e-01,\n", + " -1.27138872e+00, 1.59345374e+00, -5.82847592e-01,\n", + " -3.81894319e-01, -5.04217763e-01, -1.02162514e-01],\n", + " [ -2.19648500e+00, -2.68282539e-01, 3.06161755e-01,\n", + " -1.65640859e-01, 1.34059577e-01, 3.29863206e-01,\n", + " -1.18643269e+00, 1.86479549e+00, -4.40715115e-01,\n", + " 1.89115674e+00, 2.05039358e+00, 7.36724090e-01,\n", + " -2.09932432e-01, -1.34765396e+00, -6.58884066e-01,\n", + " 1.54908929e+00, -8.21600809e-01, -1.36058503e-01,\n", + " -2.53114108e-02, -3.88554868e-01, 1.37994928e+00,\n", + " -1.13821419e+00, -1.67594781e+00, 1.05023313e+00,\n", + " -1.10952351e+00, -9.18764947e-01, -1.47345559e+00,\n", + " -2.20762266e-01, 5.66350564e-01, 1.08845588e+00],\n", + " [ 2.69064710e-01, -8.66637257e-01, -1.44003931e+00,\n", + " -1.20002741e+00, 5.40272023e-01, 1.79228736e-02,\n", + " -5.54446598e-01, -3.87846615e-01, 1.37100610e+00,\n", + " 1.13205465e-01, 1.06606597e+00, 6.48681712e-01,\n", + " -6.94504185e-01, -4.53162703e-01, 1.45584099e-01,\n", + " -9.50306881e-01, 1.57612954e+00, -1.32312128e+00,\n", + " 5.29753711e-01, -1.40573331e+00, 1.17783396e+00,\n", + " -2.30443016e-01, -1.46263030e-01, -1.31449508e-01,\n", + " 2.26775095e-01, 7.50631386e-01, 1.15107015e+00,\n", + " 1.02865552e+00, -3.75408587e-01, 1.61189725e-01]])],\n", + " [array([[ 1.04879786],\n", + " [ 0.89568438],\n", + " [-1.19694129],\n", + " [-0.23859775],\n", + " [-0.51419681],\n", + " [ 1.2667969 ],\n", + " [ 0.50529259],\n", + " [-0.77566897],\n", + " [ 0.09127105],\n", + " [-1.08500914],\n", + " [-0.38960615],\n", + " [ 0.5705106 ],\n", + " [-0.28595486],\n", + " [ 0.46718575],\n", + " [ 1.02634851],\n", + " [ 0.53700664],\n", + " [ 1.71431076],\n", + " [ 0.2919968 ],\n", + " [-0.3506183 ],\n", + " [ 0.59222167],\n", + " [-0.2394085 ],\n", + " [-1.70151144],\n", + " [ 2.23951161],\n", + " [-1.08573733],\n", + " [ 0.55538033],\n", + " [-0.71063198],\n", + " [ 1.92193886],\n", + " [-1.53030425],\n", + " [ 0.51771325],\n", + " [ 0.33765771]]), array([[ 0.28060967],\n", + " [-0.36826308],\n", + " [ 1.21132798],\n", + " [ 0.26081612],\n", + " [ 1.21003606],\n", + " [ 0.02173269],\n", + " [ 0.04862819],\n", + " [-0.84408545],\n", + " [-0.34887561],\n", + " [ 0.32999799]])])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/.ipynb_checkpoints/Yapay Sinir A\304\237lar\304\261-checkpoint.ipynb" "b/.ipynb_checkpoints/Yapay Sinir A\304\237lar\304\261-checkpoint.ipynb" new file mode 100644 index 0000000..2d3c44e --- /dev/null +++ "b/.ipynb_checkpoints/Yapay Sinir A\304\237lar\304\261-checkpoint.ipynb" @@ -0,0 +1,635 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python ile Yapay Sinir Aglarina Giris\n", + "\n", + "> Bu calisma buyuk olcude, [inzva'da](https://inzva.com/open-source-application-form?utm_source=Open+Source+Challenge+Day&utm_campaign=4d2f44397c-EMAIL_CAMPAIGN_2018_01_02&utm_medium=email&utm_term=0_9a76f360b0-4d2f44397c-41568991) duzenlenen Open Source Challenge Day Vol.5 acik kaynak etkinligi kapsaminda Uzay Cetin tarafindan hazirlanmistir. Ayrica bu calisma Sariyer akademide duzenlenen [Liseler için Yapay Zekaya Giriş Eğitimi](https://uzay00.github.io/kahve/giris.html)'nde kullanilacaktir.\n", + "\n", + "\n", + "__Yapilacaklar__ \n", + "\n", + "* Toy data uretilecek\n", + "* sklearn kutuphanesi yardimi ile siniflandirma yapilacak\n", + "* sklearn kutuphanesinden elde edilen agirlik ve bias degerleri \n", + " \n", + " + sifirdan yazilan ileri besleme aginda kullanilarak tekrar siniflandirma yapilacak\n", + " + Daha sonrasinda geriyayilim algoritmasi sifirdan yazilarak, kendi yapay sinir agimizi yazacagiz.\n", + "* sklearn kutuphanesindeki yazi veri kumesi uzerinde kendi yapay sinir agimizla siniflandirma yapilacaktir.\n", + "\n", + "__Yararlanilan Kaynaklar__\n", + "* [veridefteri](http://www.veridefteri.com/2017/11/23/scikit-learn-ile-veri-analitigine-giris/)\n", + "* [Michael Nielson, Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Toy data\n", + "\n", + "$x_0$ ve $x_1$ olmak uzere iki girdi degeri ve bir cikti $y$ degeri olan veriyi uretecegiz. $x_0$ ve $x_1$ degerleri 0 ile 100 arasinda rastgele tamsayi degerler aliyor, $y$ ise $x_0>x_1$ ise $1$ degilse $0$ degeri almaktadir.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GIRDI:\n", + " [[ 8 89]\n", + " [57 40]\n", + " [68 92]\n", + " [67 20]\n", + " [57 60]]\n", + "CIKTI:\n", + " [0 1 0 1 0]\n" + ] + } + ], + "source": [ + "#numpy paketini yüklüyoruz.\n", + "import numpy as np\n", + "# GIRDI: 1 ile 100 arasinda 1000 adet x1 ve x2\n", + "X = np.random.randint(100, size=(1000,2))\n", + "# CIKTI: ilk kolon ikinci kolondan buyukse, y=1\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "\n", + "print(\"GIRDI:\\n\", X[1:6,])\n", + "print(\"CIKTI:\\n\", y[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "pos = (y == 1)\n", + "plt.plot(X[pos,0], X[pos,1], \"go\")\n", + "plt.plot(X[~pos,0], X[~pos,1], \"ro\")\n", + "plt.xlabel(\"$x_0$\");plt.ylabel(\"$x_1$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sklearn kutuphanesi yardimi ile siniflandirma" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ogrenme kumesinin uzunlugu: 750\n", + "test kumesinin uzunlugu: 250\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py:444: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", + " warnings.warn(msg, DataConversionWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[120 1]\n", + " [ 1 128]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "#################################################\n", + "# Datayi train ve test olark ayir\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", + "print(\"ogrenme kumesinin uzunlugu: \", len(X_train))\n", + "print(\"test kumesinin uzunlugu: \", len(X_test))\n", + "\n", + "#################################################\n", + "# Datayi normalize et \n", + "#. Standardize features by removing the mean and scaling to unit variance\n", + "#. Centering and scaling happen independently on each feature\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "#################################################\n", + "# yapay ogrenme\n", + "# Agin katmanlari 2 (girdi), 3(ara) , 1(cikti) \n", + " # SADECE ara katman degerlerini MLPClassifier'a veriyoruz\n", + " # sigmoid icin activation= 'logistic' seciyoruz\n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(3),max_iter=500)\n", + "mlp.fit(X_train,y_train)\n", + "\n", + "\n", + "#################################################\n", + "# tahminde bulun\n", + "predictions = mlp.predict(X_test)\n", + "# sonuclara bak\n", + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sifirdan Ileri Besleme Agi\n", + "\n", + "sklearn kutuphanesinden elde edilen agirlik (mlp.coefs_) ve bias (mlp.intercepts_) degerlerini kendi ileri besleme agimizda kullanacagiz." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[-1.88141318 1.71888803]\n", + " [ 1.49093284 -1.22026666]\n", + " [ 1.7194988 -2.08641553]] \n", + "\n", + "[[-2.30193491 1.1164206 2.13425249]] \n", + "\n", + "bias :\n", + "[[ 0.1702897 ]\n", + " [-0.18059533]\n", + " [-0.17099307]] \n", + "\n", + "[[-0.31920663]] \n", + "\n" + ] + } + ], + "source": [ + "# W, b icinde sklearn kutuphanesinden gelen agirlik ve bias degerlerini tutacagiz\n", + "W, b = [], []\n", + "for c, i in zip(mlp.coefs_, mlp.intercepts_):\n", + " W.append(c.T)\n", + " b.append(i.reshape((len(i), 1)))\n", + " \n", + "# Agirliklar (girdi-ara) 3x2 matris\n", + "# Agirliklar (ara-cikti) 1x3 matris\n", + "print(\"agirlik :\")\n", + "for w in W:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for i in b:\n", + " print(i, \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ornek bir veride ileri besleme agimizin ciktilari sklearn ciktilari ile karsilastiralim. Ama oncelikle ornek verimizin de normalize edilmesi gerekiyor." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-1.46634628 -1.72167202]\n", + " [-1.50243 -1.72167202]\n", + " [-1.57459745 -1.58067849]\n", + " [-1.61068117 -1.54543011]\n", + " [-1.75501606 -1.43968496]]\n", + "Tahmin: \n", + " [1 1 0 0 0]\n" + ] + } + ], + "source": [ + "# help(StandardScaler)\n", + "ornek_veri = [ [9, 1],\n", + " [8,1],\n", + " [6,5],\n", + " [5,6],\n", + " [1,9]]\n", + "ornek_veri = scaler.transform(ornek_veri)\n", + "print(ornek_veri)\n", + "\n", + "tahmin = mlp.predict(ornek_veri)\n", + "print(\"Tahmin: \\n\", tahmin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ileri Besleme Agimizi yazalim" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#### Yardimci Fonksiyonlar\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "def sigmoid_turevi(z):\n", + " return sigmoid(z)*(1-sigmoid(z))\n", + "\n", + "def ileribesleme(a, agirlik, bias, goster = False):\n", + " \"\"\"Katman katman yeni a degerleri hesaplaniyor\n", + " Girdinin transpozu (satirlar ozellik, sutunlar gozlem) a olarak verilmeli. \n", + " \"\"\"\n", + " for w, b in zip(agirlik, bias):\n", + " if goster:\n", + " print(\"w:\\n\", w, \"\\n\")\n", + " print(\"a:\\n\", a, \"\\n\")\n", + " print(\"np.dot(w, a):\\n\", np.dot(w, a), \"\\n\")\n", + " print(\"b:\\n\", b, \"\\n\")\n", + " print(\"a = sigmoid(np.dot(w, a)+b):\\n\", sigmoid(np.dot(w, a)+b), \"\\n\\n\",\n", + " \"**\"*20,\"\\n\\n\")\n", + " z = np.dot(w, a)+b\n", + " a = sigmoid(z) \n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w:\n", + " [[-1.88141318 1.71888803]\n", + " [ 1.49093284 -1.22026666]\n", + " [ 1.7194988 -2.08641553]] \n", + "\n", + "a:\n", + " [[-1.46634628 -1.50243 -1.57459745 -1.61068117 -1.75501606]\n", + " [-1.72167202 -1.72167202 -1.58067849 -1.54543011 -1.43968496]] \n", + "\n", + "np.dot(w, a):\n", + " [[-0.20055821 -0.13266982 0.24545906 0.37393548 0.82725312]\n", + " [-0.08532486 -0.13912327 -0.41876979 -0.51558063 -0.85981154]\n", + " [ 1.07074256 1.00869665 0.59043372 0.45484502 -0.01396697]] \n", + "\n", + "b:\n", + " [[ 0.1702897 ]\n", + " [-0.18059533]\n", + " [-0.17099307]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.49243345 0.50940386 0.60246552 0.63279475 0.73057519]\n", + " [ 0.43390896 0.42074433 0.35448896 0.33266061 0.2610715 ]\n", + " [ 0.71089802 0.69798134 0.60334939 0.57049033 0.45389136]] \n", + "\n", + " **************************************** \n", + "\n", + "\n", + "w:\n", + " [[-2.30193491 1.1164206 2.13425249]] \n", + "\n", + "a:\n", + " [[ 0.49243345 0.50940386 0.60246552 0.63279475 0.73057519]\n", + " [ 0.43390896 0.42074433 0.35448896 0.33266061 0.2610715 ]\n", + " [ 0.71089802 0.69798134 0.60334939 0.57049033 0.45389136]] \n", + "\n", + "np.dot(w, a):\n", + " [[ 0.86811102 0.78678152 0.29662231 0.13230723 -0.42155217]] \n", + "\n", + "b:\n", + " [[-0.31920663]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.63388136 0.61480961 0.49435416 0.45341069 0.32283824]] \n", + "\n", + " **************************************** \n", + "\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 0.63388136, 0.61480961, 0.49435416, 0.45341069, 0.32283824]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ileribesleme(ornek_veri.T, W, b, goster = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 1, 0, 0, 0]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Ciktimiz\n", + "(ileribesleme(ornek_veri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True, True, True]], dtype=bool)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## sklearn ciktisi ile ayni sonucu urettik mi?\n", + "tahmin == (ileribesleme(ornek_veri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sifirdan Geri Yayilim Algoritmasi\n", + "\n", + "Bu calisma henuz tamamlanmadi. Ama vakit buldugumda ekteki baglantidaki calisma ile birlestirecegim. \n", + "\n", + "https://uzay00.github.io/kahve/dersler/yapayzeka/ders11/YSA.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rakamlar veri kümesi uzerinde calisma" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Etiket: 0\n" + ] + } + ], + "source": [ + "#Rakamlar veri kümesini yüklüyoruz.\n", + "from sklearn.datasets import load_digits\n", + "#Veri kümesini etiket değerleriyle birlikte yükleyelim.\n", + "X,y = load_digits(return_X_y=True)\n", + "\n", + "rakam1 = X[0]\n", + "rakam1 = np.reshape(rakam1, (8,8))\n", + "\n", + "plt.figure(figsize= (2,2))\n", + "plt.imshow(rakam1, cmap=\"gray_r\")\n", + "plt.show()\n", + "etiket1 = y[0]\n", + "print('Etiket: ' + str(etiket1))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(360, 64)\n", + "(360,)\n" + ] + } + ], + "source": [ + "# Bu veri kumesinden sadece 0 ve 1 rakamlarini secelim\n", + "X= X[y < 2]\n", + "y= y[y < 2]\n", + "\n", + "print(X.shape)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ogrenme kumesinin uzunlugu: 270\n", + "test kumesinin uzunlugu: 90\n", + "[[41 0]\n", + " [ 0 49]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "#################################################\n", + "# Datayi train ve test olark ayir\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", + "print(\"ogrenme kumesinin uzunlugu: \", len(X_train))\n", + "print(\"test kumesinin uzunlugu: \", len(X_test))\n", + "\n", + "#################################################\n", + "# Datayi normalize et \n", + "#. Standardize features by removing the mean and scaling to unit variance\n", + "#. Centering and scaling happen independently on each feature\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "#################################################\n", + "# yapay ogrenme\n", + "# Agin katmanlari 2 (girdi), 3(ara) , 1(cikti) \n", + " # SADECE ara katman degerlerini MLPClassifier'a veriyoruz\n", + " # sigmoid icin activation= 'logistic' seciyoruz\n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(3),max_iter=500)\n", + "mlp.fit(X_train,y_train)\n", + "\n", + "\n", + "#################################################\n", + "# tahminde bulun\n", + "predictions = mlp.predict(X_test)\n", + "# sonuclara bak\n", + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/YapayOgrenme-checkpoint.ipynb b/.ipynb_checkpoints/YapayOgrenme-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/YapayOgrenme-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/NumPy.png b/NumPy.png new file mode 100755 index 0000000..6bbd7cb Binary files /dev/null and b/NumPy.png differ diff --git a/YSA.html b/YSA.html new file mode 100644 index 0000000..6c8530f --- /dev/null +++ b/YSA.html @@ -0,0 +1,12649 @@ + + + +YSA + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+

Yapay Sinir Ağları

Bu yazıyı ve kodları hazırlarken, Michael Nielson'ın açık kaynak Neural Networks and Deep Learning adlı kitabından yararlandım.

+ +
+
+
+
+
+
+
+

Numpy hatırlayalım

+
+
+
+
+
+
In [2]:
+
+
+
import random
+import numpy as np
+
+ +
+
+
+ +
+
+
+
+
+

+ +
+
+
+
+
+
In [2]:
+
+
+
e = np.array([[1,1],
+              [2,2],
+              [3,3,]])
+f = np.array([[1],
+              [0]])
+
+print(np.shape(e))
+print(np.shape(f))
+print(e.dot(f))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
(3, 2)
+(2, 1)
+[[1]
+ [2]
+ [3]]
+
+
+
+ +
+
+ +
+
+
+
In [3]:
+
+
+
print(e,"\n")
+print(e.T,"\n")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[[1 1]
+ [2 2]
+ [3 3]] 
+
+[[1 2 3]
+ [1 2 3]] 
+
+
+
+
+ +
+
+ +
+
+
+
In [4]:
+
+
+
for a, b in zip(e, e.T):
+    print(a,b)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[1 1] [1 2 3]
+[2 2] [1 2 3]
+
+
+
+ +
+
+ +
+
+
+
In [5]:
+
+
+
dVeri = np.array([1,2,3])
+def dFonk():
+    dVeri = 2 * dVeri
+print(dVeri)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[1 2 3]
+
+
+
+ +
+
+ +
+
+
+
In [6]:
+
+
+
dVeri = 2 * dVeri
+print(dVeri)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[2 4 6]
+
+
+
+ +
+
+ +
+
+
+
In [12]:
+
+
+
A = [1,3,5,7]
+B = ["a","b","x","y"]
+for a,b in zip(A,B):
+    print(a,b)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
1 a
+3 b
+5 x
+7 y
+
+
+
+ +
+
+ +
+
+
+
+
+

Yardimci Fonksiyonlar

Sıgmoid fonksiyonu bir nöronun gelen toplam girdiyi, 0 ile 1 arasında bie çıktı değerine dönüştürür. Bu fonksiyonun türevi, kendisi ile 1den cıkarılmış halinin çarpınıma eşittir.

+ +
+
+
+
+
+
In [3]:
+
+
+
#### Yardimci Fonksiyonlar
+def sigmoid(z):
+    return 1.0/(1.0+np.exp(-z))
+def sigmoid_turevi(z):
+    return sigmoid(z)*(1-sigmoid(z))
+
+ +
+
+
+ +
+
+
+
+
+

Ağı oluşturalım

Her bir katmanda kaç sinir hücresi olacağını bir listeden alarak, ağı oluşturan bir fonksiyon yazalım.

+ +
+
+
+
+
+
In [4]:
+
+
+
def ag(katmanlar):
+    b = [np.random.randn(k, 1) for k in katmanlar[1:]] # bias degerleri (ilk katman haric)
+    W = [np.random.randn(k2, k1) for k1, k2 in zip(katmanlar[:-1],katmanlar[1:])]
+    return W, b
+
+ +
+
+
+ +
+
+
+
+
+

Örnek bir ağ

+
+
+
+
+
+
In [5]:
+
+
+
katmanlar = [3, 4, 2]
+agirlik, bias = ag(katmanlar)
+
+print("agirlik :")
+for w in agirlik:
+    print(w, "\n")
+    
+print("bias :")
+for b in bias:
+    print(b, "\n")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
agirlik :
+[[-0.04005386  0.21860365 -0.32980181]
+ [-0.40262956 -0.01047463  0.57743151]
+ [ 0.9068956  -0.21246794 -0.02132604]
+ [-0.07518461  0.87974976 -1.38621772]] 
+
+[[-0.98802444 -0.36131995 -0.11872955 -0.0167493 ]
+ [-1.39753395  0.97422027 -0.40559582 -0.59108817]] 
+
+bias :
+[[-1.28343638]
+ [ 0.68218636]
+ [-1.28666915]
+ [-0.4040681 ]] 
+
+[[ 0.63173728]
+ [ 0.15498926]] 
+
+
+
+
+ +
+
+ +
+
+
+
+
+

İleri Besleme

network.pdf

+ +
+
+
+
+
+
+
+

noronislem.JPG

+

Yukarıdaki yapay sinir ağı, 3 katmandan oluşmaktadır.

+

Birinci katman, girdi olarak $x_1$, $x_2$, $x_3$ verisini alir.

+
+

ilk katmana özel olarak $a_i(1) = z_i(1) = x_i$dir.

+

Daha sonraki katmanlardaki nöronlar, bir önceki katmanın ağırlıklı toplamını girdi olarak kabul eder.

+
+

Genel olarak,

+

$z_j(t) = \sum_i w_{j,i}(t) \times a_i(t-1) + b_j(t)$

+
+

mesela $z_4(2) = w_{4,1}(2) \times a_1(1) + w_{4,2}(2) \times a_2(1) + w_{4,3}(2) \times a_3(1) + b_4(2)$dir.

+

$w_{j,i}(t)$: $\hspace{1cm}$ $(t-1)$'inci katmandaki $i$'nci nörondan $(t)$'inci katmandaki $j$nci nörona olan bağlantının ağırlık değeridir.

+
+

Aynı şekilde

+

$b_{j}(t)$: $\hspace{1cm}$ $(t)$'inci katmandaki $j$'nci nörona ait bias değeridir

+
+

Bir nöronun çıktısı, sigmoid fonksiyonuna net girdi değeri verilerek hesaplanır.

+

$a_j(t) = \sigma(z_j(t)) = \frac{1}{1 + e^{z_j(t)}}$

+
+

İleri Besleme Algoritması

Ağımız verilen girdi x ve ağırlık w, bias b değerlerine göre bir çıktı üretir. Vektörize edilerek yapılan işlem

+

$z(t) = w(t) \cdot a(t-1) + b(t)$

+

$a(t) = \sigma(z(t))$

+
+

Her bir katmandaki nöronlar, önceki katmanlardaki nöron çıktılarını ağırlıklarıyla çarpıp son olarak bias(çapa ya da referans) değeri ekleyerek net girdi olan $z$ değerini bulurlar. Sonraki işlem ise, sigmoid ile çıktı değerini hesaplamaktır.

+

vektorize.jpg

+ +
+
+
+
+
+
In [6]:
+
+
+
def ileribesleme(a, agirlik, bias):
+    """Katman katman yeni a degerleri hesaplaniyor"""
+    for w, b in zip(agirlik, bias):
+        z = np.dot(w, a)+b
+        a = sigmoid(z)
+    return a
+
+ +
+
+
+ +
+
+
+
In [7]:
+
+
+
katmanlar = [2, 3, 1]
+agirlik, bias = ag(katmanlar)
+
+girdi = [[0], 
+         [0]]
+print(ileribesleme(girdi, agirlik, bias))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[[ 0.37430523]]
+
+
+
+ +
+
+ +
+
+
+
+
+

Yardımcı Türevler

İleri Besleme algortimasına bakarak şu türevleri bulalım, bunlar bize geri besleme algoritmasında yardımcı olacak

+
$$ +\frac{d z_j(t+1)}{d z_i(t)} = +\frac{ d (\sum_i w_{j,i}(t+1) \times \sigma(z_i(t)) + b_j(t+1))}{d z_i(t)} += +w_{j,i}(t+1) \times \sigma'(z_i(t)) +$$ +
+

back1.jpg

+ +
+
+
+
+
+
+
+

Geri Besleme

Geri besleme algoritmasındaki kilit nokta, +bir nöronun ait girdideki değişim, hatayı nasıl etkiler sorusudur.

+$$ +\Delta_j(t) = +\frac{d Hata}{d z_j(t)} +$$

Bu soruya vereceğimiz cevap ile, ağırlık ve bias değerlerini hatayı minimize edecek şekilde nasıl güncelleyeceğimizi bulacağız. Ve tabi gene gradyan iniş yöntemini kullanacağız.

+$$Hata = \frac{1}{2} \sum_j (y_j - a_j(T))^2$$

$T$ ağdaki çıktı katmanıdır. Bu durumda çıktı katmanındaki j'inci nöronun hataya etkisi

+$$ +\Delta_j(T) = +\frac{d Hata}{d z_j(T)} = \frac{d Hata}{d a_j(T)} \frac{d a_j(T)}{d z_j(T)} += (a_j(T)-y_j ) \frac{d a_j(T)}{d z_j(T)} += (a_j(T)-y_j ) \sigma'(z_j(T)) +$$

+

Çıktı katmanındaki tüm nöronların hataya olan etkisini vektörize edersek

+
$$ +\Delta(T) = \frac{d Hata}{d z(T)} = (a(T)-y) \sigma'(z(T)) +$$ +
+

Dikkat ederseniz, vektörize ettiğimizde indislerden kurtuluyoruz. Peki bir ara katmandan, önceki ara katmana hata nasıl yayılır?

+
$$ +\Delta_i(t) = +\frac{d Hata}{d z_i(t)} += +\sum_j \frac{d Hata}{d z_j(t+1)} \frac{d z_j(t+1)}{d z_i(t)} += +\sum_j \Delta_j(t+1) \frac{d z_j(t+1)}{d z_i(t)} +$$ +
+

Unutmayın ki, $(t)$'inci katmandaki nöron $i$'ye ait bir hata +$(t+1)$'inci katmandaki tüm $j$ nöronlarını etkiler. Sonuç olarak,

+
$$ +\Delta_i(t) = +\sum_j \Delta_j(t+1) w_{j,i}(t+1) \times \sigma'(z_i(t)) +$$ +
+

$(t+1)$'inci katmandan $(t)$'inci katmana hatanın akışını vektörize edersek,

+$$ +\Delta(t) = w^T(t+1) \cdot \Delta(t+1) \times \sigma'(z(t)) +$$

back2.jpg

+ +
+
+
+
+
+
+
+

Nöronlardaki hatanın güncellenmesi

Çıktı katmanında +$$ +\Delta(T) = \frac{d Hata}{d z(T)} = (a(T)-y) \sigma'(z(T)) +$$

+

$(t+1)$'inci ara katmandan $(t)$'inci ara katmana hatanın akışı,

+$$ +\Delta(t) = w^T(t+1) \cdot \Delta(t+1) \times \sigma'(z(t)) +$$

Ağırlık ve bias değerlerinin güncellenmesi

Hatayı minimize eden en iyi parametreleri arıyoruz.

+

Ağırlıktaki değişim +$$ +\frac{d Hata}{d w_{ji}(t)} = \frac{d Hata}{d z_{j}(t)} \frac{d z_{j}(t)}{d w_{ji}(t)} += \Delta_{j}(t) a_i(t-1) +$$

+

Biasdeki değişim +$$ +\frac{d Hata}{d b_{j}(t)} = \frac{d Hata}{d z_{j}(t)} \frac{d z_{j}(t)}{d b_{j}(t)} += \Delta_{j}(t) +$$

+

Geri Besleme algoritması neden hızlıdır?

+

Dikkat ederseniz $\Delta_{j}(t)$ değerini sadece bir kez hesaplayıp, yeniden hesaplamadan bir çok yerde (Ağırlıktaki ve Biasdeki değişimde) tekrar tekrar kullanıyoruz. Bu bize hız kazandırıyor.

+
+

back3.jpg

+ +
+
+
+
+
+
In [14]:
+
+
+
def geribesleme(x,y, agirlik, bias): #girdi, cikti
+    delta_b = [np.zeros(b.shape) for b in bias]
+    delta_w = [np.zeros(w.shape) for w in agirlik]
+    
+    a = x
+    A = [a] # a degerleri
+    Z = []  # z degerleri
+    for w, b in zip(agirlik, bias):# z ve a degerlerini depolayalim
+        z = np.dot(w, a) + b
+        a = sigmoid(z)
+        Z.append(z)
+        A.append(a)
+    
+    hata = A[-1] - y # en son katmandaki hata
+    delta = hata * sigmoid_turevi(Z[-1])
+    delta_b[-1] = delta
+    delta_w[-1] = np.dot(delta, A[-2].T)
+    for k in range(2, len(katmanlar)):
+        delta = np.dot(agirlik[-k+1].T, delta) * sigmoid_turevi(Z[-k])
+        delta_b[-k] = delta
+        delta_w[-k] = np.dot(delta, A[-k-1].T)
+    return (delta_b, delta_w)  
+
+ +
+
+
+ +
+
+
+
In [13]:
+
+
+
def gradyan_inis(orneklem, adim, agirlik, bias):
+    delta_b = [np.zeros(b.shape) for b in bias]
+    delta_w = [np.zeros(w.shape) for w in agirlik]
+    
+    for x, y in orneklem:
+        delta_bxy, delta_wxy = geribesleme(x, y, agirlik, bias)
+        
+        delta_b = [nb+dnb for nb, dnb in zip(delta_b, delta_bxy)]
+        delta_w = [nw+dnw for nw, dnw in zip(delta_w, delta_wxy)]
+        
+    agirlik = [w-(adim/len(orneklem))*nw for w, nw in zip(agirlik, delta_w)]
+    bias = [b-(adim/len(orneklem))*nb for b, nb in zip(bias, delta_b)]
+    return agirlik, bias
+
+ +
+
+
+ +
+
+
+
In [14]:
+
+
+
def ogrenme(veri, agirlik, bias, epochs = 30, sayi = 10, adim = 0.5, test_data=None):
+    """ epochs: kac kez tum veri kullaniacak
+        icinde sayi kadar ornek bulunan orneklemler(mini-batch)
+        gradyan-iniste kullaniliyor. Agirlik ve bias degerleri guncelleniyor.
+        Ogrenme:
+            en iyi Agirlik ve bias degerelerini bulmak
+    """
+    veri = list(veri)
+    n = len(veri)
+
+    if test_data:
+        test_data = list(test_data)
+        n_test = len(test_data)
+
+    for j in range(epochs):
+        random.shuffle(veri)
+        for orneklem in [veri[k:k+sayi] for k in range(0, n, sayi)]:
+            agirlik, bias = gradyan_inis(orneklem, adim, agirlik, bias)
+        if test_data:
+            print("Epoch {} : {} / {}".format(j, tahmin(test_data, agirlik, bias), n_test));
+        else:
+            print("Epoch {} complete".format(j))
+
+ +
+
+
+ +
+
+
+
In [15]:
+
+
+
def tahmin(test_data, agirlik, bias):
+    """Return the number of test inputs for which the neural
+    network outputs the correct result. Note that the neural
+    network's output is assumed to be the index of whichever
+    neuron in the final layer has the highest activation."""
+    test_results = [(np.argmax(ileribesleme(x, agirlik, bias)), y) for (x, y) in test_data]
+    return sum(int(x == y) for (x, y) in test_results)
+
+ +
+
+
+ +
+
+
+
+
+

Calisma

+
+
+
+
+
+
In [16]:
+
+
+
katmanlar = [2, 3, 1]
+agirlik, bias = ag(katmanlar)
+veri = []
+test = []
+ogrenme(veri, agirlik, bias, test_data= test)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Epoch 0 complete
+Epoch 1 complete
+Epoch 2 complete
+Epoch 3 complete
+Epoch 4 complete
+Epoch 5 complete
+Epoch 6 complete
+Epoch 7 complete
+Epoch 8 complete
+Epoch 9 complete
+Epoch 10 complete
+Epoch 11 complete
+Epoch 12 complete
+Epoch 13 complete
+Epoch 14 complete
+Epoch 15 complete
+Epoch 16 complete
+Epoch 17 complete
+Epoch 18 complete
+Epoch 19 complete
+Epoch 20 complete
+Epoch 21 complete
+Epoch 22 complete
+Epoch 23 complete
+Epoch 24 complete
+Epoch 25 complete
+Epoch 26 complete
+Epoch 27 complete
+Epoch 28 complete
+Epoch 29 complete
+
+
+
+ +
+
+ +
+
+
+
In [17]:
+
+
+
import mnist_loader
+training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
+training_data = list(training_data)
+
+ +
+
+
+ +
+
+
+
In [18]:
+
+
+
katmanlar = [784, 30, 10]
+agirlik, bias = ag(katmanlar)
+
+ +
+
+
+ +
+
+
+
In [19]:
+
+
+
ogrenme(training_data, agirlik, bias, 3, 10, 3.0, test_data=test_data)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Epoch 0 : 9075 / 10000
+Epoch 1 : 9255 / 10000
+Epoch 2 : 9312 / 10000
+
+
+
+ +
+
+ +
+
+
+
In [20]:
+
+
+
agirlik, bias = gradyan_inis(training_data[1:10],adim = 0.5, agirlik = agirlik, bias = bias)
+
+ +
+
+
+ +
+
+
+
In [21]:
+
+
+
test_data
+
+ +
+
+
+ +
+
+ + +
+ +
Out[21]:
+ + + + +
+
<zip at 0x10a0c0988>
+
+ +
+ +
+
+ +
+
+
+
In [ ]:
+
+
+
 
+
+ +
+
+
+ +
+
+
+ + + + + + diff --git a/YSA.ipynb b/YSA.ipynb new file mode 100644 index 0000000..96ee7af --- /dev/null +++ b/YSA.ipynb @@ -0,0 +1,1488 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Yapay Sinir Ağları\n", + "\n", + "Bu yazıyı ve kodları hazırlarken, Michael Nielson'ın açık kaynak Neural Networks and Deep Learning adlı [kitabından](http://neuralnetworksanddeeplearning.com) yararlandım.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numpy hatırlayalım" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](NumPy.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3, 2)\n", + "(2, 1)\n", + "[[1]\n", + " [2]\n", + " [3]]\n" + ] + } + ], + "source": [ + "e = np.array([[1,1],\n", + " [2,2],\n", + " [3,3,]])\n", + "f = np.array([[1],\n", + " [0]])\n", + "\n", + "print(np.shape(e))\n", + "print(np.shape(f))\n", + "print(e.dot(f))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 1]\n", + " [2 2]\n", + " [3 3]] \n", + "\n", + "[[1 2 3]\n", + " [1 2 3]] \n", + "\n" + ] + } + ], + "source": [ + "print(e,\"\\n\")\n", + "print(e.T,\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1] [1 2 3]\n", + "[2 2] [1 2 3]\n" + ] + } + ], + "source": [ + "for a, b in zip(e, e.T):\n", + " print(a,b)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n" + ] + } + ], + "source": [ + "dVeri = np.array([1,2,3])\n", + "def dFonk():\n", + " dVeri = 2 * dVeri\n", + "print(dVeri)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2 4 6]\n" + ] + } + ], + "source": [ + "dVeri = 2 * dVeri\n", + "print(dVeri)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 a\n", + "3 b\n", + "5 x\n", + "7 y\n" + ] + } + ], + "source": [ + "A = [1,3,5,7]\n", + "B = [\"a\",\"b\",\"x\",\"y\"]\n", + "for a,b in zip(A,B):\n", + " print(a,b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Yardimci Fonksiyonlar\n", + "\n", + "Sıgmoid fonksiyonu bir nöronun gelen toplam girdiyi, 0 ile 1 arasında bie çıktı değerine dönüştürür. Bu fonksiyonun türevi, kendisi ile 1den cıkarılmış halinin çarpınıma eşittir." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#### Yardimci Fonksiyonlar\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "def sigmoid_turevi(z):\n", + " return sigmoid(z)*(1-sigmoid(z))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ağı oluşturalım\n", + "Her bir katmanda kaç sinir hücresi olacağını bir listeden alarak, ağı oluşturan bir fonksiyon yazalım." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ag(katmanlar):\n", + " b = [np.random.randn(k, 1) for k in katmanlar[1:]] # bias degerleri (ilk katman haric)\n", + " W = [np.random.randn(k2, k1) for k1, k2 in zip(katmanlar[:-1],katmanlar[1:])]\n", + " return W, b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Örnek bir ağ" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[ 0.29721865 -1.68722801 -1.19931727]\n", + " [ 1.72890017 -0.7413104 0.13642544]\n", + " [ 0.76087426 2.03055655 -1.21882981]\n", + " [-0.92991474 0.94758249 -0.88114933]] \n", + "\n", + "[[ 0.06045751 -0.95326098 -1.16823026 -1.20507253]\n", + " [ 0.76818146 -1.60266147 1.87936828 -1.36899306]] \n", + "\n", + "bias :\n", + "[[ 0.90691754]\n", + " [-0.07374428]\n", + " [-1.76147276]\n", + " [-1.04148146]] \n", + "\n", + "[[ 0.99398613]\n", + " [ 2.08639626]] \n", + "\n" + ] + } + ], + "source": [ + "katmanlar = [3, 4, 2]\n", + "agirlik, bias = ag(katmanlar)\n", + "\n", + "print(\"agirlik :\")\n", + "for w in agirlik:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for b in bias:\n", + " print(b, \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### İleri Besleme\n", + "\n", + "![network.jpg](network.jpg)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![noronislem.JPG](noronislem.JPG)\n", + "\n", + "\n", + "Yukarıdaki yapay sinir ağı, 3 katmandan oluşmaktadır.\n", + "\n", + "> Birinci katman, girdi olarak $x_1$, $x_2$, $x_3$ verisini alir. \n", + "\n", + "ilk katmana özel olarak $a_i(1) = z_i(1) = x_i$dir. \n", + "\n", + "> Daha sonraki katmanlardaki nöronlar, bir önceki katmanın ağırlıklı toplamını girdi olarak kabul eder.\n", + "\n", + "\n", + "\n", + "Genel olarak,\n", + "\n", + "> $z_j(t) = \\sum_i w_{j,i}(t) \\times a_i(t-1) + b_j(t)$\n", + "\n", + "mesela $z_4(2) = w_{4,1}(2) \\times a_1(1) + w_{4,2}(2) \\times a_2(1) + w_{4,3}(2) \\times a_3(1) + b_4(2)$dir.\n", + "\n", + "> $w_{j,i}(t)$: $\\hspace{1cm}$ $(t-1)$'inci katmandaki $i$'nci nörondan $(t)$'inci katmandaki $j$nci nörona olan bağlantının ağırlık değeridir.\n", + "\n", + "Aynı şekilde\n", + "\n", + "> $b_{j}(t)$: $\\hspace{1cm}$ $(t)$'inci katmandaki $j$'nci nörona ait bias değeridir\n", + "\n", + "Bir nöronun çıktısı, sigmoid fonksiyonuna net girdi değeri verilerek hesaplanır.\n", + "\n", + "> $a_j(t) = \\sigma(z_j(t)) = \\frac{1}{1 + e^{z_j(t)}}$\n", + "\n", + "\n", + "#### İleri Besleme Algoritması\n", + "\n", + "Ağımız verilen girdi x ve ağırlık w, bias b değerlerine göre bir çıktı üretir. Vektörize edilerek yapılan işlem\n", + "\n", + "> $z(t) = w(t) \\cdot a(t-1) + b(t)$\n", + "\n", + "> $a(t) = \\sigma(z(t))$\n", + "\n", + "Her bir katmandaki nöronlar, önceki katmanlardaki nöron çıktılarını ağırlıklarıyla çarpıp son olarak bias(çapa ya da referans) değeri ekleyerek net girdi olan $z$ değerini bulurlar. Sonraki işlem ise, sigmoid ile çıktı değerini hesaplamaktır.\n", + "\n", + "\n", + "![vektorize.jpg](vektorize.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ileribesleme(a, agirlik, bias):\n", + " \"\"\"Katman katman yeni a degerleri hesaplaniyor\"\"\"\n", + " for w, b in zip(agirlik, bias):\n", + " z = np.dot(w, a)+b\n", + " a = sigmoid(z)\n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "katmanlar = [2, 3, 1]\n", + "agirlik, bias = ag(katmanlar)\n", + "\n", + "#girdi = [(0,0)]\n", + "#print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: [[0]\n", + " [0]] \n", + "\n", + "w: [[-0.85882301 0.16919212]\n", + " [ 0.20681862 0.16358916]\n", + " [ 2.0653042 -2.11029037]] \n", + "\n", + "b: [[-1.06762571]\n", + " [-0.03983092]\n", + " [-0.93356285]] \n", + "\n", + "Sonuc a: [[ 0.25585487]\n", + " [ 0.49004359]\n", + " [ 0.28220245]] \n", + "\n", + "a: [[ 0.25585487]\n", + " [ 0.49004359]\n", + " [ 0.28220245]] \n", + "\n", + "w: [[ 1.30604392 0.66338842 -0.13118192]] \n", + "\n", + "b: [[-0.36150485]] \n", + "\n", + "Sonuc a: [[ 0.56481382]] \n", + "\n" + ] + } + ], + "source": [ + "a = np.reshape([0,0], (2, 1))\n", + "for w, b in zip(agirlik, bias):\n", + " print(\"a:\", a, \"\\n\")\n", + " print(\"w:\", w, \"\\n\")\n", + " print(\"b:\", b, \"\\n\")\n", + " a = sigmoid(np.dot(w, a)+b)\n", + " print(\"Sonuc a:\", a, \"\\n\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.56481382]]\n" + ] + } + ], + "source": [ + "girdi = np.reshape([0,0], (2, 1))\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Yardımcı Türevler\n", + "\n", + "İleri Besleme algortimasına bakarak şu türevleri bulalım, bunlar bize geri besleme algoritmasında yardımcı olacak\n", + "\n", + "> \n", + "$$\n", + "\\frac{d z_j(t+1)}{d z_i(t)} = \n", + "\\frac{ d (\\sum_i w_{j,i}(t+1) \\times \\sigma(z_i(t)) + b_j(t+1))}{d z_i(t)}\n", + "=\n", + "w_{j,i}(t+1) \\times \\sigma'(z_i(t))\n", + "$$\n", + "\n", + "![back1.jpg](back1.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Geri Besleme\n", + "\n", + "Geri besleme algoritmasındaki kilit nokta,\n", + "bir nöronun ait girdideki değişim, hatayı nasıl etkiler sorusudur.\n", + "\n", + "\n", + "$$\n", + "\\Delta_j(t) =\n", + "\\frac{d Hata}{d z_j(t)}\n", + "$$\n", + "\n", + "Bu soruya vereceğimiz cevap ile, ağırlık ve bias değerlerini hatayı minimize edecek şekilde nasıl güncelleyeceğimizi bulacağız. Ve tabi gene gradyan iniş yöntemini kullanacağız.\n", + "\n", + "$$Hata = \\frac{1}{2} \\sum_j (y_j - a_j(T))^2$$\n", + "\n", + "$T$ ağdaki çıktı katmanıdır. Bu durumda çıktı katmanındaki j'inci nöronun hataya etkisi\n", + "\n", + "$$\n", + "\\Delta_j(T) =\n", + "\\frac{d Hata}{d z_j(T)} = \\frac{d Hata}{d a_j(T)} \\frac{d a_j(T)}{d z_j(T)}\n", + "= (a_j(T)-y_j ) \\frac{d a_j(T)}{d z_j(T)}\n", + "= (a_j(T)-y_j ) \\sigma'(z_j(T))\n", + "$$ \n", + "\n", + "Çıktı katmanındaki tüm nöronların hataya olan etkisini vektörize edersek\n", + "\n", + "> \n", + "$$\n", + "\\Delta(T) = \\frac{d Hata}{d z(T)} = (a(T)-y) \\sigma'(z(T))\n", + "$$\n", + "\n", + "Dikkat ederseniz, vektörize ettiğimizde indislerden kurtuluyoruz. Peki bir ara katmandan, önceki ara katmana hata nasıl yayılır?\n", + "\n", + "> \n", + "$$\n", + "\\Delta_i(t) =\n", + "\\frac{d Hata}{d z_i(t)} \n", + "= \n", + "\\sum_j \\frac{d Hata}{d z_j(t+1)} \\frac{d z_j(t+1)}{d z_i(t)}\n", + "= \n", + "\\sum_j \\Delta_j(t+1) \\frac{d z_j(t+1)}{d z_i(t)}\n", + "$$\n", + "\n", + "\n", + "Unutmayın ki, $(t)$'inci katmandaki nöron $i$'ye ait bir hata\n", + "$(t+1)$'inci katmandaki tüm $j$ nöronlarını etkiler. Sonuç olarak,\n", + "\n", + "> \n", + "$$\n", + "\\Delta_i(t) =\n", + "\\sum_j \\Delta_j(t+1) w_{j,i}(t+1) \\times \\sigma'(z_i(t))\n", + "$$\n", + "\n", + "$(t+1)$'inci katmandan $(t)$'inci katmana hatanın akışını vektörize edersek,\n", + "\n", + "$$\n", + "\\Delta(t) = w^T(t+1) \\cdot \\Delta(t+1) \\times \\sigma'(z(t))\n", + "$$\n", + "\n", + "![back2.jpg](back2.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Nöronlardaki hatanın güncellenmesi\n", + "\n", + "Çıktı katmanında\n", + "$$\n", + "\\Delta(T) = \\frac{d Hata}{d z(T)} = (a(T)-y) \\sigma'(z(T))\n", + "$$\n", + "\n", + "$(t+1)$'inci ara katmandan $(t)$'inci ara katmana hatanın akışı,\n", + "\n", + "$$\n", + "\\Delta(t) = w^T(t+1) \\cdot \\Delta(t+1) \\times \\sigma'(z(t))\n", + "$$\n", + "\n", + "### Ağırlık ve bias değerlerinin güncellenmesi\n", + "\n", + "Hatayı minimize eden en iyi parametreleri arıyoruz.\n", + "\n", + "Ağırlıktaki değişim\n", + "$$\n", + "\\frac{d Hata}{d w_{ji}(t)} = \\frac{d Hata}{d z_{j}(t)} \\frac{d z_{j}(t)}{d w_{ji}(t)} \n", + "= \\Delta_{j}(t) a_i(t-1)\n", + "$$\n", + "\n", + "Biasdeki değişim\n", + "$$\n", + "\\frac{d Hata}{d b_{j}(t)} = \\frac{d Hata}{d z_{j}(t)} \\frac{d z_{j}(t)}{d b_{j}(t)} \n", + "= \\Delta_{j}(t) \n", + "$$\n", + "\n", + "Geri Besleme algoritması neden hızlıdır?\n", + "\n", + "> Dikkat ederseniz $\\Delta_{j}(t)$ değerini sadece bir kez hesaplayıp, yeniden hesaplamadan bir çok yerde (Ağırlıktaki ve Biasdeki değişimde) tekrar tekrar kullanıyoruz. Bu bize hız kazandırıyor.\n", + "\n", + "![back3.jpg](back3.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def geribesleme(x,y, agirlik, bias): #girdi, cikti\n", + " delta_b = [np.zeros(b.shape) for b in bias]\n", + " delta_w = [np.zeros(w.shape) for w in agirlik]\n", + " \n", + " a = x\n", + " A = [a] # a degerleri\n", + " Z = [] # z degerleri\n", + " for w, b in zip(agirlik, bias):# z ve a degerlerini depolayalim\n", + " z = np.dot(w, a) + b\n", + " a = sigmoid(z)\n", + " Z.append(z)\n", + " A.append(a)\n", + " \n", + " hata = A[-1] - y # en son katmandaki hata\n", + " delta = hata * sigmoid_turevi(Z[-1])\n", + " delta_b[-1] = delta\n", + " delta_w[-1] = np.dot(delta, A[-2].T)\n", + " for k in range(2, len(katmanlar)):\n", + " delta = np.dot(agirlik[-k+1].T, delta) * sigmoid_turevi(Z[-k])\n", + " delta_b[-k] = delta\n", + " delta_w[-k] = np.dot(delta, A[-k-1].T)\n", + " return (delta_b, delta_w) " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradyan_inis(orneklem, adim, agirlik, bias):\n", + " delta_b = [np.zeros(b.shape) for b in bias]\n", + " delta_w = [np.zeros(w.shape) for w in agirlik]\n", + " \n", + " for x, y in orneklem:\n", + " # geri besleme tek bir x-y cifti icin w-b parametrelerinde degisimi verir\n", + " delta_bxy, delta_wxy = geribesleme(x, y, agirlik, bias)\n", + " # orneklemdeki farkli x-y ciftleri icin w-b degisimleri toplanir\n", + " delta_b = [nb+dnb for nb, dnb in zip(delta_b, delta_bxy)]\n", + " delta_w = [nw+dnw for nw, dnw in zip(delta_w, delta_wxy)]\n", + " \n", + " # w-b parametreleri turevlerinin tersi yonde guncelleniyor (gradyan_inis) \n", + " agirlik = [w-(adim/len(orneklem))*nw for w, nw in zip(agirlik, delta_w)]\n", + " bias = [b-(adim/len(orneklem))*nb for b, nb in zip(bias, delta_b)]\n", + " return agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def ogrenme(veri, agirlik, bias, epochs = 30, sayi = 10, adim = 0.5, test_data=None):\n", + " \"\"\" epochs: kac kez tum veri kullaniacak\n", + " icinde sayi kadar ornek bulunan orneklemler(mini-batch)\n", + " gradyan-iniste kullaniliyor. Agirlik ve bias degerleri guncelleniyor.\n", + " Ogrenme:\n", + " en iyi Agirlik ve bias degerelerini bulmak\n", + " \"\"\"\n", + " veri = list(veri)\n", + " n = len(veri)\n", + "\n", + " if test_data:\n", + " test_data = list(test_data)\n", + " n_test = len(test_data)\n", + "\n", + " for j in range(epochs):\n", + " random.shuffle(veri)\n", + " for orneklem in [veri[k:k+sayi] for k in range(0, n, sayi)]:\n", + " w, b = gradyan_inis(orneklem, adim, agirlik, bias)\n", + " if test_data:\n", + " print(\"Epoch {} : {} / {}\".format(j, tahmin(test_data, w, b), n_test));\n", + " else:\n", + " print(\"Epoch {} complete\".format(j))\n", + " return agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def tahmin(test_data, agirlik, bias):\n", + " \"\"\"Return the number of test inputs for which the neural\n", + " network outputs the correct result. Note that the neural\n", + " network's output is assumed to be the index of whichever\n", + " neuron in the final layer has the highest activation.\"\"\"\n", + " test_results = [(np.argmax(ileribesleme(x, agirlik, bias)), y) for (x, y) in test_data]\n", + " return sum(int(x == y) for (x, y) in test_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Calisma\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "W = np.array([[1,1,1],[0,0,0]])" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n", + "(3,)\n" + ] + } + ], + "source": [ + "x = np.array([1,2,3])\n", + "print(x.T)\n", + "print(np.shape(x.T))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6 0]\n" + ] + } + ], + "source": [ + "print(np.dot(W,x))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1]\n", + " [2]\n", + " [3]]\n", + "(3, 1)\n" + ] + } + ], + "source": [ + "x = np.array([[1],[2],[3]])\n", + "print(x)\n", + "print(np.shape(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[6]\n", + " [0]]\n" + ] + } + ], + "source": [ + "print(np.dot(W,x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[4],\n", + " [9]]), array([[2],\n", + " [7]]), array([[0],\n", + " [0]]), array([[7],\n", + " [4]]), array([[1],\n", + " [0]])]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = np.random.randint(10, size=(5,2))\n", + "training_inputs = [np.reshape(x, (2, 1)) for x in X]\n", + "training_inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4],\n", + " [9]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "training_inputs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(training_inputs[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[4],\n", + " [9]]), array([[2],\n", + " [7]]), array([[0],\n", + " [0]])]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "training_inputs[0:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-0.09593291 0.17354599]\n", + " [-0.57961606 -0.35618948]\n", + " [-0.32218234 1.10238282]\n", + " [-0.88469027 1.35496269]\n", + " [ 0.28622968 1.10743193]]\n" + ] + } + ], + "source": [ + "# 1 ile 10 arasinda 100000 adet x1 ve x2\n", + "X = np.random.randn(100000,2)\n", + "print(X[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 0 0 0 0]\n" + ] + } + ], + "source": [ + "# ilk kolon ikinci kolondan buyukse, y=1\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "print(y[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "training_inputs = [np.reshape(x, (2, 1)) for x in X]" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "veri = zip(training_inputs,y)\n", + "print(veri)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X = np.random.randint(2, size=(100,2))\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "test_inputs = [np.reshape(x, (2, 1)) for x in X]\n", + "test_verisi = zip(test_inputs,y)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 : 80 / 100\n", + "Epoch 1 : 80 / 100\n", + "Epoch 2 : 80 / 100\n" + ] + } + ], + "source": [ + "katmanlar = [2, 10, 1]\n", + "agirlik, bias = ag(katmanlar)\n", + "agirlik, bias = ogrenme(veri, agirlik, bias, epochs = 3, test_data=test_verisi)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([array([[ 1.18095473, 0.53423322],\n", + " [-0.58155268, 0.10185382],\n", + " [-0.80426334, 0.26095208],\n", + " [ 0.76622115, 1.47263428],\n", + " [ 0.10961496, 0.0559628 ],\n", + " [-0.15497911, -1.04828676],\n", + " [-0.58667716, 1.26227533],\n", + " [ 1.31837991, -0.4234978 ],\n", + " [-0.53434866, 0.66481004],\n", + " [-2.14512623, -0.16385528]]),\n", + " array([[-0.38351141, -1.30812767, -0.40956386, 0.1505789 , 1.45330778,\n", + " -0.80897493, -0.74371651, 0.36516754, 2.10351043, -0.96184297]])],\n", + " [array([[ 1.27185787],\n", + " [ 0.32082366],\n", + " [ 0.30706861],\n", + " [ 0.27577491],\n", + " [-1.25779417],\n", + " [ 1.182 ],\n", + " [ 0.24413707],\n", + " [-1.63260298],\n", + " [ 1.41699634],\n", + " [-1.93241823]]), array([[-0.80143435]])])" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.68655399]]\n" + ] + } + ], + "source": [ + "girdi = [[100],[10]]\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.51525609]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:3: RuntimeWarning: overflow encountered in exp\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n" + ] + } + ], + "source": [ + "girdi = [[10],[1000]]\n", + "print(ileribesleme(girdi, agirlik, bias))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import mnist_loader\n", + "training_data, validation_data, test_data = mnist_loader.load_data_wrapper()\n", + "training_data = list(training_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 2)" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = training_data[1:2]\n", + "np.shape(training_data[1:2])\n", + "#print(training_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "katmanlar = [784, 30, 10]\n", + "agirlik, bias = ag(katmanlar)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 : 1035 / 10000\n", + "Epoch 1 : 1034 / 10000\n", + "Epoch 2 : 1010 / 10000\n" + ] + }, + { + "data": { + "text/plain": [ + "([array([[-1.18772098, -0.13546604, -1.61934007, ..., 0.9554536 ,\n", + " 1.37470453, 1.54416376],\n", + " [ 0.7490318 , 0.04645829, 0.04544097, ..., 0.48730732,\n", + " -0.47316221, 0.79062721],\n", + " [-0.30534371, -0.4431419 , -0.11353317, ..., -2.49699752,\n", + " 1.31098953, -0.30979563],\n", + " ..., \n", + " [-0.47923463, 1.26768775, -0.38624203, ..., -1.4157727 ,\n", + " -0.97293826, -0.88493562],\n", + " [-0.85324024, 0.48001228, -0.23730557, ..., 0.05579599,\n", + " -1.45331804, -1.77638199],\n", + " [ 1.28490457, -0.73704989, -0.42869123, ..., -0.65351425,\n", + " -1.04373033, 0.65878372]]),\n", + " array([[ 1.01795030e+00, 1.35254362e+00, 6.65462082e-01,\n", + " -8.16932092e-01, 9.87519593e-01, -3.57652268e-01,\n", + " 9.68943988e-01, 1.19355951e+00, 2.66747361e+00,\n", + " 8.56533546e-01, -1.17443802e+00, -8.64342782e-02,\n", + " 4.46027009e-01, 1.40499062e-01, 1.30654501e+00,\n", + " 1.84455701e+00, -3.28845589e-01, -2.50770952e-01,\n", + " 7.88987407e-01, 1.22845982e+00, 1.45913093e+00,\n", + " -7.17835474e-01, 1.12468419e+00, 5.31309685e-01,\n", + " -9.61005460e-01, -1.15894928e+00, 1.38538248e-01,\n", + " -2.58157547e-01, 4.78491930e-01, -4.43656354e-01],\n", + " [ -3.26169183e-01, 1.04558842e+00, -4.17729030e-01,\n", + " -3.20814056e-02, -9.80352409e-01, -5.71746013e-01,\n", + " -1.21605700e+00, 3.92117706e-01, -5.45524555e-01,\n", + " -8.60851837e-01, -1.20087818e+00, -2.10361151e-02,\n", + " -1.40331209e+00, 3.18404653e-02, -2.13100866e-02,\n", + " -1.32245819e-01, -1.89781972e+00, -3.66242832e-01,\n", + " 8.18821691e-01, -1.85879904e+00, -1.31352778e-01,\n", + " -8.37960856e-02, -1.73885248e-01, -9.61540354e-02,\n", + " 3.40780337e-01, 5.58782647e-01, -1.84544905e-01,\n", + " -6.33812878e-01, 1.44680280e+00, 4.40596828e-01],\n", + " [ 9.43852180e-02, 8.04242687e-01, 1.12046255e-01,\n", + " 1.10337963e-01, -1.20387827e+00, 3.43285672e-02,\n", + " 3.11335879e-02, -1.15596282e+00, -5.17091088e-01,\n", + " -1.13807267e-01, -4.55960411e-01, 1.95897106e+00,\n", + " -2.94780158e-02, -6.45155379e-01, 1.18360556e+00,\n", + " -3.76884653e-01, 2.73046263e-01, -1.26310397e-02,\n", + " 4.93857274e-01, -8.48876141e-01, 6.53359362e-01,\n", + " -6.20787547e-01, -3.34259317e-01, 1.45749550e-01,\n", + " 6.34520238e-02, -8.61326389e-01, 1.01284844e+00,\n", + " -2.32098982e-01, 3.93096706e-01, 1.33216839e-01],\n", + " [ 7.48790562e-01, 2.81400133e-01, 1.55233028e+00,\n", + " 7.68583551e-01, -1.90091485e+00, 1.18208881e+00,\n", + " -4.10715668e-01, -5.12017583e-01, -1.62313824e-01,\n", + " 1.42214119e+00, -2.06378098e+00, -9.54432515e-01,\n", + " -7.99390023e-01, 1.00122127e+00, 5.16083112e-02,\n", + " 1.00387945e+00, -7.37804065e-01, -9.72083576e-01,\n", + " 5.47651579e-02, -2.37300072e-01, 4.73396222e-01,\n", + " 1.21645305e+00, 7.30625396e-01, 9.06705364e-01,\n", + " 1.38198638e+00, 2.90410489e-01, -9.08192685e-01,\n", + " -6.17696482e-01, 1.08405878e+00, -1.26849171e-01],\n", + " [ 2.01533258e-02, 1.43462788e-01, -4.24091683e-01,\n", + " -6.19572281e-02, 9.97945021e-01, 4.61629235e-01,\n", + " -1.63382534e-01, -2.08433741e-01, -1.18222988e+00,\n", + " 5.00106985e-01, 1.46233143e-01, 3.76343799e-01,\n", + " -3.19661331e-01, 1.17963464e+00, 6.92556786e-01,\n", + " 6.83266493e-02, 1.80584348e+00, 1.00324382e+00,\n", + " -1.18073922e-01, -1.61807175e+00, -1.86113130e-03,\n", + " -1.64941703e+00, 2.35203953e+00, -3.38488044e-01,\n", + " 2.55066985e+00, 7.96882174e-01, 7.67189320e-01,\n", + " -5.97696283e-01, 9.21681605e-01, 9.78628279e-01],\n", + " [ -9.39470784e-01, 5.37865958e-01, -1.24516137e-01,\n", + " 2.82964066e-01, 4.32216064e-01, -1.75693402e+00,\n", + " -5.30490398e-01, 1.34508267e+00, 1.24901509e+00,\n", + " -3.11743866e-01, -1.23009506e+00, 1.31654254e+00,\n", + " -8.36860030e-01, -1.19156137e+00, -9.81484702e-01,\n", + " -2.14908868e-01, 1.95639744e-01, -5.26153315e-01,\n", + " -7.66279833e-01, -1.90172854e-01, 1.18335199e+00,\n", + " -1.52647063e+00, -1.24392691e+00, -1.81794569e+00,\n", + " -5.55660733e-02, -2.69567828e-01, 4.12595001e-01,\n", + " -1.46017821e+00, -9.23643180e-01, -1.47016812e+00],\n", + " [ 3.76213250e-01, 9.94300975e-01, -1.31448841e+00,\n", + " 3.38016314e-01, 8.83271278e-01, -8.02433036e-01,\n", + " -5.33059923e-01, -9.42632733e-02, 1.13140741e+00,\n", + " 4.07784978e-01, -1.05157553e+00, -2.73212770e-01,\n", + " -1.04231405e+00, 4.53259526e-02, -9.35648607e-01,\n", + " -5.82719077e-01, 7.88373060e-01, -2.02552796e-01,\n", + " -1.76466765e+00, 3.23278097e-02, 2.22326203e+00,\n", + " -1.06020009e+00, -5.72939347e-01, -5.68152711e-01,\n", + " 5.61292355e-01, 1.17757995e+00, -1.04123442e+00,\n", + " 6.69700637e-01, 1.10325114e+00, 1.53119121e+00],\n", + " [ -7.18076051e-02, 4.77154904e-01, -2.28271606e+00,\n", + " 1.33202172e+00, 6.28802556e-01, 1.05624932e-01,\n", + " 3.08873073e-01, -2.07092514e+00, -1.34140031e-02,\n", + " -7.47297051e-01, -1.05689553e+00, -1.01790854e+00,\n", + " 5.80442896e-01, 1.05382255e+00, -6.85774539e-02,\n", + " 8.93896302e-02, 2.68780280e+00, -4.98569889e-01,\n", + " -9.63058688e-01, 7.19301998e-01, 1.34988137e+00,\n", + " -1.38335673e+00, 3.35222943e-01, -3.86576766e-01,\n", + " -1.23812194e+00, 1.63166545e+00, -5.64545254e-01,\n", + " -3.46921871e-01, -4.64495638e-01, -9.38292607e-02],\n", + " [ -2.19531904e+00, -2.68115995e-01, 3.06549260e-01,\n", + " -1.65609767e-01, 1.35214225e-01, 3.30980626e-01,\n", + " -1.18642666e+00, 1.86481445e+00, -4.39676495e-01,\n", + " 1.89171916e+00, 2.05139496e+00, 7.36725402e-01,\n", + " -2.09871377e-01, -1.34686080e+00, -6.57793670e-01,\n", + " 1.55012157e+00, -8.20650731e-01, -1.36021711e-01,\n", + " -2.41834683e-02, -3.87424505e-01, 1.38106641e+00,\n", + " -1.13705624e+00, -1.67566725e+00, 1.05134719e+00,\n", + " -1.10840434e+00, -9.17631052e-01, -1.47339332e+00,\n", + " -2.19626113e-01, 5.67522626e-01, 1.08848133e+00],\n", + " [ 3.16384336e-01, -8.59408448e-01, -1.40899144e+00,\n", + " -1.19303652e+00, 5.68009517e-01, 5.62018530e-02,\n", + " -5.25019315e-01, -3.84322235e-01, 1.37864467e+00,\n", + " 1.48473946e-01, 1.07183811e+00, 6.59898874e-01,\n", + " -6.56594537e-01, -4.16611670e-01, 1.95641044e-01,\n", + " -8.99512597e-01, 1.62553175e+00, -1.30936417e+00,\n", + " 5.60742343e-01, -1.37446102e+00, 1.18563281e+00,\n", + " -1.91939787e-01, -1.11618118e-01, -1.20180316e-01,\n", + " 2.58926459e-01, 7.91182294e-01, 1.18084552e+00,\n", + " 1.06375159e+00, -3.27087046e-01, 1.67994568e-01]])],\n", + " [array([[ 1.04959875],\n", + " [ 0.90030278],\n", + " [-1.20690014],\n", + " [-0.2387669 ],\n", + " [-0.51275495],\n", + " [ 1.26835956],\n", + " [ 0.50418079],\n", + " [-0.78007552],\n", + " [ 0.0938556 ],\n", + " [-1.08330376],\n", + " [-0.39385517],\n", + " [ 0.57556263],\n", + " [-0.28695118],\n", + " [ 0.46828876],\n", + " [ 1.02713998],\n", + " [ 0.53664695],\n", + " [ 1.72267342],\n", + " [ 0.28223999],\n", + " [-0.35348297],\n", + " [ 0.59075221],\n", + " [-0.23403876],\n", + " [-1.70599286],\n", + " [ 2.2388363 ],\n", + " [-1.08791493],\n", + " [ 0.55564671],\n", + " [-0.70640942],\n", + " [ 1.92349657],\n", + " [-1.52791439],\n", + " [ 0.51682992],\n", + " [ 0.33901905]]), array([[ 0.28111043],\n", + " [-0.37005242],\n", + " [ 1.25216018],\n", + " [ 0.27173082],\n", + " [ 1.21042982],\n", + " [ 0.02173274],\n", + " [ 0.07682395],\n", + " [-0.80273879],\n", + " [-0.34770322],\n", + " [ 0.38098875]])])" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ogrenme(training_data, agirlik, bias, 3, 10, 3.0, test_data=test_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "agirlik, bias = gradyan_inis(training_data[1:10],adim = 0.5, agirlik = agirlik, bias = bias)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([array([[-1.18772098, -0.13546604, -1.61934007, ..., 0.9554536 ,\n", + " 1.37470453, 1.54416376],\n", + " [ 0.7490318 , 0.04645829, 0.04544097, ..., 0.48730732,\n", + " -0.47316221, 0.79062721],\n", + " [-0.30534371, -0.4431419 , -0.11353317, ..., -2.49699752,\n", + " 1.31098953, -0.30979563],\n", + " ..., \n", + " [-0.47923463, 1.26768775, -0.38624203, ..., -1.4157727 ,\n", + " -0.97293826, -0.88493562],\n", + " [-0.85324024, 0.48001228, -0.23730557, ..., 0.05579599,\n", + " -1.45331804, -1.77638199],\n", + " [ 1.28490457, -0.73704989, -0.42869123, ..., -0.65351425,\n", + " -1.04373033, 0.65878372]]),\n", + " array([[ 1.01746272e+00, 1.35227310e+00, 6.65305437e-01,\n", + " -8.16958089e-01, 9.87360915e-01, -3.58077222e-01,\n", + " 9.68555040e-01, 1.19355122e+00, 2.66745432e+00,\n", + " 8.56334584e-01, -1.17445270e+00, -8.66845845e-02,\n", + " 4.45611269e-01, 1.40286508e-01, 1.30604778e+00,\n", + " 1.84405700e+00, -3.29337087e-01, -2.50849430e-01,\n", + " 7.88742894e-01, 1.22827507e+00, 1.45906924e+00,\n", + " -7.18273476e-01, 1.12452028e+00, 5.31006148e-01,\n", + " -9.61429460e-01, -1.15930685e+00, 1.38142368e-01,\n", + " -2.58364497e-01, 4.78100749e-01, -4.43745024e-01],\n", + " [ -3.24455354e-01, 1.04703707e+00, -4.17492815e-01,\n", + " -3.20060796e-02, -9.80088373e-01, -5.69956817e-01,\n", + " -1.21459201e+00, 3.92117829e-01, -5.45529474e-01,\n", + " -8.60621790e-01, -1.20087891e+00, -1.98771067e-02,\n", + " -1.40150017e+00, 3.21587182e-02, -1.95402122e-02,\n", + " -1.30460121e-01, -1.89603784e+00, -3.66161598e-01,\n", + " 8.19650656e-01, -1.85847659e+00, -1.31345577e-01,\n", + " -8.23132045e-02, -1.73610192e-01, -9.46719655e-02,\n", + " 3.42416713e-01, 5.59862061e-01, -1.82927359e-01,\n", + " -6.33462423e-01, 1.44798953e+00, 4.40890724e-01],\n", + " [ 5.67454887e-02, 8.00170377e-01, 8.91181158e-02,\n", + " 1.03637811e-01, -1.23104678e+00, 5.47115334e-03,\n", + " 1.70415382e-02, -1.15952489e+00, -5.26537399e-01,\n", + " -1.44758525e-01, -4.64307635e-01, 1.95318045e+00,\n", + " -5.98184181e-02, -6.75455632e-01, 1.14379498e+00,\n", + " -4.17173330e-01, 2.34106081e-01, -2.43107007e-02,\n", + " 4.71011878e-01, -8.82837713e-01, 6.43307587e-01,\n", + " -6.52554889e-01, -3.63214735e-01, 1.34556490e-01,\n", + " 4.04117124e-02, -8.94516587e-01, 9.83893059e-01,\n", + " -2.66724084e-01, 3.52624590e-01, 1.21500650e-01],\n", + " [ 7.37963698e-01, 2.80495451e-01, 1.54389810e+00,\n", + " 7.63366527e-01, -1.91077965e+00, 1.17443686e+00,\n", + " -4.13757547e-01, -5.15391704e-01, -1.68956088e-01,\n", + " 1.41843974e+00, -2.06901671e+00, -9.56132689e-01,\n", + " -8.08393872e-01, 9.98905962e-01, 4.07343019e-02,\n", + " 9.93006677e-01, -7.48409567e-01, -9.79456212e-01,\n", + " 5.35352855e-02, -2.40167618e-01, 4.72957055e-01,\n", + " 1.20598013e+00, 7.22440400e-01, 9.05418700e-01,\n", + " 1.37962684e+00, 2.86325335e-01, -9.18461263e-01,\n", + " -6.21555872e-01, 1.07351701e+00, -1.30512154e-01],\n", + " [ 1.97690979e-02, 1.43355897e-01, -4.24205748e-01,\n", + " -6.19628672e-02, 9.97642796e-01, 4.61251976e-01,\n", + " -1.63463260e-01, -2.08433788e-01, -1.18248886e+00,\n", + " 4.99926870e-01, 1.45981873e-01, 3.76292015e-01,\n", + " -3.19766369e-01, 1.17939092e+00, 6.92186112e-01,\n", + " 6.79693679e-02, 1.80550767e+00, 1.00323828e+00,\n", + " -1.18425465e-01, -1.61839829e+00, -2.15725456e-03,\n", + " -1.64978644e+00, 2.35194181e+00, -3.38847131e-01,\n", + " 2.55029350e+00, 7.96520385e-01, 7.67104574e-01,\n", + " -5.98026078e-01, 9.21313625e-01, 9.78609187e-01],\n", + " [ -9.39470835e-01, 5.37865948e-01, -1.24516176e-01,\n", + " 2.82964056e-01, 4.32216023e-01, -1.75693404e+00,\n", + " -5.30490435e-01, 1.34508266e+00, 1.24901507e+00,\n", + " -3.11743895e-01, -1.23009507e+00, 1.31654252e+00,\n", + " -8.36860055e-01, -1.19156140e+00, -9.81484753e-01,\n", + " -2.14908919e-01, 1.95639696e-01, -5.26153342e-01,\n", + " -7.66279839e-01, -1.90172881e-01, 1.18335199e+00,\n", + " -1.52647068e+00, -1.24392692e+00, -1.81794570e+00,\n", + " -5.55660974e-02, -2.69567862e-01, 4.12594950e-01,\n", + " -1.46017824e+00, -9.23643227e-01, -1.47016813e+00],\n", + " [ 3.48215553e-01, 9.91242127e-01, -1.32855895e+00,\n", + " 3.37704662e-01, 8.65097156e-01, -8.23267432e-01,\n", + " -5.45580585e-01, -9.44219008e-02, 1.12639168e+00,\n", + " 3.84492117e-01, -1.05614621e+00, -2.77511961e-01,\n", + " -1.05610434e+00, 2.00259179e-02, -9.63433341e-01,\n", + " -6.10308511e-01, 7.62020154e-01, -2.08351369e-01,\n", + " -1.78463270e+00, 8.66247214e-03, 2.20836657e+00,\n", + " -1.08481319e+00, -5.90311437e-01, -5.78414730e-01,\n", + " 5.37315082e-01, 1.14978956e+00, -1.05464234e+00,\n", + " 6.44233003e-01, 1.07529266e+00, 1.52494102e+00],\n", + " [ -1.09662232e-01, 4.69624472e-01, -2.29996181e+00,\n", + " 1.33005071e+00, 6.10147011e-01, 6.91517740e-02,\n", + " 2.91264812e-01, -2.07125302e+00, -2.01743967e-02,\n", + " -7.79220397e-01, -1.06300599e+00, -1.02318994e+00,\n", + " 5.50135531e-01, 1.01980386e+00, -1.08613974e-01,\n", + " 4.89800648e-02, 2.64842808e+00, -5.02326598e-01,\n", + " -9.97946234e-01, 6.86343720e-01, 1.33282759e+00,\n", + " -1.41422719e+00, 3.05726501e-01, -4.04752755e-01,\n", + " -1.27138872e+00, 1.59345374e+00, -5.82847592e-01,\n", + " -3.81894319e-01, -5.04217763e-01, -1.02162514e-01],\n", + " [ -2.19648500e+00, -2.68282539e-01, 3.06161755e-01,\n", + " -1.65640859e-01, 1.34059577e-01, 3.29863206e-01,\n", + " -1.18643269e+00, 1.86479549e+00, -4.40715115e-01,\n", + " 1.89115674e+00, 2.05039358e+00, 7.36724090e-01,\n", + " -2.09932432e-01, -1.34765396e+00, -6.58884066e-01,\n", + " 1.54908929e+00, -8.21600809e-01, -1.36058503e-01,\n", + " -2.53114108e-02, -3.88554868e-01, 1.37994928e+00,\n", + " -1.13821419e+00, -1.67594781e+00, 1.05023313e+00,\n", + " -1.10952351e+00, -9.18764947e-01, -1.47345559e+00,\n", + " -2.20762266e-01, 5.66350564e-01, 1.08845588e+00],\n", + " [ 2.69064710e-01, -8.66637257e-01, -1.44003931e+00,\n", + " -1.20002741e+00, 5.40272023e-01, 1.79228736e-02,\n", + " -5.54446598e-01, -3.87846615e-01, 1.37100610e+00,\n", + " 1.13205465e-01, 1.06606597e+00, 6.48681712e-01,\n", + " -6.94504185e-01, -4.53162703e-01, 1.45584099e-01,\n", + " -9.50306881e-01, 1.57612954e+00, -1.32312128e+00,\n", + " 5.29753711e-01, -1.40573331e+00, 1.17783396e+00,\n", + " -2.30443016e-01, -1.46263030e-01, -1.31449508e-01,\n", + " 2.26775095e-01, 7.50631386e-01, 1.15107015e+00,\n", + " 1.02865552e+00, -3.75408587e-01, 1.61189725e-01]])],\n", + " [array([[ 1.04879786],\n", + " [ 0.89568438],\n", + " [-1.19694129],\n", + " [-0.23859775],\n", + " [-0.51419681],\n", + " [ 1.2667969 ],\n", + " [ 0.50529259],\n", + " [-0.77566897],\n", + " [ 0.09127105],\n", + " [-1.08500914],\n", + " [-0.38960615],\n", + " [ 0.5705106 ],\n", + " [-0.28595486],\n", + " [ 0.46718575],\n", + " [ 1.02634851],\n", + " [ 0.53700664],\n", + " [ 1.71431076],\n", + " [ 0.2919968 ],\n", + " [-0.3506183 ],\n", + " [ 0.59222167],\n", + " [-0.2394085 ],\n", + " [-1.70151144],\n", + " [ 2.23951161],\n", + " [-1.08573733],\n", + " [ 0.55538033],\n", + " [-0.71063198],\n", + " [ 1.92193886],\n", + " [-1.53030425],\n", + " [ 0.51771325],\n", + " [ 0.33765771]]), array([[ 0.28060967],\n", + " [-0.36826308],\n", + " [ 1.21132798],\n", + " [ 0.26081612],\n", + " [ 1.21003606],\n", + " [ 0.02173269],\n", + " [ 0.04862819],\n", + " [-0.84408545],\n", + " [-0.34887561],\n", + " [ 0.32999799]])])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agirlik, bias" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/Yapay Sinir A\304\237lar\304\261.ipynb" "b/Yapay Sinir A\304\237lar\304\261.ipynb" new file mode 100644 index 0000000..2d3c44e --- /dev/null +++ "b/Yapay Sinir A\304\237lar\304\261.ipynb" @@ -0,0 +1,635 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python ile Yapay Sinir Aglarina Giris\n", + "\n", + "> Bu calisma buyuk olcude, [inzva'da](https://inzva.com/open-source-application-form?utm_source=Open+Source+Challenge+Day&utm_campaign=4d2f44397c-EMAIL_CAMPAIGN_2018_01_02&utm_medium=email&utm_term=0_9a76f360b0-4d2f44397c-41568991) duzenlenen Open Source Challenge Day Vol.5 acik kaynak etkinligi kapsaminda Uzay Cetin tarafindan hazirlanmistir. Ayrica bu calisma Sariyer akademide duzenlenen [Liseler için Yapay Zekaya Giriş Eğitimi](https://uzay00.github.io/kahve/giris.html)'nde kullanilacaktir.\n", + "\n", + "\n", + "__Yapilacaklar__ \n", + "\n", + "* Toy data uretilecek\n", + "* sklearn kutuphanesi yardimi ile siniflandirma yapilacak\n", + "* sklearn kutuphanesinden elde edilen agirlik ve bias degerleri \n", + " \n", + " + sifirdan yazilan ileri besleme aginda kullanilarak tekrar siniflandirma yapilacak\n", + " + Daha sonrasinda geriyayilim algoritmasi sifirdan yazilarak, kendi yapay sinir agimizi yazacagiz.\n", + "* sklearn kutuphanesindeki yazi veri kumesi uzerinde kendi yapay sinir agimizla siniflandirma yapilacaktir.\n", + "\n", + "__Yararlanilan Kaynaklar__\n", + "* [veridefteri](http://www.veridefteri.com/2017/11/23/scikit-learn-ile-veri-analitigine-giris/)\n", + "* [Michael Nielson, Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Toy data\n", + "\n", + "$x_0$ ve $x_1$ olmak uzere iki girdi degeri ve bir cikti $y$ degeri olan veriyi uretecegiz. $x_0$ ve $x_1$ degerleri 0 ile 100 arasinda rastgele tamsayi degerler aliyor, $y$ ise $x_0>x_1$ ise $1$ degilse $0$ degeri almaktadir.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GIRDI:\n", + " [[ 8 89]\n", + " [57 40]\n", + " [68 92]\n", + " [67 20]\n", + " [57 60]]\n", + "CIKTI:\n", + " [0 1 0 1 0]\n" + ] + } + ], + "source": [ + "#numpy paketini yüklüyoruz.\n", + "import numpy as np\n", + "# GIRDI: 1 ile 100 arasinda 1000 adet x1 ve x2\n", + "X = np.random.randint(100, size=(1000,2))\n", + "# CIKTI: ilk kolon ikinci kolondan buyukse, y=1\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "\n", + "print(\"GIRDI:\\n\", X[1:6,])\n", + "print(\"CIKTI:\\n\", y[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEMCAYAAADal/HVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX+QHddV579n3siFZkTJtuTNmjgz8lZcoQTGEKvYeANb\nroypJHISQBUCyUgMFDCVGZbEASqYFSa2FyUhu7VOWDLyTiWAImmTsEEhwR7YwgIBphwv0mZt5wde\nCSwpSjk/LCcCWwqxpLt/vNfSnZ7745z7o7tn5n6qXknzpl/fc2/3vD7nnl+klEKhUCgUCjaG2hag\nUCgUCt2mPCgKhUKh4KQ8KAqFQqHgpDwoCoVCoeCkPCgKhUKh4KQ8KAqFQqHgpDwoCoVCoeCkPCgK\nhUKh4KQ8KAqFQqHgpDwoCoVCoeBkuG0BUrBx40a1adOmtsUoFAqFZcWRI0eeUUpd4ztuRTwoNm3a\nhMOHD7ctRqFQKCwriOgE57iy9VQoFAoFJ+VBUSgUCgUn2R8URPR7RPQ1Ivqc9t7VRPTnRHR08O9V\ng/eJiH6HiI4R0eNE9PLc8hUKhULBTRMWxR8AeE3tvTsBHFRK3QDg4OBnAHgtgBsGr2kAuxuQr1Ao\nFAoOsj8olFJ/DeDZ2ts/CmDP4P97APyY9v5HVJ/PALiSiK7NLeOyZf9+YNMmYGio/+/+/WnOtXFj\n/5XivE2Scj2aJJXcbc5/ta990zQtt1Iq+wvAJgCf037+pvZ/qn4G8ACAH9J+dxDAFss5pwEcBnB4\nbGxMrTr27VNqZEQp4PJrZKT/fopzpThvk6RcjyZJJXeb81/ta980CeUGcFhxvsM5B8W+XA+Kwc/f\nUMIHhf66+eabxQu07BkfN3+pj4+7P7dvX/8Yov6/1c+2hwT3vKkwyRczh9Ryc+STnCfVejc1/ybG\nTrXGPpbbPVORUO6uPyieBHDt4P/XAnhy8P//DuDNpuNcr1X5oCAy3yxE9s/YNBHfQ8J33lRwNCXp\nHFLKnVP7j5Xbda7cpBy7SS0/5G9ISo75JJS76w+K/wzgzsH/7wTwvsH/bwfwp4PtqFcA+N+c86/K\nB0WIVmH7TK/He1jk1O64c+JYP7HaoU0D5K65/vkNG/ov/f855LZdw15PPn8poWO3aRkq5R6rLtvM\nTJhVEHLP+M6/Ei0KAB8F8DSAFwCcAvBzADYMtpWOAngIwNWDYwnABwH8A4AnONtOarU+KEI0FZsm\nUn2W8wWWcw+XoylJHhKp9/o58nGshRxyu86Xm5Cx27QMfTLMzPivIfcahd4zrvOvVB9F7lfrD4qm\n9lRd4+qaq00Grgbl03xdmkvMWnA0pdzWj8tisY0dY/HUX0NDSo2O5tNcc5DSuuXec6n+5mZmLl/X\nXu+y5RAiU+jahKxfovmXB0VTdCFygiuDVFbpXmjsWnA+z/kDjtE+XVaX6VWXT/p56flj1i4Xqa1b\n02tmJv1cY3x23PuMI2sTvhIL5UHRFL7IldioGKK+hjk01D9npfXox0g0npx7oSm0Wp98Em0vtUVR\nvXq9ePkkL+76mbTjUKQaq/T4GIsilfWUwmfHIfSebsAaLA+KpvBpRrmiYiYm0kfOcORIaYGkkqnp\ntZdGlsW+UmmuMWuQ2jqRrpO+BqnusxifXcr1mJkxjxHzoGdSHhQScuyrx2geqb5gfOOG5ixI1yKF\nZhQTSSS9prE5DjZrsPI/pL6OSqVde5+fJtUXmOR+5/qBUvl1YqOeMv/d7Ht8nxq/b1zR3aTG7xtX\n+x4vPgrvK+pBkWNfPUTTyaGJuv6gc2iNuTTRmH3eGDly+Vw4UTXS8VJacxz/QUpt13fvc3JpQtas\nzftVR3jt9j2+T43sGlG4G5deI7tGgh4W5UHBJYUmpu8Nh56rqb3tWG3ZR8oIMImsKS0713wmJsx+\nANO8pVFm3Og1E01ZFNWLm5/BvR+kEXyp7uMcEYsSS8V3n5hOf9/4oodE9Rq/jzlnjfKg4BKriaXS\nblJHy5jmkMr6aQKprE3MzbaXbPIX+WRJTUrt2DZP6Rya8HW0GDEklsl0X9gsTMc60d1kfFDQ3cs8\nMzv3K5tFwdE2cu+XAuaoJ8neburY8DpSbTB2PWzXKCb/gwM3GibFl2wIIdp7aORWdR+6oqyaiOYJ\nsdpSWbrS9XPl4Qgsm2JRBL6y+Ci4T/lUGo1U+8rh08gRJRSqQXJ8DrZrtHmz+TMTE3I5dFKudVuk\n8PcA9jXWHxZt1lLy+YFyRoRZjrlokeUiye6H4qMIfGWJeuJqQym1ppjYdUkdIZu8IVFPuXwDrvOG\nzjW27lEqi6KJ+ks2OBYwJ+qJU98plbXtQ/L3m+u+rJ/LINOXrjKv2Zeukt8PJeop4JUlj4KrDTWx\nD5tCbtsrtqYMdzwpEn+A5BUDd+/e92ogPt4Kx1KbmPDLzVnjXNZminmG3g8RVtJbtkE9t2bx555b\nA/WWbZH3ZQTlQRGLxFLItReaUm7bXGLju1NGyITOg/tKocn7Itzq65QyW9qHy/qT5Cxwalr5ovyq\nsXNH2dlo+r5k+BnG7xtXb94G9dR6qAvo//vmbWG+hVSUB0UsIZZCF6wLju8id+VL00tKaBQYVyOO\npU1tmStPJUMqf5Z+3X3WVdv1jHLdlxE+zZS+hVSUB0UKpD6DpvZkfdTlTl1Lvz6fHFpjiEWhy8TR\n5GNj6JeDJTk+Ll9LjkWhlCx/qIkIqDrS+zImaswyzlPrsciHkMq3kIryoGiDHNnBbSLVmlNaVCFa\ncOz5l9v10XFp7FLrjBPRxB27os31johUYstnWYML6IblYKM8KNogV6QFR9PJkWGqnzdWKwuRT7Kv\nzl3XtvbMcxNiUbgilyRrExEJlATp34fJ+vPNITD676n1cXkOuSkPijbgaME58iua0NZi9phj5Uvl\nD8hxfbqC1EcR4rOwrU3XrQXO8a45B/4NPrem76yOyZzOTXlQtEVqjTU28ijGRyGVI8dnK+r74dWD\nSxJJFGLx5dKCc8CJeuLk3EgtCt/YOZHeW1LrymWRWe4VPaKpnj294bc3qA2/vaH4KNp4depBUZFK\ny+Jo8ilzJ3LMZ7nU02rDUmsazlo2ETWWCum95bv+pmudoLqr7dW276I8KHzEaEAx0RFSUuUySLRD\nG6H+h4jYc/b8OOeSRqVJtNU2/Ug2BNE5S9Yw1T2TG6msLr+M7foERDRVlgPnYVHyKLr6oIjRFJvW\nMkN9FL5Xqr34GB8Kt54Wd06pfTkps/O7ct9w7ocuVmS1IV1X1/0jGEP3P4zsGlEzD8wYcyQ4D4o2\nfRflQeEi5357Dq3RF7GhH8P9Uk21Fx8T8eLaL9aP42RCc/fVOWspnVuM1ZdLS5fuxVeyLDeLQinZ\nvcvNKLeMYfM/9O7pGR8CtveXm0VB/WOXN1u2bFGHDx/mf2BoqH9r1CECLl4M/+zevcD0NHD27OX3\nR0aA+XlgcpIvn439+/3nn50Fdu/2n2tmBpib45/XBpH9d757y/VZXQ5dLukxtmvKmTN3XTj3U8w6\nhWCTCXCv18gIMDUF7NmT7z5uE98955nn0D1DUJBdr5E1Izj7gnm9R9aMYP7185i8sZ11JaIjSqkt\nvuOGmhCmc4yN2d/fvx/YtKn/h7ZpU/9n7md37lz6B3j2bP/9FLjOX8nNeUgAwMIC77w+ej3Z+9Jj\nfA+JDRuAtWvtv1fKfB05c56c7H9pjI/3v2DGx81fIrZ7Qh87Zp1CsMk0Pt5/ENjGPXu2f2/ox/R6\n/Z+5Dwnf31Cqz4QwPu7+vee+H1tvXtcemddzfP045l8/j/H14yAQNqzdgA1rN4BAl37X1kNCBMfs\n6PpLvPUk7VTG3WvOvbcr6Zzle6Xak3aNEfNZ7os775y1hziRRDHrFILEL8SROacPr0n/TWQuja1e\nk81H0Xb4qw8UH4WDkFhqzt52yr1d6Z5+yJesdE9aIlOMv4f7ks5bknsSEj7sOmdIbkIs0qgnyfrZ\nCIlwi7n/YtYlcJ62ek1dq+PEoTwoXIRUJuVoPKk0I2mUUMyX7cgIryNcbOQSd56h14PzklS9DdVo\npfdW07kJoVV56+sXcv4YSzyD1fE375kx9of4m/d0MF8kE+VB4UKqmUu0wdy5E5IM2+ozkp7ZrjE5\nMsXkpHAthNDMYl1efWzXsamuXaxFEZrDwpWPey/4ZAqZf0tRY13sD6GUOR8jl5VSHhQuUmnsueLK\nU/SBMGlbMT0emliDFPJw9uGb9lfErl9Ka86Wdc156dZPSquXYy1k8P/R3dS5vAZfVndqv0d5UPiw\n9Sswvd+VGHjuHnu9/lHs3nR1ztxrENuTWmot5LAo9LG5vpzQjPKQaxKzxlw/h8mH5+uxnTqrvn5J\nDP6D8fvGW81rkMiUS77yoHAh1YZi9uFDiNGw6sdzLA+ulpl7DWIeEjbNMjRSLPXcYqyCVGvhO1dI\nNBR3/VzHhq4f83p1MVLJJlPTmdzcB0WreRRE9A4i+jwRfY6IPkpE30FE1xPRo0R0jIg+TkRXJB/Y\nFkM/P29+f/fufqz+hg3uePpYqljyHTsWj1flCuzYcTnG3BYnr8u9c6d5rhXVPB56qJ+A54rpr471\n5RTE4ItxB+wyuvJbbOexrYs0b4CDLSdjYcGfzyHNtTDNubq3bPR6l+VzHePLa6moz8F2Xs41Bxav\nH2c8jZ0Hdy5JeDv7wlksHF1YlOPgymvY/8R+bHr/JgzdM4RN79+E/U/E5XnYZLLlY+jYcjmywnma\n5HgBeDGApwCsHfz8hwB+ZvDvTw3eux/AjO9cjUQ95dAydVJYOSbNUrq323RNIt/YIRo4Zz5tXmsd\nzvWR3qf1SCpOdBnH/yCVI1fUkvCejvVF5Oh1bZPJZ1m05aNoOzN7GMBaIhoGMALgaQCvAvCJwe/3\nAPix5KP6tHEbNq0lJqu0+uz27TIrZ2HBrwGOjck1bW42cg7qY2/YsNSKm5uTyWebT2SGbjI418cm\nq83S0LPuAbdV2estLucChK9ZHX0OkvsqpjqC6W2LBs7VzG3a/86D4feHbex6Jve6K9aB0C870qMe\npm6aaieTm/M0yfUC8HYAzwH4OoD9ADYCOKb9/iUAPmf57DSAwwAOj42NyR6jMRpTSOVQiRyptbU2\nLYQuw137NuTgVgPg3qOpIoZiKho0sR5CHwVXM88RHcWRKYclUwddd2YDuArAXwC4BsAaAH8MYDv3\nQaG/kvWj4EQGhVQOtZEypt0WxWWba5twstyblMO2xq4eBbZz5epvEpMVnypqLyRyK1WeR0CWdqp8\nBFd0VEw29swDM4uqy1YPpN49PTXzwEwjUVnL4UHxEwA+rP380wB2A3gGwPDgvVsA/C/fuZJ1uEuZ\nmxCbxerSHiM1rFbJlREdQ8za2+bUxDxsGj7HRxEiXxP+rkTWT0ptPEfUlKQL3mqPejoJ4BVENEJE\nBGACwBcA/CWANw6OmQLwqcYk4uyRcyuHcvwgnGM40Ua5q9amxLVfDrQjt8sHwFnXlOsv8XfVfRG2\n91P5naT3umRdqnn3FUT+GBZS+hUmb5zE1E1TlyKSKl/BwtGF4DFM8nEZWz+WPArLR6v9KIjoHgA/\nCeA8gM8C+Hn0o6E+BuDqwXvblVL/4jqPuB9FSmJ6OZg+q8M9T0x/jaZx9UmoaFpu2zV0PdD0OaRa\nf+m91PR1t/U6qTvDpfKl+jvQh7b0jSAQLr5Ltjb7n9iP6T+ZXvTF7uoxwRkjpK9FNe7UTVPY89ie\nJfKElCxfFv0olFLvUkp9t1Lqe5VSO5RS/6KU+kel1A8qpV6qlPoJ30OidUK0NVe+REiuRoxV0zQc\nmZTqr8HwcP/LCcjbr8B2Dbk9JFKtv9QyyXndTevNtWCk8nFyfYTWT2ykk47NOrGhoDB0zxC+8z3f\nadX4Q+SoIqJiLJlQVmeHuzaJsUCaPGcufNqjiYkJ4JFHmp8ftytdqvWXWgi5rrvUwoqVL4NlZLMC\nQrTuUO1fpz62ST4XupWS0lpaFhbFqiSHPyF0D9qmpUu1d8nxLj+QjYMH49Ys1BrhZhNz1z9xfkC2\nnBfbPWpDKfN8YjsEjsn34qvjdxzYgbXDa73d5DjnT5EJXdf4J2+cXJQvMbpmFENk/zrWZUhpLXEp\nFkXTNN072YZN25P2S06p1XJ6aNeP92mcqX1IoXOL6Xdu8wHkguNHMhG6NpZ5//2bJnDzTY+wrQKp\nFcE9Xqr92+Bo/ByZUlpLXIuiPChSs39/XyM7ebKvKe3atfgPZ3gYuHBh6ed6PeD8+ebk3LQJOHHC\nLIdJvvFx4Phx/nlsx9fR10t6L3LGSCmf6Xpy4cgRK2sqbHJwCJHVMt7x9cD17zAMsX4cx+9YOsam\n92/CiTNLz5Pi+NkHZzF/ZB4XlOFvg4lNjjr7n9iPnQd34uSZkxhbP4ZdE7uMlpDvGA7lQdEGHK2x\nKxaFVGu0ae8x+8tcf8Xmzf0vnxDNvisRYZzr3hVZQ/xIFSGyWuZ9EUDvbsMQFs1cunfPPT6FRRGq\n8eem+ChSw9nn5vgfYqtopsJVVVVyfEjkjau+lYnnnw/fi+9KRBgngiq1rKG+GV+lVoB/n7hk8ORO\nnFxvGUK4R6+gRJFH9fddOQ8b1m645AfR6zLpP8f4RzoDJyuv669kmdk2uBmmLfX+TTqnVNVZJcf7\nXjFd9Lqy3q75VXAzrTmkmnfMfSKtQaa9nlvTb0tqykyeecC8HtLucNzs7bZqPTUBul7CI+Ur+4Mi\ndU2drtReSlWfR3KekPpWsV30urDeKftCc+bDPZerRphvvNCudI4+2RdxuXd1SIc3X5e4+mc5tZp8\n5wv5cs9xzhC4D4rio+AQk2Ha1XyG3IRkO5tYKevHuTc491nK3ITcUVYOGRQUyPArm19i0ccjMp9T\nZWbrhPgffLkZTfk0io8iFNOeKnfvOFU8/UrA5q/xddGbmTGvn75mGzf2X7HrF3sdJDJx7g3OfcbN\nw+Gca37efIztfSkOGb58pfk+sPklFn2ckS+QMtdAz3kwEZIV7ZMjd6a1GI7Z0fVX1uqxqXtmd2XP\nPDeSXtW++eeoOBt7HdqSiVtdlXMu13ZfChwyvGVb3w9h80vkqM6awgfgquoqgVM9NmWVWBsoPooA\nQurtpxwjF23s0adcy5A+ITH75zE+gPqL029D0p9Dcv/45lH5JuqvXm/puUJkdcgwft+4evO2vj/i\nAhb7JfQ9epsPgeNbiOkVYfus3j9Cf/Xu6YlllfpTclAeFCGk6gTmIrcWV6ctC6aJHsm2axSjmVfH\n+uRO1Xc9RdRY6LpOTJhlnJjgjx0oR4zGnztiyHV+lwUQ2rOizQgo7oOiOLN1UmTGdi0zO2W2rzRL\nOXdWs440wzk2Mz1V9nLI9WkyW5xzPOezBkKzi7kZ1TnOD8D4ux71jFnbtvddso5eMYrnv/08FBR6\n1MP0zdOYuz1PCZeSmR1CbNRSFzOz2+qVkBJpv4KY6CFuhdRU2cttZmNLx+5ILxFORFNMPSS6x/43\num/bPlFvCusYluir2Qdnsfvw0ki0mS0zWR4WJeopBFNl07Vr+30jOFExuTKzY6JzuBFbvjHa7KIn\n7Txom7NSl+dmi0KyXQdfhFslEwf9XE33lOCMkbtrYySciCZbD4ntB7Z7s6CrTnam9+vd7oZo6FI2\ntgTbHOaPmCPO5o/Mt5rJXR4UdSYn+6bz3r3AuXPA6dP9L5gTJ/oapOtL+uRJ//u7dvU1V52Rkf77\nJirN9cQJvhw6nPE4Y9i2HEK3X6RU1+XiReCZZ/qvixf779UtGtOcK/S56eesziO5PiaZ9u2zj206\nl/R+4MK5ptKxXeuaSm4GuyZ2YWTNYjlG1oxg18TlsU+esfwtor91NP0n09YvWlvhvwvqAvY/sR97\nHttz6ZiL6iKef+F5p7w+WbljT//JNE6cOQEF5Z1DasqDAjBrXiEaNEcTk/YQiNXkXVZSFftvqrlU\nH4Pb7S0WjvXkO8ZXq8i1fr7rIxmbY/003VNi+3a7VeWzoEN6yidE0msiJk/Bli8xvn5c3Ou6kq3q\nO2Gr+1Rhs2Yqmes/N5VrUXwUqbp5uc4V8weUcg9buq+uj9GEb4Wzfm32lV5Omfe+3h6x69owUp+D\nba9fx+YncI2148AOdre7kOxqjtx11LvC//6Kj4KLNIPYtQcbqx3GZIVzcPUm9o3h8qGEav4c+era\nf6q+0rq/wsXsbD9SjYhneblIlZHP6Uzog7uuugVSF0PbM9/4vo3Y+L6Nzv3z2QdnMXzvMOgewvC9\nw5h9cNY8PcNevM3nYNOoF45a+nhr2KyOevc53QrgZnb7LAcbc7fPYWbLzCXLoke9RT/XcVkgKSkW\nhSuSo25Z5NSwUnWccyHpQcHtvmY7PkRDzdGzQRoxpeObs29snxwh11Fyn0jk9t0bNVml9Y+40Tw2\nbd42jrTXhE0+LjnqPnFwRWIVi6IJXJr52rXN7cHaNLqFBbmVYtM4uVaIaYwFj4YWq/kDeXo2xPgr\nuDWPOOuaKmrMdp75eXmoLif6Sh9Dk9W3V1/X9l3RPDo2y8GmOYfUdArV9oGl1obej2LD2g1YO7wW\nOw7sSB6V5PKbNEGxKGI0zpQ0ke8AhM9VGkMfMh+ORRGjmUtl4vTwbrrTXmg/axN6lViu/2owtk9j\nv3T4QNvlasSu89Yti5T9s2PJPV6u8xeLgkuMxhmK1Bch2dt2aa4xUSvcGHpP1zJn/obNotCvTUyu\ni9Qa8UV09Xr9LZ8mO+1JZXXNQbcShV3tOHv1uhXg2kvXfRG280qjh1x+hpRU/pTtB7azfCihuRBN\nzccKp85H11/LqtaTtEKttHKtq85Qark5skrrHEnqB+Wuk2TrOBdS36jNjnPS+5pxD3Gqn+oVVWce\nmPEeO7JrRE3smRB1tWsTaQXYrnS10wGz1lOxKHRSaH2+iBRb5MzCQl87rbS2SltdWJBFo+TKd+BY\nIyZZK0wWiy0Kq9eLyzGxrY00Km1urr8941o7rsU5OWm+vtItTZtFdf/9dp+a9L5mVA/w9WgAFu+f\n16N5TJx94SwOHT9k/N3C0QWxNm473hatxYnc0uHkVIytHxNbHV2k+Ch0ctV64kakmKKsOJ9ps5aU\njnTs2H17YaRONDHy5shT4J5TOrbw+JD9c66PQyeFj2LqpinseWwPK2nONweX30UyXkjXvVQUH0UI\nsXkQsREp0o5w1TGxtaRSIbVmfJpuaK2iihT+JV0GW34Cp25WbNST5Jx1i8pxXxu1bubfgZ4pTSAM\nUX99etTD1E1Tzv1zmy/ClS8g0cZt0VPzR+bZmdU+bd9lHVU+hIWjC97xFJTVgmmzvpNOsShSkjIi\nRcdnWXCqojYRuSW1KKQRWpxcDZNModVMOefn5o+EZPq75AixNuunjYikic0nsI19y3W34OBTB93z\n0gjNo4g9P8CL5JLIUV+zJiK3ikXRBqHRMy7GxxfvbfvGNWmDU1N97TNlj26Thiu1ZlyaK0cD50Tq\nxFQzDfGhpMz0953Th8ViSbFnLs2jqGOL4jn27DHj8anyKKSZzL58DN/7kh7d9TWTZqPnpNUHBRFd\nSUSfIKK/J6IvEtEtRHQ1Ef05ER0d/HtVmzKKsFXjnJ52V90EgIkJ82e3bu37N0zNdKpj6hU79aqm\nu3b1Px9afdaErTLp1q3ySqimCq4ArxKv/nlT1dbYaqY2GS5etFeutX3mwoVw+Wzn5FD7bKWlmprv\nXPqIo/JqymMmb5zE8TuO4+K7LuL4HccxeeOkVa4L6oKoCqutwuz0zdNL3rfhOr9rDP0ztmNs6Gtm\nWz/O2qembYviAwD+TCn13QBuAvBFAHcCOKiUugHAwcHPywNXRMrQkH1rZmICeOghs3YtjSSqE7I3\nHtqbIiSL3EZMBnZ97NCKtCFRcK5IotT5Hxxqn+VG6nhPm+AY0/67y0dRz4h2ZUHbLJa52+ecmdWu\nirR1uTlVbG1y2KwRfc1Css6zwYmhzfECsB7AUxj4SbT3nwRw7eD/1wJ40neuZHkUKeHkCHDi6WNz\nO6Sf58T758rVkMqR6jwhuQk5xpPkf9juI8856W7y5jKE9q2WnMeWU8DJyWgzHyHV2JzzNDFPLIM8\niusBfB3A7xPRZ4noQ0Q0CuBFSqmnB8d8BcCLWpOQCzcixUZI9VOulimtnsqxQFz+klgfSLWWO3bY\n8wI41VMl0UYpLSSOZeOqQmuaAzdrmiFrqhpIpk5vo2tGndq4bkFMfXJKVNNJ18Db3Lvnju2LVuJk\nWreeja3RWtQTEW0B8BkAr1RKPUpEHwDwTwB+SSl1pXbcN5RSS/wURDQNYBoAxsbGbj7RVKe1OqER\nKXVs0S+2CqZ6nR6pfDoh/aalvQ64xPSjsFXZ5UQbNdG3mltLyVexODJPJlUkjfQ8vigpHV++BKdn\ndi5y9+tumuUQ9XQKwCml1KODnz8B4OUAvkpE1wLA4N+vmT6slJpXSm1RSm255pprGhHYiDTKxYZN\n87dVbXVVc9W10p07+1+irlpWetw9x4Lx5WSE5i/EaP+mXBVutFHOvtUVHAuz1/PPPzJPxqWlSmL2\npT2puZ3h6jWdTL6INvfuY/p17zy4szN5EVJae1Aopb4C4EtE9LLBWxMAvgDg0wCmBu9NAfhUC+Lx\nkUS52HBFv0h7VZsikvbs8UfXSCKXfL2TgbBIHU6kk2u9be+HzCd1/2fOetjmENNz3YAp2kiPhuL0\nZJb2pHZFWV2axiBiqJJv77a9OHf+HE6fO71Ipq03bBVFQKWEE+lkm2slf1t9r2NoO+rplwDsJ6LH\nAXw/gHcDeC+AHyGiowBuG/zcLTjZunqUiwvfvrc029mllXOyvF378ib/gY0QbZyj2UtzVerRRk32\nrbbNwQbH+skkq9RCkPak9uUvmLK5bTItHF2I2ruP0epNvhkCLbJ4Uva97ooFUjKzpYRk68bsgaes\nn8S91pIs6pQd+HL4KDrS8zmZjyITnLpFvqzhJefU9u195zeNkcMXEes/4GSkc0uEVIT07i6Z2V3H\nl61rio+P2QOX7km7xoqp92SzVHbvXpwjwqmKaota4mjLtmPm5nh5CrF9q/XPb9zYf3HOxYlcism1\n8Int0Uz6YL79AAAgAElEQVR9Gn9d8+VUj9WtDk4ntvoYIb4I3zxjI6Y4GenS/ta2+ZTM7OWMK1t3\n717g3Dng9On4jOUK6Z6063iOb8GGa4/9uecuWyEXLvQ1e9uXmi2rW39YmDK1dWzHVO/brsPsrHts\nH3XZT59eOobvYeHLIvfNIeBhwfE/XFAW/4hG3S9R+RL2bdsXlKHsG4PjD9DhzDM225lznC2L3JQV\n7ppPyczuAqGapUtjz5GxzN2T5uQfCLuYseZtwtUTIlXvaBfSyKj62LZ7wxe5JOlN4bumjnWS7ltz\nNFOOxm/TfENyAjjadd0f4KtKy5lnbMQU5zhbN756VrjPt9KlzOzV6aOIqbDq+uyOHfnj8aUy2eYj\nzc/g7rHXSemv4SKt4sutvmu7vrZzxWCZgyJg3W/x+zIA4bH/Oqn3xjn779I9+iZyHJpcp+KjaJsY\nrdalDTYRj28iZD717m29njuJj2ONmKjLEbpGEgtQGhmlH+9aS27f8Bg8Pce/fKWsLwPA00zrGj+3\n7lEoHCtEukcfMk/p3JpcJ9NYrvpWWeHU+ej6S1zrKVdv7IkJ83knJuLO66OJXt86kjpWdTlCajil\n6o3Nqd3kWktO33BpLSrJuo6MqLds8/dmXnLaDvZq5mCrS2Wb63KdJ4dcc8MyqPXUHrk0/0OHzO8f\nPJiuD4SJpi2Zev/noSFgdNR+fGwegNRi4kZGmcZ2rWX9vOvWyaK9dKT1wQay/u0Pmy061761dK+/\nK3D36CXVXPXj285NkNB2BNTqfFDkysS1ZdYCafpA2Ggis1hn//7FPTIuXuzrvDMzPDk4kU060ux0\n1xi+sbduNZ+vel+PSqrmDfijvXRskV+2+RBdklUaCQT0vxj3PLbnUmTTBXUBex7b0/kvyK03mK+F\n/n490un0udM4d/4c9m7beynrXEeagd4V2o6AWp0PilyZuNL+1qnwzWd2Fhge7v9ueLj/cwxN9KPQ\nkWanx8CtrRXT58NWPZbhQ5HssafoZNcmC0fN12Lh6AJmH5zF8L3D4rmlqv7aNG1HQK3OqKdc2CKJ\ndHJHQNWJrT5roonIpfp5baS+f7ljSdeg4cxsaeZ0F4nte131reacs+vVX3PJVKKe2qAeSWQiVVQM\nN/9jfl72Pmds25dzLp9IZMVUEVzrReoX4lSP5dSlYpKqk10IqbTxWPkkNaq41V+bRup/yUV5UKRm\nbg44fz5PD2dfVrMJV1XV0LFN5PSJNOmD4a6XVCZf9dh6ZjbXf2PBt3edq9pqSh+AtN90HdPYHB9P\n2/6ACqn/JSfBDwoi+rWUgrRKbP0fEzn8ICH74iH7+4EROUkK1/k6vKX0fZjG4lovUplc1laGarWp\nOtnVyVVLyXReWx6BBFeNKptm3rY/oKJLlg3bR0FEf6j/COD7lVI3ZJFKSJSPIiZLu2lCfAMpMrC5\nneJiafJaNF2FtuH7LMeeNuecIRVfQ7O0uUh9MV3xUTTRyS+Hj+KflFJvGrx+AsBD4eJ1AE7/4rZk\nslk20v7XgDwDW9qxL3cXuNTXwnfdQyO3fNeuZoE8d+0GvO3H12LoWJ4s21Sd7HQ4PStCtHGO5uzy\nuVT9um1ILYGu9KruimUDyCyK65VST2k/X62UejabZAKS1Hqq03R0UmgvBp0UGqqrTlLuXgm5o6ly\nXXehtdCmxhozti8KaWTNCKZumsKex/Ykr0W1XKOVYlhWtZ6I6ANERPpDAgC68pAIghOBkrs+Ux2b\nNr19++XcB1+9pRTat23eIRE5Ut9PSIa5ZIxc111oCbW59xwzNqer3cLRBXEWuEtzrqwf2wMqptps\n1+mKZQPwtp7+GcCniWgUAIjo1UT0t3nFygw3AqVJXDJduND3M1QPi+PH7fH+Ib2qdVzRPJKInJAI\nLWkkkXSMXNed0+tbf7vFqJqYsTk9JU6cOSHOArdFIm29YeulqB8T9Wil5ZqB7sLU37wNvA8KpdRv\nAPgogEODB8QvA7gzt2BZCYlASdkZzdRxjbMFqOc+5KrvFBthFOP7kfbekI6RK/JIeC2a2ns2+SJi\nxuZ0teuRvbqtzTdi05wXji5Y/RIpqs22gb4GG9+3ERvftzEo36TpzHGvj4KIJgD8BvqRTtcCeINS\n6smsUgnJ3o8iNmJFEmHjo7peOTKuY2nC9xMzRq7Iow76KGxjhPgQJOd3RSXVf+8b19VnOzTruk1S\n9bJIef+kjHraCeAupdStAN4I4ONE9CqRNF1DqjXHRuNIOq650COPuDWJmqQJ30/MGPWqt9KKrzaE\n91MTe8827Xrh6MKisUfXjOJb57+F7Qe2Y/jeYcw+2K8D5tNYbXOwWRsuS8NGqt7TbUQJmeD023ZZ\nXm3W7hLXeiKiawH8kVLq3+URSU72Wk+x0TjSjms2dGuh6XpLHHzzzB2V5RtjOeXMRMLRrmcfnMXu\nw0ut0onrJ/DIqUeCNFappeHS9qUWRdejnri1q0yWl8kSrBNiOWWr9aSUehrAhPRznSY0f4GrHUs7\nro2P+3Mf2uqm58I1dirtPcbP4LIMA3xQXaswqsPRruePmOt9HXzqYLDGKrU0FBToHlpkzVTYPmN7\nP0fuSEo4lo3N8po/Mt9a7S4gsISHUupcakFagxM5E1tryPb5W281H7916+WaUUr1/637HZruQcHB\nJFOFpF+DdIyRkX5tLV8kli06Se8HwYzQ6npfA05Noyo6iAs3KssUqeOLmLqgLmD34d2LHhYhvTdM\nY3flWvnWYGTNiPWa+K5VrtpdFaUoIMf/EBsJZPv8sWPm4+t+hibrH9WRaNqcPI/t2+PqacXM22XZ\nCX1QKfsa5NB2OX4Q216/jRiNtS6PDd3KSWUhcDLKm4DTb9vl47HRRH5F6UfR5l4/Z+w299Vjxm7C\nXyElYR2rVJnCbe6r3/aR23DwqYNL3t+8cTOOnzmeNyNY6H/Qka4ZJ6O8K36M3NFqdUo/Ci5N7fWb\nNHPO2DGd1GKr4cZEe/nWr416WjZrxGYBOeYQ29cgJoLFFxXDtUyOPWu2aJ9/4Xlj1dYdB/LUpZIi\nzZfgZJSnjhgKtRJtVtTc7XOtZmkXi6KJfISYSqUpOqmFau8x1lYX62nZCLgHYiqpVseGRLCk1Djb\nrJ8UY1FI8yWa7vbX9egrnWJRcGkiHyGmx3SKTmqh2nuMteXzV3DP0wQB90BMXwMA4ggWnwViiorx\nacopu71JNWhpRJNUbp16DSgTCiooU9o079gM8aofON1D6N3bw7p3r4u2HmMpFkUTPorUmrnLQkg5\nn1TWSdfzFzLdA6E9FJrqxZCqv0SIBh2jdUs/m+o6cOUIyRmpsOW26OdP6a8oFgWXJnwUqTTzmE5q\nQ0Nyn0WqyKqcEVop/DEJ7gFfhzYupsgekxVRR5qtDKTr9hYSVRRT6VX6WU7/cBM+K8A2bxucqDFb\nbot+/t2Hdzeemd36g4KIekT0WSJ6YPDz9UT0KBEdI6KPE9EVWQVoIh9h61bZ+3UkVVttuQwXLvCr\nuIaO3cR5dEIq1JqIvAdccfpVXL+PkTUj2LdtnzH2n/PZ6ZunxTkHgL86KSeXwSWjLWchptKr9LMx\nVXldn5Wcl5vnIM1tCZVHSusPCgBvB/BF7effBnCfUuqlAL4B4Oeyjt5EPkKTdZnq8zFlf6eOOJqd\n7ffMILrcO6MJXD08TBV6h4bw3HdtxNu21/ahI+8BTnSTC1NUEVcLrrTpXFExKfIxTNpuzD5+6qgn\nF67Pcs8riRqT5raEyBNCqz4KIroOwB4Au9AvX/56AF8H8K+VUueJ6BYAdyulXu06T/ZaT7F0PVcj\nhjar2HJyNQyRZc+vAX7h9cBHvy9NNEpMdJPpGM5n6p9vM6LGFcF06Zja/nxMpdcUUU/c6yL1UdjO\nw/Un+HwUobLaWC4+ivcDeCeA6upuAPBNpdT5wc+nALy4DcGWELMXnssPwpEptw9m3rKnOj+fLp8D\nkOWhVFgq9I6+ALx7kGeWYm/XpsmZ6vYYxTRoxxLNMvf+tK+HQkikEqernS2iJyTqyWQVxWY7x/Tn\nsPlv5m6fw8yWmUuy+fqBc2WNpTWLgoheB2CrUmqWiG4F8KsAfgbAZwbbTiCilwD4U6XU9xo+Pw1g\nGgDGxsZuPnHCv5cbTK5+FDFbXNxz5o44snXaq8ZJMW7Kfh4DLgLo3d3/f2wMfajG6kNiaeTqucDp\noeCrbGrSdmPyQVLlKcTkctTJZbX4zr8aMrNfCeANRHQcwMcAvArABwBcSUTDg2OuA/Bl04eVUvNK\nqS1KqS3XXHNNXkljcxNy+EFc+/MbN/ZfQ0P946am8vlgbBVwK3nqP/vWzGQ5cPJQhPKdXH/5/6F7\nu5Xmu+PADqwdXsuu28NBPwfnnLm64/kirkw9LtZdse5SPSdbRJKkq13dYkrVzyMml6PCdw+E+G9M\ntN0/uxN5FJVFoZR6HRH9T/T7XXyMiO4H8LhSyrnZ3fl+FDmQ9LjImbNg81G4sMkdU4tJYHWk8FGE\n1nEyIdnDbqs7nouUmdxNdqmLlZXz+RD/TZMsB4vCxq8B+GUiOoa+z+LDLctj3wtXKn7vPRSJjyFV\nlJNJ25+bM/fOsFkaLgvEZjnYPqOv/+QkHr5rCqeu6uEigFNX9fDwXVPA3Nyi97905RDesW0UH/u+\nOK2ME+mka5k2bJaDTaa2uuO5kNa3qnwPsw/OBvf0TpGZHLuWnOirmEzzLtEJiyKW7BaFr25RVyqh\nusjRq9o1b5fvwnbPuawkl2UxMoKH75rCqy8u3dvOVXVTEumUU44ccDuxATINmtNTu0kfRSyhWes6\nbd8Dy9mi6B6cPgtNVUKttPodO4C1a4ENdm11ETl6VbvmHWJR2GT0VXk9exab3meudWSrgVTvES1F\nEulk2sdveo9ZJzSqqI40p8JnpXDXKbaWUio41g+nB0XXFAUTxaKQEqIppyI0+idnr2qbpRKyThyr\nxSKHHsUkZWbLDOZul+V85Kjz0wQpfCsuLZizJ+8iRx5FLrpi2cRQLIpchGjKLiS5BtwqtBs29F++\nKCfb2KG9M3Rs2v/4uH1cTnSYZTw9ikmHk48wf2RevOct7Q3NyQ8A8lcF5Wjj9bmNrhnFEPW/KvQo\nJpOsMZFeAM+akeZR5KLrPbpTUiwKKSktii5WhrX1yOD0ztCxRUNNTACPPJI0J0WPYtLhxPjrx6bQ\nDLuQH+AiVVazbT7c9TbRdk5BKroun06xKHLh0pSlSPf9U2ZZ28Y2ZDKze2cAl60FW8jsoUO8+kw2\nNKvjIoDj680PiSEaAoFw/+H7vZFHgDk7OmTPOyY/IFfvBx2pNm6Tyeb70X0MLsbXj2Nmy0xQF70Q\nTb5JDb8rPpSUFItCym23AQeX9hnGxATw0EOyc0kthJR1lSR5GC6ZdKSRWCYE1oU0OueW624x9oi2\nkXLPm6PJN9FxLnW/6dj5pJiT7zxNR5x1xYfCoVgUPkLrEB06JHvfhdRCsFWb3b07Xf0pm6+FY7WY\nrBTu+SsEEWSSPemzL5zFsWePLaqj06PeJa029vw+OJp8yo5zdfTcDgKxfQ6u6K7Q+SioRXkUtq59\nrn4WJqTWj0TD99W70umKDyUlq/NBEdPH4IKlXrztfRfSPggnHfXmpb0YXvpS8/sve1l4bwaXfNV5\npqfN/TJ0mHW7tt7A7Ocx4OSZk5i7fQ7nf/M81LsUzv/meczdPsfquRALZwzOMbaeA65eBPV+Gc+/\n8Dwuqr5mW/VymH1w1thTY+sNW40y3brpVuNY+jUxzafixJkT2H14t7ffhq2fhQnbGth6PHD7N9TX\n7/S50zh97vSS3iMVTdxPTbM6HxTcOkkmLT1l1FOq7nUVknwOmwX05JPhdalc8vV6fYf43FxwfaaK\nqqewtBwzt7ood79cEsVkqwWkb31wOrf5tHSTDL5Ma1fXNFtew7FnjxnPtfvw7qgOfzb5OH6aGOun\njn7+qU9OedePW4sqxlei99KOyQEKYXX6KFyRS3Xqe+Zt9l/g+gA41zRHPog0gz1Ahtz1+rn75aH5\nCLF1nEJyHKR+Bh3bvrrvnNze2yFypIjESt1jm+N/iPHF2O77kBwgneKjcCHR/utauq22Ue6HBODP\nEK/k4ZA6HwSQZ7AHRJD5egpXhGbAcn0AnOOk/gRpjoMJ0/lTdnirNGLfl35djtj9eY6fZuHogtEi\nq3f/G10zim+d/5Y1Oz+kxzZnfjHRULb7nvv3EMvqfFBI/Qn1vfe5OeD8+b7We/58Mw+Jiqr3tA3u\n3KanZe9zqeSzWQv6Wgb0qvb1FK56Tz/zzmfwzDufsfaCtsH1AXCOk/oTbPv19ferPtdVKW/f+V2+\nAh+6z0HSx7suB0eGkTUjmNkyE+ynOXHmhLWXdrVmb93y1iU+mt2Hdy96WEh7T3P9DyH+pQrbfR/T\nY1vC6nxQSHMeUnWDS0EVrWWDaxGktIxCM7kD+nRwu5KF7gVzI1ZSRTHp2OYm3WOv+yts9YY4LBy9\nHGkXU1XWtG+v51FU187V+9tnzdjqbOkaO0czd12fmHpNMdFQ0nsjNavTRyGJ92+jMqyNlD6KVEgz\nvCPXkrNXG7MX3KaPQtpxLbYyKWcvnpMXETK2FM5cOXW2OGucK7O6+CiWG3VNdnS0rw0D/X9HR3nZ\nxyl6QUvg5CmEZIjH4Ko/NTW12GKZmhI9JExWQb2ncJULof+xxOwFc3sUcCKlpNFU0o5rIf4KyecB\nnoVkkjd1zSOXNZO6+x8n+qxCMr+Y/hec+z4nq9Oi0JHWW8rdg9qFL5u6DetH0kNCIF+M9tV0Zmwq\n66LNOeeIuEqpmafKWk9pUSynmk42ikXBxZVTYbIWQvtnp7BCXL6SkF7Yuky+/BGpTL0ea51sGpmk\nU1rbmbEuWavYd1v2cWz8vW/fnjtnjrYr7a2QsuZRSO8Hk0wcq80m99Qnpxatf8w9utwoFoVUSw+p\n4JrKCklpzaTq2hfR59qlke04sEPUQa7NDmgxPRhi4u99lVrb1m5TWna560FJcz443fqWg6VRLAou\n0mznkAquoVZIHVeUkNRi8fk7uPJNTpp9ETZfibZOLo1M2kGOq5nnICbyJCb+3lTDqCJ2zik0Yp8V\nkHt/33R+znk41+TsC2edkUgpaldx5tMUxaLgRBLp1kKIVp+yj4SJlDJJ5YuIenJpnG/d8lZRBnab\nlTlDLYpY/4NVnsi1aEJ7B5DV6ksd+WbDZDn4PpfLEgqhWBRc6hqxicjYf6cVksJ3EWKxcHJDQivG\nDqKeHr5rCqeu6uEigFNX9fDwXYujnlwapx6/rxNSt8dGqt4FIbWMUsTfp1wLnVS+BZf2nrv3RsrI\nN9s669FWnC6HUjl02u5xUSyKVHv10jFS5hqk8pvocOWwjK0IWPdb4b6EGB8Fh5S9C2znsvW/kIY1\nNt1noYmosdy9N9r0j3AtElNujI1c16RYFFxce/UhkUQmbFbIwkIa30WI36QuE7fPNnOML18Z50uw\nacV1Lc6Wm+DTRG0amq2Kqklz81WGfeinH1oU+z5EQxhdM4r7D9/P0o5953dlMYeQKoLKdM76dcjZ\ne4N7fi5S/wgnP0Xq12q7x0WxKHL7D5oYu83cDsvYk685i//xfUsPzx3Xz9W0Y/f9c1SGjTk+ltgs\nb+45JT6KGC06VyazFGm2vY3io2gbm9atVP6s61S+ixC/SSosY//tD8dlyXK0uJCOZlVeg7TkdV1u\naQx9quO3H9i+qMOar9saF07ms/QLyTXnmOgjTh8JWyCEzfeVC2m2vY2mI/nqFIuiCR+FZOyMdZKa\npAmNOLbHAReT3C5NURoJExI5I5GVQ4498CayxX3Hh46diq5nbxeLgou0h0KusWN9F1wLpKE6VU1o\nQNJooBBscrvGMGnR0pj70Dlw4vVNndJy7IGHdOPTkd5DnOq2Kfb0m6rv5Bqr6ZyKYlHotOmviJGD\n66No05eRAds+9MT1E3jk1CPRWr3rDzokdyLW0ggZrz4H6ZrFOsdT+z1cSLvuhdCkhdBEtFuxKCRU\nWrbtodl0PwppFBM3j8J1XCJLI5emo5+32pe37UMfe/aYUYtzafXcaqH6ZyRIY+65Mfku9Agh3979\noeOHkluAsdVtpbishVQRYZyaXakI8cHlolgUbfooJDK55OBaIJkqvV4Su8E6/i5s+9C3feQ2Y17D\n5o2bcfzM8WQWhcQ64axZaJ9woL8We7ftTR7XL5YjUfSPizbvvxy+D6nVGiJDsSi4NJFH4cKkyUtr\nOnEtkISVXk2RN7m0rZjOajrHnj1mfP/J0096o6T0/XzAHc0SGnNvqxjrekj4utWNrR9jrV/dQuJY\nhhLrMUWHNt94ufxiXN9Hams6Va5FClqzKIjoJQA+AuBFABSAeaXUB4joagAfB7AJwHEAb1JKfcN1\nrmWbR5GqFwY3Smp2Ftgt0Ew9lV7Zp4nUtlJ1VksVJTWzZQavHHtl47WK6nCzmF1Z7hXSDoG5u/fV\naTN6iHPf5PDxpLJanWMsA4viPIBfUUptBvAKAL9IRJsB3AngoFLqBgAHBz/nIySrORVSn4Grm1w9\ny3rtWmDHjv5nZ2f7/9oeErY6V55Kr1xiNZ2QzmqS80g1t/kj89mjuqQRPCFZ7oCsQ+D2A9vRu7eH\nde9eJ7YeY/MJ2qx1xLn/Dj51MLl8qazWFHTGR0FEnwLwu4PXrUqpp4noWgCHlFIvc3220Q53KZH6\nDBg9HkT9wH3jMSq9ek/bwB5xbD9sW00mFzn384G0ETzSLOUYy8tmPcZaBE13LdRpy5puwopaDhbF\nJYhoE4AfAPAogBcppZ4e/Oor6G9N5cPWT6EJ57XUZ8DQ/Fl9tetUPhBHZneIVZBK05F2VuOep/qs\nzXdho7JAYvakQ7v0AfD23q5jy0a2vZ8jd8K09lM3TWHnwZ2s9ePmeeSIuuPUbrIRs5am+15y3VPS\nukVBROsA/BWAXUqpA0T0TaXUldrvv6GUusrwuWkA0wAwNjZ284kTJ8IE6GCdJOcXvS86iYTx/cy5\nSmv0dyXzlINUg471UeSuY8Wdn0T75yC57jlqXzWhgbf1d7Cqaz0R0RoAfwRgv1LqwODtrw62nDD4\n92umzyql5pVSW5RSW6655ppwIVJ1nwuhHt00Ogp861v2412af+XTkCCI6nJp9aNrRjFE/VuJk4PQ\nNVyVavXqrz3qYeL6CSwcXQiK8JLE4tusn4WjC1b/gU3LlGZdh2jQUutR6nOIqf2V0o/BXRtOv3MJ\nq7YfBRERgD0AnlVK3aG9/58BnFZKvZeI7gRwtVLqna5zLduoJx1fRJI0GspFQoup67VsOHDnEBNP\nnyoWP8R3EXONbLkn0vPU6WJtKSnf88HvwRee+cKS9zdv3IzP/+LnAaT7+1jN/SheCWAHgFcR0f8d\nvLYCeC+AHyGiowBuG/ycjxRRTymymufn7b+zaf7VuNu3+x8SvV6WyrLcqqipqpxykeQB2Po91P+Q\nY2oJpapD5DvGpGXGRGi5/DcxPqgma0u5/Bgx9+WTp5/0vp/KEmi7H8VwI6MYUEo9DMC2oT7RmCC7\ndpn9BLt28T5f1+ZPnOj/DMi+jC9csP/u+HH/uC4y+lxOnjlpfP/EmROLNKnT504v+R2ARnormMar\nH3P63GmMrBnB3m17rTKdOOP2g42sGcGuCfN9E/NZnV0Tu7yWiemaTN44GbTWtutLIBy/47j4fBWm\neXDXIOacputeIb0vLyjz36z+vm39bO/byLFeEjoR9dQqsVFPqXwctogm2/vc6KbM2eWu3ATXl1mO\n/VWJDyBE03PlW/giUlyfDY3csiHRMkOjr2KjjXJE9IT6MXRM1vCm92/C7IOzS+bnyjZP3S2w9KNI\nQKt5FKl8HLfdBhw07AVPTAAPPcQft6KhyC3bHiwnKiTl3rHUBxCSKRyTKZuj1lHs/neqSKIm5EgF\nN8KNU9nXln9jytKuf7YrPrzl4KPoBrEWQarM7mOWvWDb+67zM62IFNEYNk2HEzGTcn9V6gMIqT1k\nm5Otp4QeiZSq0xkg963YcGVgV3I3EW3UZEQP557zWcNAX75jzx5bEhU3s2UGx549Zv1805ZAKlrz\nUXSGk5a9Qtv7dbZuNUcrbd2aVw6bb4VpRXD28bnY9r99Gv7WG4Rr5MC351vfz+XsL9ex7RO75lit\nqy3/QbrHHOJbseFas/r94Dp37D58qn18Dj4fj6QHyMkzJzF3+9yS7Pahe8z6d6xfp02KRRHbt3rB\nnN265H3fuaSWSWSf7NxaHGcvXdK/OCaT2aTFhWj4kzdOGvtW+KyCsy+cxcLRhSR7zCmvW0gEleQ8\nXIuxyYgeTpY/18qzdeprO0IpB+VBsWtXXxPXGRnpWwTT0/0oJqUuRzPVv+A5lkDlB3GdyyaHK/pq\ncrIfEXXxYv9fgT+iCS1u8sZJHL/jOMgS3MYdq9KiT5w5AQV1SdvV/0Bt1snMlhkcv+P4ki/kXRO7\nMLJm8Xr7NPz9T+zHnsf2XLI6LqgL2PPYHmy9YeuSc9U5eebkpfW4+K6LRpk4pLxupjUIOW/IWqb8\nvBT9OjzzzmfwzDufWXRNOOtSYboXm55PE5QHRWzfao4lwPGDRFoIOhzfQ0qtJ1XkjO1cHC1aWs8o\nJIrEJoduLdjg9on2EXrdTOuaKoIqNiKH05OjqfwbmzwzW2bYnfpy9clukxL1ZIMbzWTLqJ6ZAebm\nZOdKQEyWcUg0RsqoGGkElR7F1ERWLmeM3H2iQ65bV+okSemiTLnvs6bnXKKefKTyGXB8FNxzJcjw\n5u5hp4rL5ozHHct2Lhu6tptrX1jX7qp6Vq4xfFp6rB8oRPtOeY10cmu+bdc30uHkRayEmk42VqdF\nwcmd4OZXcKyFlON5aLreTcrxYjrZ5dDEOLkZIR31clyLkA53Xe+V0GYPCh2OlRhS1ddE03MuFoUL\nm89g+/bLmjzXZ8CxFjjnSpTh3XTERcrxYjrZuTJ9OfV8uL4RoB/txNG6Q9YmVCt1aaIuOXKMl4om\nerNGwvIAAA4oSURBVFBwPuvK0fFV9TVleYf23WjTd7E6LYqUWc2p+lkk8mM0vceZcjxurX9fJrPU\nTxDjG3Eh7SwXs5YuTXTvtr3Jeltwxkul+XLWL2bNuJ/lzNVlDUv6W6fsQ8KhWBQufFnTEk0+VYe8\nRBnesZ3EpKSsQcOJwuH0t+bW83Edf/aFs9axuJaPNBIrRkt3aaK2/I+Q3hac8bjYNOTqfdNDAli8\nfjFrxq18zPFNSWqeueST9iFZ8f0oUpLER1GHq8mnsigyddrrYuQIh5jaSBxfRw5tkCuHTeuOmbPr\nOgNLs+Q5GcixHedC5DVpznVSRbtJrrvp901YpT5ZV0M/ivbQfQY2uJp8quqxNT/Gc9duwNt+fC2G\njsX1x+VqTZwxmtwjdVkVodqu7RhXhzuXtZS68qoNjhXlsuykFpN+TEzHORc2meaPzLNqdqWoziqt\nfOzyTUlrnkl9eG1ne69Oi0KnK9VjdZESWgG5906b9H3UZZfI6vpsm7kJqfwyLiRVb5d8tuFoOR8c\nq4N7X9p8IDZC1qLJfKUQikXBJTYjmulbkGjjIfuutvOn2jttOr67vq9eR6Ltmur5cLTBkCxtaW4C\np+ptSIVZHVel3JS9LSS47ksbrv36inVXrMO5F85h+4HtGL53GLMPzlrPZ/MVxfqmdFL58Eo/igRk\nyczmwrBIpNqAdD8y5f60bYym47ul/SWaJlV/iZAe2FI4snbBYuRG90itEVuUWS7f1HKiWBShSLOj\nGVFPXG1cuu9aHe/q6CateCrdC02Z+ezLJk49dgyc7mYxcfOAvXeB1FfEqZTbdL0l23hzt88Z71d9\nDaTXff6IuR+9xDeVM3KQS8mjiCSZRRHir2B8JkeNIK7GnSqGvqnMZ182caqxY4npdqcjXddc/hQb\nXbE0YiKMALOV13RdtBiKj6JLhEQwMT7D0cZdGrRJq+Jq3JyKp5w9zxy1gEKyiYFudAmTdruzRZlJ\n15XTla5OzP52St9UaBZ0ff1snf2kXQtja5A1WX+pbRmKRaETEsHE+AxHG5DuVXP2aWe2zOD+w/e3\nUi8nZs4uS6jtB0RFiFabYt+7CZ+GTipfTGwWdHW86/PSTHguXag5VfIoukRIdjTjMxzNhdttzOfH\n0Fk4utBIvRwTHM3Q5YtpO8rDhzRuXhplVod73TnnlFzrkN7iJrgacUyU3tztc8Ye1nO3z0Xd323n\nMHRBhmJR6HB6S9RJlFHNjaeX9PQFgH3b9rXSiyA067VLVkMIOWLzufcG55zSa507uqsua1PrlyKL\nvPgoVivc/tc6k5N4+K4pnLqqh4sATl3Vw8N3yWs9cescSR4SPeqxollcUVOhSLNegXZ9D6ksqpSx\n+a7r48LVOVB6rUMsitkHZzF87zDoHrqUy8DViHPkNnCrE9iqDKe0bkPvs7Yt7GJR6AT4KHI86aVa\nlQub1pc7TyF37ZuULJdM+NBzxlxrqUVhu3cnrp/AI6ceyeqjsNEV67YLlkmdYlGEEJBlPfXJqSR7\nz7qGIdWqbLiOz52nIN3DT9FTmqMdmgiNKDFdu9C6URyZQs/JOZeCMq4ZJwdDx5azcOj4IZasqdYP\n8Pt1fBZ66qiitiOXYigWhU5glrWJmL1TSeSMD5tF0XT0TEVMDadc5w2JKMndNyDl9UldVymnTyNn\nbSQd7t9R0z3Xm6ZYFD5MGdiMuk8c7QyI2zu1WQJ1raqqYWQjtIaPdP/T11fAljdgwqZhheRk1M9r\nyzUIiShJlZ9iwzX2EA2BQNhxgFdZONQyDJmPy4rlyJpqL56Tl8SpoZUyqqjtyKUYVqdFERGpxNHO\ncuyddilbl3OemJo9dQ2LI6tLk62TIuort3YoiXQKudZcpPPx+dea2pPnWGSpqtByKT6K5UZEDwlX\nNI9UA3Ltx/rq3eiEaGE5NbezL5j7CtS1eq6GxclGlvhv6lZLyFrE9sP2+VB81XNd86mPp2cyS5Fq\nu/VcBq6sqeHkJdWtJV+V4VjajlyKoZMWBRG9BsAHAPQAfEgp9V7X8cl6ZjN6SKTUCmIjRLpAE/vf\nHO1Qqi3Hav4pajTphPapqOBaYbdcdwsOPnWQdc5cuTRN7Ml3vfpwV1i2FgUR9QB8EMBrAWwG8GYi\n2px0EEd0k28vPKVWYItuOnT8kDg6oq3Kkk3sf3O0Qyl6lzTXmtmOSVGjqT4HXx9vyXxs0XiHjh9i\nnS+FtptzT17ydyqVT4KeM9K7t4d1717H8tUtNzpnURDRLQDuVkq9evDzrwOAUuo9ts+k8lE8fNcU\nXn0xPmKFi1QbD+lHkdsCCYncquBqdKF77C6rhWPNNJVfUcHt423CZIWGktPPkuK+bKLiLgeOPyZV\nFFwulq1FAeDFAL6k/Xxq8F46LNFN279jaeesnHuq0i5ftuPbjM+W5kvocDU6jnZYR+9vYJLP1CWN\no9WHrmuqPt42TFaoCY7PI1UUTq49eel1ySWHLWdEl8nmq1sOuRM6XbQo3gjgNUqpnx/8vAPAv1VK\n/YfacdMApgFgbGzs5hMnTkSP3YUubiFaSBfjs9vKlwB48+asWcp1TeGjCPHF1MdoOtInB1253yWR\ndks+2xH/yHK2KL4M4CXaz9cN3luEUmpeKbVFKbXlmmuuSTJw03HONk3HpgXb/ni7GJ9dn1uqiJJU\ne8+cNUu5rtL1CKlOa3vfdW/ljvTJQVfud451lrL/dpt00aIYBvD/AEyg/4D4OwBvUUp93vaZVJnZ\nXYxz5rBc5Y4ld+e2Lq5r7ozw5UBXrstq8lFAKdW5F4Ct6D8s/gHATt/xN998s0rFvsf3qfH7xhXd\nTWr8vnG17/F9yc6dk+Uqdywx8+Z8tovrapOpi7LmoitznXlgRvXu6SncDTV0z5Aa3TW6rK4LgMOK\n8Z3cOYsihGS1ngqFQmEVsZx9FIVCoVDoEOVBUSgUCgUn5UFRKBQKBSflQVEoFAoFJ+VBUSgUCgUn\nKyLqiYi+DiA0NXsjgGcSirNcWI3zXo1zBlbnvFfjnAH5vMeVUt6M5RXxoIiBiA5zwsNWGqtx3qtx\nzsDqnPdqnDOQb95l66lQKBQKTsqDolAoFApOyoMCcNcKXrmsxnmvxjkDq3Peq3HOQKZ5r3ofRaFQ\nKBTcFIuiUCgUCk5W9YOCiF5DRE8S0TEiurNteXJARC8hor8koi8Q0eeJ6O2D968moj8noqODf69q\nW9bUEFGPiD5LRA8Mfr6eiB4dXO+PE9EVbcuYGiK6kog+QUR/T0RfJKJbVvq1JqJ3DO7tzxHRR4no\nO1bitSai3yOirxHR57T3jNeW+vzOYP6PE9HLY8ZetQ8KIuoB+CCA1wLYDODNRLS5XamycB7Aryil\nNgN4BYBfHMzzTgAHlVI3ADg4+Hml8XYAX9R+/m0A9ymlXgrgGwB+rhWp8vIBAH+mlPpuADehP/8V\ne62J6MUA3gZgi1LqewH0APwUVua1/gMAr6m9Z7u2rwVww+A1DcDeOIPBqn1QAPhBAMeUUv+olPo2\ngI8B+NGWZUqOUupppdT/Gfz/n9H/4ngx+nPdMzhsD4Afa0fCPBDRdQBuB/Chwc8E4FUAPjE4ZCXO\neT2Afw/gwwCglPq2UuqbWOHXGsAwgLWDpmcjAJ7GCrzWSqm/BvBs7W3btf1RAB8ZtJ34DIArieja\n0LFX84PixQC+pP18avDeioWINgH4AQCPAniRUurpwa++AuBFLYmVi/cDeCeAqjHxBgDfVEqdH/y8\nEq/39QC+DuD3B1tuHyKiUazga62U+jKA/wLgJPoPiDMAjmDlX+sK27VN+v22mh8UqwoiWgfgjwDc\noZT6J/13g05XKyb8jYheB+BrSqkjbcvSMMMAXg5gt1LqBwA8j9o20wq81lehrz1fD+C7AIxi6fbM\nqiDntV3ND4ovA3iJ9vN1g/dWHES0Bv2HxH6l1IHB21+tTNHBv19rS74MvBLAG4joOPpbiq9Cf+/+\nysH2BLAyr/cpAKeUUo8Ofv4E+g+OlXytbwPwlFLq60qpFwAcQP/6r/RrXWG7tkm/31bzg+LvANww\niI64An0H2Kdblik5g735DwP4olLqv2q/+jSAqcH/pwB8qmnZcqGU+nWl1HVKqU3oX9e/UEpNAvhL\nAG8cHLai5gwASqmvAPgSEb1s8NYEgC9gBV9r9LecXkFEI4N7vZrzir7WGrZr+2kAPz2IfnoFgDPa\nFpWYVZ1wR0Rb0d/L7gH4PaXUrpZFSg4R/RCAvwHwBC7v1/9H9P0UfwhgDP3Ku29SStUdZcseIroV\nwK8qpV5HRP8GfQvjagCfBbBdKfUvbcqXGiL6fvQd+FcA+EcAP4u+QrhirzUR3QPgJ9GP8PssgJ9H\nfz9+RV1rIvoogFvRrxD7VQDvAvDHMFzbwUPzd9HfhjsL4GeVUoeDx17ND4pCoVAo+FnNW0+FQqFQ\nYFAeFIVCoVBwUh4UhUKhUHBSHhSFQqFQcFIeFIVCoVBwUh4UhUKhUHBSHhSFQqFQcFIeFIVCQga9\nP35k8P/fIqL/1rZMhUIsw/5DCoWCgHcBuJeI/hX6lXrf0LI8hUI0JTO7UEgMEf0VgHUAblVK/fOg\n1PccgG8DOKSU2t+qgIWCkLL1VCgkhIhuBHAtgG8PGkUBwDYAn1BK/QKKhVFYhpQHRaGQiEGZ5/3o\n90d4joiqvgjX4XITmQttyFYoxFAeFIVCAohoBP1eCL+ilPoigP+Evr8C6PeJuG7w//I3V1h2FB9F\noZCZgY/idwF8C8DDxUdRWG6UB0WhUCgUnBQzuFAoFApOyoOiUCgUCk7Kg6JQKBQKTsqDolAoFApO\nyoOiUCgUCk7Kg6JQKBQKTsqDolAoFApOyoOiUCgUCk7Kg6JQKBQKTv4/vEotGvEmiMUAAAAASUVO\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "pos = (y == 1)\n", + "plt.plot(X[pos,0], X[pos,1], \"go\")\n", + "plt.plot(X[~pos,0], X[~pos,1], \"ro\")\n", + "plt.xlabel(\"$x_0$\");plt.ylabel(\"$x_1$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sklearn kutuphanesi yardimi ile siniflandirma" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ogrenme kumesinin uzunlugu: 750\n", + "test kumesinin uzunlugu: 250\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py:444: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", + " warnings.warn(msg, DataConversionWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[120 1]\n", + " [ 1 128]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "#################################################\n", + "# Datayi train ve test olark ayir\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", + "print(\"ogrenme kumesinin uzunlugu: \", len(X_train))\n", + "print(\"test kumesinin uzunlugu: \", len(X_test))\n", + "\n", + "#################################################\n", + "# Datayi normalize et \n", + "#. Standardize features by removing the mean and scaling to unit variance\n", + "#. Centering and scaling happen independently on each feature\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "#################################################\n", + "# yapay ogrenme\n", + "# Agin katmanlari 2 (girdi), 3(ara) , 1(cikti) \n", + " # SADECE ara katman degerlerini MLPClassifier'a veriyoruz\n", + " # sigmoid icin activation= 'logistic' seciyoruz\n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(3),max_iter=500)\n", + "mlp.fit(X_train,y_train)\n", + "\n", + "\n", + "#################################################\n", + "# tahminde bulun\n", + "predictions = mlp.predict(X_test)\n", + "# sonuclara bak\n", + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sifirdan Ileri Besleme Agi\n", + "\n", + "sklearn kutuphanesinden elde edilen agirlik (mlp.coefs_) ve bias (mlp.intercepts_) degerlerini kendi ileri besleme agimizda kullanacagiz." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[-1.88141318 1.71888803]\n", + " [ 1.49093284 -1.22026666]\n", + " [ 1.7194988 -2.08641553]] \n", + "\n", + "[[-2.30193491 1.1164206 2.13425249]] \n", + "\n", + "bias :\n", + "[[ 0.1702897 ]\n", + " [-0.18059533]\n", + " [-0.17099307]] \n", + "\n", + "[[-0.31920663]] \n", + "\n" + ] + } + ], + "source": [ + "# W, b icinde sklearn kutuphanesinden gelen agirlik ve bias degerlerini tutacagiz\n", + "W, b = [], []\n", + "for c, i in zip(mlp.coefs_, mlp.intercepts_):\n", + " W.append(c.T)\n", + " b.append(i.reshape((len(i), 1)))\n", + " \n", + "# Agirliklar (girdi-ara) 3x2 matris\n", + "# Agirliklar (ara-cikti) 1x3 matris\n", + "print(\"agirlik :\")\n", + "for w in W:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for i in b:\n", + " print(i, \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ornek bir veride ileri besleme agimizin ciktilari sklearn ciktilari ile karsilastiralim. Ama oncelikle ornek verimizin de normalize edilmesi gerekiyor." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-1.46634628 -1.72167202]\n", + " [-1.50243 -1.72167202]\n", + " [-1.57459745 -1.58067849]\n", + " [-1.61068117 -1.54543011]\n", + " [-1.75501606 -1.43968496]]\n", + "Tahmin: \n", + " [1 1 0 0 0]\n" + ] + } + ], + "source": [ + "# help(StandardScaler)\n", + "ornek_veri = [ [9, 1],\n", + " [8,1],\n", + " [6,5],\n", + " [5,6],\n", + " [1,9]]\n", + "ornek_veri = scaler.transform(ornek_veri)\n", + "print(ornek_veri)\n", + "\n", + "tahmin = mlp.predict(ornek_veri)\n", + "print(\"Tahmin: \\n\", tahmin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ileri Besleme Agimizi yazalim" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#### Yardimci Fonksiyonlar\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "def sigmoid_turevi(z):\n", + " return sigmoid(z)*(1-sigmoid(z))\n", + "\n", + "def ileribesleme(a, agirlik, bias, goster = False):\n", + " \"\"\"Katman katman yeni a degerleri hesaplaniyor\n", + " Girdinin transpozu (satirlar ozellik, sutunlar gozlem) a olarak verilmeli. \n", + " \"\"\"\n", + " for w, b in zip(agirlik, bias):\n", + " if goster:\n", + " print(\"w:\\n\", w, \"\\n\")\n", + " print(\"a:\\n\", a, \"\\n\")\n", + " print(\"np.dot(w, a):\\n\", np.dot(w, a), \"\\n\")\n", + " print(\"b:\\n\", b, \"\\n\")\n", + " print(\"a = sigmoid(np.dot(w, a)+b):\\n\", sigmoid(np.dot(w, a)+b), \"\\n\\n\",\n", + " \"**\"*20,\"\\n\\n\")\n", + " z = np.dot(w, a)+b\n", + " a = sigmoid(z) \n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w:\n", + " [[-1.88141318 1.71888803]\n", + " [ 1.49093284 -1.22026666]\n", + " [ 1.7194988 -2.08641553]] \n", + "\n", + "a:\n", + " [[-1.46634628 -1.50243 -1.57459745 -1.61068117 -1.75501606]\n", + " [-1.72167202 -1.72167202 -1.58067849 -1.54543011 -1.43968496]] \n", + "\n", + "np.dot(w, a):\n", + " [[-0.20055821 -0.13266982 0.24545906 0.37393548 0.82725312]\n", + " [-0.08532486 -0.13912327 -0.41876979 -0.51558063 -0.85981154]\n", + " [ 1.07074256 1.00869665 0.59043372 0.45484502 -0.01396697]] \n", + "\n", + "b:\n", + " [[ 0.1702897 ]\n", + " [-0.18059533]\n", + " [-0.17099307]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.49243345 0.50940386 0.60246552 0.63279475 0.73057519]\n", + " [ 0.43390896 0.42074433 0.35448896 0.33266061 0.2610715 ]\n", + " [ 0.71089802 0.69798134 0.60334939 0.57049033 0.45389136]] \n", + "\n", + " **************************************** \n", + "\n", + "\n", + "w:\n", + " [[-2.30193491 1.1164206 2.13425249]] \n", + "\n", + "a:\n", + " [[ 0.49243345 0.50940386 0.60246552 0.63279475 0.73057519]\n", + " [ 0.43390896 0.42074433 0.35448896 0.33266061 0.2610715 ]\n", + " [ 0.71089802 0.69798134 0.60334939 0.57049033 0.45389136]] \n", + "\n", + "np.dot(w, a):\n", + " [[ 0.86811102 0.78678152 0.29662231 0.13230723 -0.42155217]] \n", + "\n", + "b:\n", + " [[-0.31920663]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.63388136 0.61480961 0.49435416 0.45341069 0.32283824]] \n", + "\n", + " **************************************** \n", + "\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 0.63388136, 0.61480961, 0.49435416, 0.45341069, 0.32283824]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ileribesleme(ornek_veri.T, W, b, goster = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 1, 0, 0, 0]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Ciktimiz\n", + "(ileribesleme(ornek_veri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True, True, True]], dtype=bool)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## sklearn ciktisi ile ayni sonucu urettik mi?\n", + "tahmin == (ileribesleme(ornek_veri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sifirdan Geri Yayilim Algoritmasi\n", + "\n", + "Bu calisma henuz tamamlanmadi. Ama vakit buldugumda ekteki baglantidaki calisma ile birlestirecegim. \n", + "\n", + "https://uzay00.github.io/kahve/dersler/yapayzeka/ders11/YSA.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rakamlar veri kümesi uzerinde calisma" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Etiket: 0\n" + ] + } + ], + "source": [ + "#Rakamlar veri kümesini yüklüyoruz.\n", + "from sklearn.datasets import load_digits\n", + "#Veri kümesini etiket değerleriyle birlikte yükleyelim.\n", + "X,y = load_digits(return_X_y=True)\n", + "\n", + "rakam1 = X[0]\n", + "rakam1 = np.reshape(rakam1, (8,8))\n", + "\n", + "plt.figure(figsize= (2,2))\n", + "plt.imshow(rakam1, cmap=\"gray_r\")\n", + "plt.show()\n", + "etiket1 = y[0]\n", + "print('Etiket: ' + str(etiket1))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(360, 64)\n", + "(360,)\n" + ] + } + ], + "source": [ + "# Bu veri kumesinden sadece 0 ve 1 rakamlarini secelim\n", + "X= X[y < 2]\n", + "y= y[y < 2]\n", + "\n", + "print(X.shape)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ogrenme kumesinin uzunlugu: 270\n", + "test kumesinin uzunlugu: 90\n", + "[[41 0]\n", + " [ 0 49]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "#################################################\n", + "# Datayi train ve test olark ayir\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", + "print(\"ogrenme kumesinin uzunlugu: \", len(X_train))\n", + "print(\"test kumesinin uzunlugu: \", len(X_test))\n", + "\n", + "#################################################\n", + "# Datayi normalize et \n", + "#. Standardize features by removing the mean and scaling to unit variance\n", + "#. Centering and scaling happen independently on each feature\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "#################################################\n", + "# yapay ogrenme\n", + "# Agin katmanlari 2 (girdi), 3(ara) , 1(cikti) \n", + " # SADECE ara katman degerlerini MLPClassifier'a veriyoruz\n", + " # sigmoid icin activation= 'logistic' seciyoruz\n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(3),max_iter=500)\n", + "mlp.fit(X_train,y_train)\n", + "\n", + "\n", + "#################################################\n", + "# tahminde bulun\n", + "predictions = mlp.predict(X_test)\n", + "# sonuclara bak\n", + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/YapayOgrenme.ipynb b/YapayOgrenme.ipynb new file mode 100644 index 0000000..0a9753e --- /dev/null +++ b/YapayOgrenme.ipynb @@ -0,0 +1,1540 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SCİKİT-LEARN\n", + "\n", + "Kaynak: http://www.veridefteri.com/2017/11/23/scikit-learn-ile-veri-analitigine-giris/\n", + "\n", + "## Sayi Siniflandirma" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Verinin boyutları (Gözlem, öznitelik) = (1797, 64)\n", + "Etiketlerin boyutları (Gözlem) = (1797,)\n" + ] + } + ], + "source": [ + "#Rakamlar veri kümesini yüklüyoruz.\n", + "from sklearn.datasets import load_digits\n", + "#numpy paketini yüklüyoruz.\n", + "import numpy as np\n", + "#Veri kümesini ikiye bölmek için kullanıyoruz.\n", + "from sklearn.model_selection import train_test_split\n", + "#Resimleri incelemek için matplotlib kullanıyoruz.\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#Veri kümesini etiket değerleriyle birlikte yükleyelim.\n", + "X,y = load_digits(return_X_y=True)\n", + "print('Verinin boyutları (Gözlem, öznitelik) = ' + str(np.shape(X)))\n", + "print('Etiketlerin boyutları (Gözlem) = ' + str(np.shape(y)))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Etiket: 0\n" + ] + } + ], + "source": [ + "rakam1 = X[0]\n", + "rakam1 = np.reshape(rakam1, (8,8))\n", + "\n", + "plt.figure(figsize= (2,2))\n", + "plt.imshow(rakam1, cmap=\"gray_r\")\n", + "plt.show()\n", + "etiket1 = y[0]\n", + "print('Etiket: ' + str(etiket1))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Verinin boyutları (Gözlem, öznitelik) = (357, 64)\n", + "Etiketlerin boyutları (Gözlem) = (357,)\n" + ] + } + ], + "source": [ + "#3 ve 8 rakamlarını seçmek için filtreleme kullanacağız.\n", + "#Filtrelemeyi etiket değerlerine (y) bakarak yapacağız. \n", + "#Etiket değeri beşe bölündüğünde kalan üç ise bu gözlemleri veri kümesinde bırakıyoruz.\n", + "X= X[y%5 == 3]\n", + "y= y[y%5 == 3]\n", + "\n", + "#Son olarak etiketleri 0 ve 1 değerlerine çevirelim.\n", + "#Rakam 3 ise etiket 0, 8 ise 1 olacak.\n", + "y = (y==8)*1\n", + "print('Verinin boyutları (Gözlem, öznitelik) = ' + str(np.shape(X)))\n", + "print('Etiketlerin boyutları (Gözlem) = ' + str(np.shape(y)))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Öğrenme verisinin boyutları (Gözlem, öznitelik) = (178, 64)\n", + "Sınama verisinin boyutları (Gözlem, öznitelik) = (179, 64)\n" + ] + } + ], + "source": [ + "#Stratify değeri veri kümesinin etiket yüzdelerini korumak için kullanılıyor.\n", + "#Öğrenme veri kümesini küçük tutarak sonuçların çok iyi olmasını engelliyoruz.\n", + "#random_state değeri sonuçların her seferinde aynı çıkmasını sağlamak için kullanılıyor.\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y, train_size = 0.5, test_size = 0.5, random_state = 0, stratify = y)\n", + "\n", + "print('Öğrenme verisinin boyutları (Gözlem, öznitelik) = ' + str(np.shape(X_train)))\n", + "print('Sınama verisinin boyutları (Gözlem, öznitelik) = ' + str(np.shape(X_test)))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#Karar ağaçları\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "#Rastgele orman\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "#Karar ağacı modelini oluşturalım. \n", + "#random_state değeri sayesinde sonuçların rassal olarak değişmemesini sağlıyoruz.\n", + "dt = DecisionTreeClassifier(random_state = 0)\n", + "\n", + "#Rastgele orman modelini oluşturalım.\n", + "rf = RandomForestClassifier(random_state = 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n", + " max_depth=None, max_features='auto', max_leaf_nodes=None,\n", + " min_impurity_decrease=0.0, min_impurity_split=None,\n", + " min_samples_leaf=1, min_samples_split=2,\n", + " min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n", + " oob_score=False, random_state=0, verbose=0, warm_start=False)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Modellerin öğrenmesini sağlayalım.\n", + "dt.fit(X_train,y_train)\n", + "rf.fit(X_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#Sınama verisinin etiketlerini elde edelim.\n", + "y_pred_dt = dt.predict(X_test)\n", + "#Sınama veri kümesinin sınıflara ait olma olasılıklarını alalım.\n", + "y_pred_proba_dt = dt.predict_proba(X_test)\n", + "\n", + "#Aynı adımları rastgele orman yöntemi için tekrarlayalım.\n", + "y_pred_rf = rf.predict(X_test)\n", + "y_pred_proba_rf = rf.predict_proba(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Karar ağacı isabetlilik değeri: 0.927374301676\n", + "Rastgele orman isabetlilik değeri: 0.960893854749\n", + "Karar ağacı eğri altı alan değeri: 0.928723138431\n", + "Rastgele orman eğri altı alan değeri: 0.997876061969\n" + ] + } + ], + "source": [ + "#Sonuçları değerlendirmek için aşağıdaki fonksiyonları kullanacağız.\n", + "from sklearn.metrics import roc_auc_score, accuracy_score\n", + "#İsabetlilik değeri için etiketlere ihtiyacımız var.\n", + "print('Karar ağacı isabetlilik değeri: ' + str(accuracy_score(y_pred_dt, y_test)))\n", + "print('Rastgele orman isabetlilik değeri: ' + str(accuracy_score(y_pred_rf, y_test)))\n", + "\n", + "#Eğri altı alan değeri için etiketlerin olasılıklarına ihtiyacımız var.\n", + "#Bu amaçla etiketlerin 1 değerinde olma yüzdelerini kullanacağız.\n", + "print('Karar ağacı eğri altı alan değeri: ' + str(roc_auc_score(y_test, y_pred_proba_dt[:,1])))\n", + "print('Rastgele orman eğri altı alan değeri: ' + str(roc_auc_score(y_test, y_pred_proba_rf[:,1])))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Kanser versinin neural network ile siniflandirilmasi" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.datasets import load_breast_cancer\n", + "cancer = load_breast_cancer()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(569, 30)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Print full description by running:\n", + "# print(cancer['DESCR'])\n", + "# 569 data points with 30 features\n", + "cancer['data'].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X = cancer['data']\n", + "y = cancer['target']\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StandardScaler(copy=True, with_mean=True, with_std=True)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Multi-Layer Perceptron Classifier model\n", + "from sklearn.neural_network import MLPClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mlp = MLPClassifier(hidden_layer_sizes=(30,30,30))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,\n", + " beta_2=0.999, early_stopping=False, epsilon=1e-08,\n", + " hidden_layer_sizes=(30, 30, 30), learning_rate='constant',\n", + " learning_rate_init=0.001, max_iter=200, momentum=0.9,\n", + " nesterovs_momentum=True, power_t=0.5, random_state=None,\n", + " shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,\n", + " verbose=False, warm_start=False)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mlp.fit(X_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "predictions = mlp.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[61 1]\n", + " [ 2 79]]\n" + ] + } + ], + "source": [ + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.97 0.98 0.98 62\n", + " 1 0.99 0.98 0.98 81\n", + "\n", + "avg / total 0.98 0.98 0.98 143\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_test,predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Neural Network Classifictaion for Wine dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "wine = pd.read_csv('wine_data.csv',names = [\"Cultivator\", \"Alchol\", \"Malic_Acid\", \"Ash\", \"Alcalinity_of_Ash\", \n", + " \"Magnesium\", \"Total_phenols\", \"Falvanoids\", \"Nonflavanoid_phenols\", \n", + " \"Proanthocyanins\", \"Color_intensity\", \"Hue\", \"OD280\", \"Proline\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CultivatorAlcholMalic_AcidAshAlcalinity_of_AshMagnesiumTotal_phenolsFalvanoidsNonflavanoid_phenolsProanthocyaninsColor_intensityHueOD280Proline
0114.231.712.4315.61272.803.060.282.295.641.043.921065
1113.201.782.1411.21002.652.760.261.284.381.053.401050
2113.162.362.6718.61012.803.240.302.815.681.033.171185
3114.371.952.5016.81133.853.490.242.187.800.863.451480
4113.242.592.8721.01182.802.690.391.824.321.042.93735
\n", + "
" + ], + "text/plain": [ + " Cultivator Alchol Malic_Acid Ash Alcalinity_of_Ash Magnesium \\\n", + "0 1 14.23 1.71 2.43 15.6 127 \n", + "1 1 13.20 1.78 2.14 11.2 100 \n", + "2 1 13.16 2.36 2.67 18.6 101 \n", + "3 1 14.37 1.95 2.50 16.8 113 \n", + "4 1 13.24 2.59 2.87 21.0 118 \n", + "\n", + " Total_phenols Falvanoids Nonflavanoid_phenols Proanthocyanins \\\n", + "0 2.80 3.06 0.28 2.29 \n", + "1 2.65 2.76 0.26 1.28 \n", + "2 2.80 3.24 0.30 2.81 \n", + "3 3.85 3.49 0.24 2.18 \n", + "4 2.80 2.69 0.39 1.82 \n", + "\n", + " Color_intensity Hue OD280 Proline \n", + "0 5.64 1.04 3.92 1065 \n", + "1 4.38 1.05 3.40 1050 \n", + "2 5.68 1.03 3.17 1185 \n", + "3 7.80 0.86 3.45 1480 \n", + "4 4.32 1.04 2.93 735 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wine.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countmeanstdmin25%50%75%max
Cultivator178.01.9382020.7750351.001.00002.0003.00003.00
Alchol178.013.0006180.81182711.0312.362513.05013.677514.83
Malic_Acid178.02.3363481.1171460.741.60251.8653.08255.80
Ash178.02.3665170.2743441.362.21002.3602.55753.23
Alcalinity_of_Ash178.019.4949443.33956410.6017.200019.50021.500030.00
Magnesium178.099.74157314.28248470.0088.000098.000107.0000162.00
Total_phenols178.02.2951120.6258510.981.74252.3552.80003.88
Falvanoids178.02.0292700.9988590.341.20502.1352.87505.08
Nonflavanoid_phenols178.00.3618540.1244530.130.27000.3400.43750.66
Proanthocyanins178.01.5908990.5723590.411.25001.5551.95003.58
Color_intensity178.05.0580902.3182861.283.22004.6906.200013.00
Hue178.00.9574490.2285720.480.78250.9651.12001.71
OD280178.02.6116850.7099901.271.93752.7803.17004.00
Proline178.0746.893258314.907474278.00500.5000673.500985.00001680.00
\n", + "
" + ], + "text/plain": [ + " count mean std min 25% \\\n", + "Cultivator 178.0 1.938202 0.775035 1.00 1.0000 \n", + "Alchol 178.0 13.000618 0.811827 11.03 12.3625 \n", + "Malic_Acid 178.0 2.336348 1.117146 0.74 1.6025 \n", + "Ash 178.0 2.366517 0.274344 1.36 2.2100 \n", + "Alcalinity_of_Ash 178.0 19.494944 3.339564 10.60 17.2000 \n", + "Magnesium 178.0 99.741573 14.282484 70.00 88.0000 \n", + "Total_phenols 178.0 2.295112 0.625851 0.98 1.7425 \n", + "Falvanoids 178.0 2.029270 0.998859 0.34 1.2050 \n", + "Nonflavanoid_phenols 178.0 0.361854 0.124453 0.13 0.2700 \n", + "Proanthocyanins 178.0 1.590899 0.572359 0.41 1.2500 \n", + "Color_intensity 178.0 5.058090 2.318286 1.28 3.2200 \n", + "Hue 178.0 0.957449 0.228572 0.48 0.7825 \n", + "OD280 178.0 2.611685 0.709990 1.27 1.9375 \n", + "Proline 178.0 746.893258 314.907474 278.00 500.5000 \n", + "\n", + " 50% 75% max \n", + "Cultivator 2.000 3.0000 3.00 \n", + "Alchol 13.050 13.6775 14.83 \n", + "Malic_Acid 1.865 3.0825 5.80 \n", + "Ash 2.360 2.5575 3.23 \n", + "Alcalinity_of_Ash 19.500 21.5000 30.00 \n", + "Magnesium 98.000 107.0000 162.00 \n", + "Total_phenols 2.355 2.8000 3.88 \n", + "Falvanoids 2.135 2.8750 5.08 \n", + "Nonflavanoid_phenols 0.340 0.4375 0.66 \n", + "Proanthocyanins 1.555 1.9500 3.58 \n", + "Color_intensity 4.690 6.2000 13.00 \n", + "Hue 0.965 1.1200 1.71 \n", + "OD280 2.780 3.1700 4.00 \n", + "Proline 673.500 985.0000 1680.00 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wine.describe().transpose()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(178, 14)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 178 data points with 13 features and 1 label column\n", + "wine.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X = wine.drop('Cultivator',axis=1)\n", + "y = wine['Cultivator']" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Processing - Normalize your data\n", + "\n", + "Kaynak: https://www.springboard.com/blog/beginners-guide-neural-network-in-python-scikit-learn-0-18/\n", + "\n", + "> The neural network in Python may have difficulty converging before the maximum number of iterations allowed if the data is not normalized. Multi-layer Perceptron is sensitive to feature scaling, so it is highly recommended to scale your data. Note that you must apply the same scaling to the test set for meaningful results. There are a lot of different methods for normalization of data, we will use the built-in StandardScaler for standardization." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "MLPClassifier(activation='logistic', alpha=0.0001, batch_size='auto',\n", + " beta_1=0.9, beta_2=0.999, early_stopping=False, epsilon=1e-08,\n", + " hidden_layer_sizes=(13, 13, 13), learning_rate='constant',\n", + " learning_rate_init=0.001, max_iter=500, momentum=0.9,\n", + " nesterovs_momentum=True, power_t=0.5, random_state=None,\n", + " shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,\n", + " verbose=False, warm_start=False)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(13,13,13),max_iter=500)\n", + "mlp.fit(X_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# help(MLPClassifier)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "predictions = mlp.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[13 0 0]\n", + " [ 0 17 1]\n", + " [ 0 0 14]]\n" + ] + } + ], + "source": [ + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 1 1.00 1.00 1.00 13\n", + " 2 1.00 0.94 0.97 18\n", + " 3 0.93 1.00 0.97 14\n", + "\n", + "avg / total 0.98 0.98 0.98 45\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_test,predictions))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Toydata ile Calisma\n", + "\n", + "Datayi biz uretelim.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# help(np.random.randint)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9 6]\n", + " [1 7]\n", + " [1 2]\n", + " [3 8]\n", + " [3 1]]\n", + "[1 0 0 0 1]\n" + ] + } + ], + "source": [ + "# 1 ile 10 arasinda 1000 adet x1 ve x2\n", + "X = np.random.randint(10, size=(1000,2))\n", + "print(X[1:6,])\n", + "\n", + "# ilk kolon ikinci kolondan buyukse, y=1\n", + "y = (X[:,0] > X[:,1]) * 1\n", + "print(y[1:6,])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py:444: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", + " warnings.warn(msg, DataConversionWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[143 0]\n", + " [ 0 107]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", + " % self.max_iter, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "# Datayi train ve test olarka ayir\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", + "\n", + "\n", + "# Datayi normalize et \n", + "#. Standardize features by removing the mean and scaling to unit variance\n", + "#. Centering and scaling happen independently on each feature\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "\n", + "# Fit only to the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Now apply the transformations to the data:\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "# yapay ogrenme\n", + "# Agin katmanlari 2 (girdi), 3(hidden) , 1(cikti) \n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp = MLPClassifier(activation= 'logistic', hidden_layer_sizes=(3),max_iter=500)\n", + "mlp.fit(X_train,y_train)\n", + "\n", + "# tahminde bulun\n", + "predictions = mlp.predict(X_test)\n", + "\n", + "# sonuclara bak\n", + "from sklearn.metrics import classification_report,confusion_matrix\n", + "print(confusion_matrix(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(mlp.coefs_)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[-1.85329083, 2.25030248, 1.92014942],\n", + " [ 1.78952733, -2.14003606, -2.17519586]]), array([[-2.13786945],\n", + " [ 1.80187154],\n", + " [ 1.55998736]])]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mlp.coefs_" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "W, b = [], []\n", + "for c, i in zip(mlp.coefs_, mlp.intercepts_):\n", + " W.append(c.T)\n", + " b.append(i.reshape((len(i), 1)))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[-1.85329083 1.78952733]\n", + " [ 2.25030248 -2.14003606]\n", + " [ 1.92014942 -2.17519586]] \n", + "\n", + "[[-2.13786945 1.80187154 1.55998736]] \n", + "\n", + "bias :\n", + "[[ 0.38466407]\n", + " [-0.44912673]\n", + " [-0.42560835]] \n", + "\n", + "[[-0.65571131]] \n", + "\n" + ] + } + ], + "source": [ + "# Agirliklar (girdi-ara) 3x2 matris\n", + "# Agirliklar (ara-cikti) 1x3 matris\n", + "print(\"agirlik :\")\n", + "for w in W:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for bb in b:\n", + " print(bb, \"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1.55070707 -1.24873511]\n", + " [ 1.20186775 -1.24873511]\n", + " [ 0.5041891 0.18604288]\n", + " [ 0.15534978 0.54473738]\n", + " [-1.24000751 1.62082086]]\n", + "Tahmin: \n", + " [1 1 1 0 0]\n" + ] + } + ], + "source": [ + "# help(StandardScaler)\n", + "veri = [[9, 1],\n", + " [8,1],\n", + " [6,5],\n", + " [5,6],\n", + " [1,9]]\n", + "normalizeVeri = scaler.transform(veri)\n", + "print(normalizeVeri)\n", + "\n", + "tahmin = mlp.predict(normalizeVeri)\n", + "print(\"Tahmin: \\n\", tahmin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Elle deneme\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#### Yardimci Fonksiyonlar\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "def sigmoid_turevi(z):\n", + " return sigmoid(z)*(1-sigmoid(z))\n", + "\n", + "def ileribesleme(a, agirlik, bias, goster = False):\n", + " \"\"\"Katman katman yeni a degerleri hesaplaniyor\n", + " Girdinin transpozu (satirlar ozellik, sutunlar gozlem) a olarak verilmeli. \n", + " \"\"\"\n", + " for w, b in zip(agirlik, bias):\n", + " if goster:\n", + " print(\"w:\\n\", w, \"\\n\")\n", + " print(\"a:\\n\", a, \"\\n\")\n", + " print(\"np.dot(w, a):\\n\", np.dot(w, a), \"\\n\")\n", + " print(\"b:\\n\", b, \"\\n\")\n", + " print(\"a = sigmoid(np.dot(w, a)+b):\\n\", sigmoid(np.dot(w, a)+b), \"\\n\\n\\n\")\n", + " z = np.dot(w, a)+b\n", + " a = sigmoid(z) \n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w:\n", + " [[-1.85329083 1.78952733]\n", + " [ 2.25030248 -2.14003606]\n", + " [ 1.92014942 -2.17519586]] \n", + "\n", + "a:\n", + " [[ 1.55070707 1.20186775 0.5041891 0.15534978 -1.24000751]\n", + " [-1.24873511 -1.24873511 0.18604288 0.54473738 1.62082086]] \n", + "\n", + "np.dot(w, a):\n", + " [[-5.10855679 -4.46205607 -0.60148022 0.6869141 5.19859778]\n", + " [ 6.16189812 5.37690412 0.73643951 -0.81617364 -6.25900707]\n", + " [ 5.69383272 5.0240091 0.56343871 -0.8866157 -5.90660255]] \n", + "\n", + "b:\n", + " [[ 0.38466407]\n", + " [-0.44912673]\n", + " [-0.42560835]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.00880237 0.01666905 0.44600731 0.74489692 0.99625381]\n", + " [ 0.99670737 0.99280949 0.57133813 0.22006281 0.00121945]\n", + " [ 0.99487366 0.99003243 0.53440314 0.21211492 0.00177494]] \n", + "\n", + "\n", + "\n", + "w:\n", + " [[-2.13786945 1.80187154 1.55998736]] \n", + "\n", + "a:\n", + " [[ 0.00880237 0.01666905 0.44600731 0.74489692 0.99625381]\n", + " [ 0.99670737 0.99280949 0.57133813 0.22006281 0.00121945]\n", + " [ 0.99487366 0.99003243 0.53440314 0.21211492 0.00177494]] \n", + "\n", + "np.dot(w, a):\n", + " [[ 3.32911066 3.29771699 0.90963466 -0.86507087 -2.12489439]] \n", + "\n", + "b:\n", + " [[-0.65571131]] \n", + "\n", + "a = sigmoid(np.dot(w, a)+b):\n", + " [[ 0.93543863 0.93351655 0.56314193 0.17934637 0.05838125]] \n", + "\n", + "\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 0.93543863, 0.93351655, 0.56314193, 0.17934637, 0.05838125]])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ileribesleme(normalizeVeri.T, W, b, goster = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 1, 1, 0, 0]])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(ileribesleme(normalizeVeri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True, True, True]], dtype=bool)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tahmin == (ileribesleme(normalizeVeri.T, W, b) > 0.5) * 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## YSA sifirdan yazalim" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "agirlik :\n", + "[[ 1.37046534 0.27524598]\n", + " [-0.36455967 1.18753378]\n", + " [-1.98587646 -1.37998052]] \n", + "\n", + "[[-0.27087958 0.16222539 -0.92883621]] \n", + "\n", + "bias :\n", + "[[ 0.92512981]\n", + " [-0.08426793]\n", + " [ 0.22534963]] \n", + "\n", + "[[ 0.05232191]] \n", + "\n" + ] + } + ], + "source": [ + "def ag(katmanlar):\n", + " b = [np.random.randn(k, 1) for k in katmanlar[1:]] # bias degerleri (ilk katman haric)\n", + " W = [np.random.randn(k2, k1) for k1, k2 in zip(katmanlar[:-1],katmanlar[1:])]\n", + " return W, b\n", + "\n", + "katmanlar = [2, 3, 1]\n", + "agirlik, bias = ag(katmanlar)\n", + "\n", + "print(\"agirlik :\")\n", + "for w in agirlik:\n", + " print(w, \"\\n\")\n", + " \n", + "print(\"bias :\")\n", + "for b in bias:\n", + " print(b, \"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.39866315, 0.3688293 , 0.41575316, 0.41584206, 0.3819714 ]])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ileribesleme(normalizeVeri.T, agirlik, bias)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[False, False, False, True, True]], dtype=bool)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tahmin == (ileribesleme(normalizeVeri.T, agirlik, bias) > 0.5) * 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/back1.JPG b/back1.JPG new file mode 100644 index 0000000..30822fe Binary files /dev/null and b/back1.JPG differ diff --git a/back2.JPG b/back2.JPG new file mode 100644 index 0000000..75516d0 Binary files /dev/null and b/back2.JPG differ diff --git a/back3.JPG b/back3.JPG new file mode 100644 index 0000000..8f5aba1 Binary files /dev/null and b/back3.JPG differ diff --git a/network.jpg b/network.jpg new file mode 100644 index 0000000..d4a87eb Binary files /dev/null and b/network.jpg differ diff --git a/network.pdf b/network.pdf new file mode 100644 index 0000000..c34bcec Binary files /dev/null and b/network.pdf differ diff --git a/network.xml b/network.xml new file mode 100644 index 0000000..57fa3ec --- /dev/null +++ b/network.xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/noronislem.JPG b/noronislem.JPG new file mode 100644 index 0000000..4e2d2e9 Binary files /dev/null and b/noronislem.JPG differ diff --git a/vektorize.JPG b/vektorize.JPG new file mode 100644 index 0000000..20a51d5 Binary files /dev/null and b/vektorize.JPG differ diff --git a/wine_data.csv b/wine_data.csv new file mode 100644 index 0000000..a0b3962 --- /dev/null +++ b/wine_data.csv @@ -0,0 +1,178 @@ +1,14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065 +1,13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050 +1,13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185 +1,14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480 +1,13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735 +1,14.2,1.76,2.45,15.2,112,3.27,3.39,.34,1.97,6.75,1.05,2.85,1450 +1,14.39,1.87,2.45,14.6,96,2.5,2.52,.3,1.98,5.25,1.02,3.58,1290 +1,14.06,2.15,2.61,17.6,121,2.6,2.51,.31,1.25,5.05,1.06,3.58,1295 +1,14.83,1.64,2.17,14,97,2.8,2.98,.29,1.98,5.2,1.08,2.85,1045 +1,13.86,1.35,2.27,16,98,2.98,3.15,.22,1.85,7.22,1.01,3.55,1045 +1,14.1,2.16,2.3,18,105,2.95,3.32,.22,2.38,5.75,1.25,3.17,1510 +1,14.12,1.48,2.32,16.8,95,2.2,2.43,.26,1.57,5,1.17,2.82,1280 +1,13.75,1.73,2.41,16,89,2.6,2.76,.29,1.81,5.6,1.15,2.9,1320 +1,14.75,1.73,2.39,11.4,91,3.1,3.69,.43,2.81,5.4,1.25,2.73,1150 +1,14.38,1.87,2.38,12,102,3.3,3.64,.29,2.96,7.5,1.2,3,1547 +1,13.63,1.81,2.7,17.2,112,2.85,2.91,.3,1.46,7.3,1.28,2.88,1310 +1,14.3,1.92,2.72,20,120,2.8,3.14,.33,1.97,6.2,1.07,2.65,1280 +1,13.83,1.57,2.62,20,115,2.95,3.4,.4,1.72,6.6,1.13,2.57,1130 +1,14.19,1.59,2.48,16.5,108,3.3,3.93,.32,1.86,8.7,1.23,2.82,1680 +1,13.64,3.1,2.56,15.2,116,2.7,3.03,.17,1.66,5.1,.96,3.36,845 +1,14.06,1.63,2.28,16,126,3,3.17,.24,2.1,5.65,1.09,3.71,780 +1,12.93,3.8,2.65,18.6,102,2.41,2.41,.25,1.98,4.5,1.03,3.52,770 +1,13.71,1.86,2.36,16.6,101,2.61,2.88,.27,1.69,3.8,1.11,4,1035 +1,12.85,1.6,2.52,17.8,95,2.48,2.37,.26,1.46,3.93,1.09,3.63,1015 +1,13.5,1.81,2.61,20,96,2.53,2.61,.28,1.66,3.52,1.12,3.82,845 +1,13.05,2.05,3.22,25,124,2.63,2.68,.47,1.92,3.58,1.13,3.2,830 +1,13.39,1.77,2.62,16.1,93,2.85,2.94,.34,1.45,4.8,.92,3.22,1195 +1,13.3,1.72,2.14,17,94,2.4,2.19,.27,1.35,3.95,1.02,2.77,1285 +1,13.87,1.9,2.8,19.4,107,2.95,2.97,.37,1.76,4.5,1.25,3.4,915 +1,14.02,1.68,2.21,16,96,2.65,2.33,.26,1.98,4.7,1.04,3.59,1035 +1,13.73,1.5,2.7,22.5,101,3,3.25,.29,2.38,5.7,1.19,2.71,1285 +1,13.58,1.66,2.36,19.1,106,2.86,3.19,.22,1.95,6.9,1.09,2.88,1515 +1,13.68,1.83,2.36,17.2,104,2.42,2.69,.42,1.97,3.84,1.23,2.87,990 +1,13.76,1.53,2.7,19.5,132,2.95,2.74,.5,1.35,5.4,1.25,3,1235 +1,13.51,1.8,2.65,19,110,2.35,2.53,.29,1.54,4.2,1.1,2.87,1095 +1,13.48,1.81,2.41,20.5,100,2.7,2.98,.26,1.86,5.1,1.04,3.47,920 +1,13.28,1.64,2.84,15.5,110,2.6,2.68,.34,1.36,4.6,1.09,2.78,880 +1,13.05,1.65,2.55,18,98,2.45,2.43,.29,1.44,4.25,1.12,2.51,1105 +1,13.07,1.5,2.1,15.5,98,2.4,2.64,.28,1.37,3.7,1.18,2.69,1020 +1,14.22,3.99,2.51,13.2,128,3,3.04,.2,2.08,5.1,.89,3.53,760 +1,13.56,1.71,2.31,16.2,117,3.15,3.29,.34,2.34,6.13,.95,3.38,795 +1,13.41,3.84,2.12,18.8,90,2.45,2.68,.27,1.48,4.28,.91,3,1035 +1,13.88,1.89,2.59,15,101,3.25,3.56,.17,1.7,5.43,.88,3.56,1095 +1,13.24,3.98,2.29,17.5,103,2.64,2.63,.32,1.66,4.36,.82,3,680 +1,13.05,1.77,2.1,17,107,3,3,.28,2.03,5.04,.88,3.35,885 +1,14.21,4.04,2.44,18.9,111,2.85,2.65,.3,1.25,5.24,.87,3.33,1080 +1,14.38,3.59,2.28,16,102,3.25,3.17,.27,2.19,4.9,1.04,3.44,1065 +1,13.9,1.68,2.12,16,101,3.1,3.39,.21,2.14,6.1,.91,3.33,985 +1,14.1,2.02,2.4,18.8,103,2.75,2.92,.32,2.38,6.2,1.07,2.75,1060 +1,13.94,1.73,2.27,17.4,108,2.88,3.54,.32,2.08,8.90,1.12,3.1,1260 +1,13.05,1.73,2.04,12.4,92,2.72,3.27,.17,2.91,7.2,1.12,2.91,1150 +1,13.83,1.65,2.6,17.2,94,2.45,2.99,.22,2.29,5.6,1.24,3.37,1265 +1,13.82,1.75,2.42,14,111,3.88,3.74,.32,1.87,7.05,1.01,3.26,1190 +1,13.77,1.9,2.68,17.1,115,3,2.79,.39,1.68,6.3,1.13,2.93,1375 +1,13.74,1.67,2.25,16.4,118,2.6,2.9,.21,1.62,5.85,.92,3.2,1060 +1,13.56,1.73,2.46,20.5,116,2.96,2.78,.2,2.45,6.25,.98,3.03,1120 +1,14.22,1.7,2.3,16.3,118,3.2,3,.26,2.03,6.38,.94,3.31,970 +1,13.29,1.97,2.68,16.8,102,3,3.23,.31,1.66,6,1.07,2.84,1270 +1,13.72,1.43,2.5,16.7,108,3.4,3.67,.19,2.04,6.8,.89,2.87,1285 +2,12.37,.94,1.36,10.6,88,1.98,.57,.28,.42,1.95,1.05,1.82,520 +2,12.33,1.1,2.28,16,101,2.05,1.09,.63,.41,3.27,1.25,1.67,680 +2,12.64,1.36,2.02,16.8,100,2.02,1.41,.53,.62,5.75,.98,1.59,450 +2,13.67,1.25,1.92,18,94,2.1,1.79,.32,.73,3.8,1.23,2.46,630 +2,12.37,1.13,2.16,19,87,3.5,3.1,.19,1.87,4.45,1.22,2.87,420 +2,12.17,1.45,2.53,19,104,1.89,1.75,.45,1.03,2.95,1.45,2.23,355 +2,12.37,1.21,2.56,18.1,98,2.42,2.65,.37,2.08,4.6,1.19,2.3,678 +2,13.11,1.01,1.7,15,78,2.98,3.18,.26,2.28,5.3,1.12,3.18,502 +2,12.37,1.17,1.92,19.6,78,2.11,2,.27,1.04,4.68,1.12,3.48,510 +2,13.34,.94,2.36,17,110,2.53,1.3,.55,.42,3.17,1.02,1.93,750 +2,12.21,1.19,1.75,16.8,151,1.85,1.28,.14,2.5,2.85,1.28,3.07,718 +2,12.29,1.61,2.21,20.4,103,1.1,1.02,.37,1.46,3.05,.906,1.82,870 +2,13.86,1.51,2.67,25,86,2.95,2.86,.21,1.87,3.38,1.36,3.16,410 +2,13.49,1.66,2.24,24,87,1.88,1.84,.27,1.03,3.74,.98,2.78,472 +2,12.99,1.67,2.6,30,139,3.3,2.89,.21,1.96,3.35,1.31,3.5,985 +2,11.96,1.09,2.3,21,101,3.38,2.14,.13,1.65,3.21,.99,3.13,886 +2,11.66,1.88,1.92,16,97,1.61,1.57,.34,1.15,3.8,1.23,2.14,428 +2,13.03,.9,1.71,16,86,1.95,2.03,.24,1.46,4.6,1.19,2.48,392 +2,11.84,2.89,2.23,18,112,1.72,1.32,.43,.95,2.65,.96,2.52,500 +2,12.33,.99,1.95,14.8,136,1.9,1.85,.35,2.76,3.4,1.06,2.31,750 +2,12.7,3.87,2.4,23,101,2.83,2.55,.43,1.95,2.57,1.19,3.13,463 +2,12,.92,2,19,86,2.42,2.26,.3,1.43,2.5,1.38,3.12,278 +2,12.72,1.81,2.2,18.8,86,2.2,2.53,.26,1.77,3.9,1.16,3.14,714 +2,12.08,1.13,2.51,24,78,2,1.58,.4,1.4,2.2,1.31,2.72,630 +2,13.05,3.86,2.32,22.5,85,1.65,1.59,.61,1.62,4.8,.84,2.01,515 +2,11.84,.89,2.58,18,94,2.2,2.21,.22,2.35,3.05,.79,3.08,520 +2,12.67,.98,2.24,18,99,2.2,1.94,.3,1.46,2.62,1.23,3.16,450 +2,12.16,1.61,2.31,22.8,90,1.78,1.69,.43,1.56,2.45,1.33,2.26,495 +2,11.65,1.67,2.62,26,88,1.92,1.61,.4,1.34,2.6,1.36,3.21,562 +2,11.64,2.06,2.46,21.6,84,1.95,1.69,.48,1.35,2.8,1,2.75,680 +2,12.08,1.33,2.3,23.6,70,2.2,1.59,.42,1.38,1.74,1.07,3.21,625 +2,12.08,1.83,2.32,18.5,81,1.6,1.5,.52,1.64,2.4,1.08,2.27,480 +2,12,1.51,2.42,22,86,1.45,1.25,.5,1.63,3.6,1.05,2.65,450 +2,12.69,1.53,2.26,20.7,80,1.38,1.46,.58,1.62,3.05,.96,2.06,495 +2,12.29,2.83,2.22,18,88,2.45,2.25,.25,1.99,2.15,1.15,3.3,290 +2,11.62,1.99,2.28,18,98,3.02,2.26,.17,1.35,3.25,1.16,2.96,345 +2,12.47,1.52,2.2,19,162,2.5,2.27,.32,3.28,2.6,1.16,2.63,937 +2,11.81,2.12,2.74,21.5,134,1.6,.99,.14,1.56,2.5,.95,2.26,625 +2,12.29,1.41,1.98,16,85,2.55,2.5,.29,1.77,2.9,1.23,2.74,428 +2,12.37,1.07,2.1,18.5,88,3.52,3.75,.24,1.95,4.5,1.04,2.77,660 +2,12.29,3.17,2.21,18,88,2.85,2.99,.45,2.81,2.3,1.42,2.83,406 +2,12.08,2.08,1.7,17.5,97,2.23,2.17,.26,1.4,3.3,1.27,2.96,710 +2,12.6,1.34,1.9,18.5,88,1.45,1.36,.29,1.35,2.45,1.04,2.77,562 +2,12.34,2.45,2.46,21,98,2.56,2.11,.34,1.31,2.8,.8,3.38,438 +2,11.82,1.72,1.88,19.5,86,2.5,1.64,.37,1.42,2.06,.94,2.44,415 +2,12.51,1.73,1.98,20.5,85,2.2,1.92,.32,1.48,2.94,1.04,3.57,672 +2,12.42,2.55,2.27,22,90,1.68,1.84,.66,1.42,2.7,.86,3.3,315 +2,12.25,1.73,2.12,19,80,1.65,2.03,.37,1.63,3.4,1,3.17,510 +2,12.72,1.75,2.28,22.5,84,1.38,1.76,.48,1.63,3.3,.88,2.42,488 +2,12.22,1.29,1.94,19,92,2.36,2.04,.39,2.08,2.7,.86,3.02,312 +2,11.61,1.35,2.7,20,94,2.74,2.92,.29,2.49,2.65,.96,3.26,680 +2,11.46,3.74,1.82,19.5,107,3.18,2.58,.24,3.58,2.9,.75,2.81,562 +2,12.52,2.43,2.17,21,88,2.55,2.27,.26,1.22,2,.9,2.78,325 +2,11.76,2.68,2.92,20,103,1.75,2.03,.6,1.05,3.8,1.23,2.5,607 +2,11.41,.74,2.5,21,88,2.48,2.01,.42,1.44,3.08,1.1,2.31,434 +2,12.08,1.39,2.5,22.5,84,2.56,2.29,.43,1.04,2.9,.93,3.19,385 +2,11.03,1.51,2.2,21.5,85,2.46,2.17,.52,2.01,1.9,1.71,2.87,407 +2,11.82,1.47,1.99,20.8,86,1.98,1.6,.3,1.53,1.95,.95,3.33,495 +2,12.42,1.61,2.19,22.5,108,2,2.09,.34,1.61,2.06,1.06,2.96,345 +2,12.77,3.43,1.98,16,80,1.63,1.25,.43,.83,3.4,.7,2.12,372 +2,12,3.43,2,19,87,2,1.64,.37,1.87,1.28,.93,3.05,564 +2,11.45,2.4,2.42,20,96,2.9,2.79,.32,1.83,3.25,.8,3.39,625 +2,11.56,2.05,3.23,28.5,119,3.18,5.08,.47,1.87,6,.93,3.69,465 +2,12.42,4.43,2.73,26.5,102,2.2,2.13,.43,1.71,2.08,.92,3.12,365 +2,13.05,5.8,2.13,21.5,86,2.62,2.65,.3,2.01,2.6,.73,3.1,380 +2,11.87,4.31,2.39,21,82,2.86,3.03,.21,2.91,2.8,.75,3.64,380 +2,12.07,2.16,2.17,21,85,2.6,2.65,.37,1.35,2.76,.86,3.28,378 +2,12.43,1.53,2.29,21.5,86,2.74,3.15,.39,1.77,3.94,.69,2.84,352 +2,11.79,2.13,2.78,28.5,92,2.13,2.24,.58,1.76,3,.97,2.44,466 +2,12.37,1.63,2.3,24.5,88,2.22,2.45,.4,1.9,2.12,.89,2.78,342 +2,12.04,4.3,2.38,22,80,2.1,1.75,.42,1.35,2.6,.79,2.57,580 +3,12.86,1.35,2.32,18,122,1.51,1.25,.21,.94,4.1,.76,1.29,630 +3,12.88,2.99,2.4,20,104,1.3,1.22,.24,.83,5.4,.74,1.42,530 +3,12.81,2.31,2.4,24,98,1.15,1.09,.27,.83,5.7,.66,1.36,560 +3,12.7,3.55,2.36,21.5,106,1.7,1.2,.17,.84,5,.78,1.29,600 +3,12.51,1.24,2.25,17.5,85,2,.58,.6,1.25,5.45,.75,1.51,650 +3,12.6,2.46,2.2,18.5,94,1.62,.66,.63,.94,7.1,.73,1.58,695 +3,12.25,4.72,2.54,21,89,1.38,.47,.53,.8,3.85,.75,1.27,720 +3,12.53,5.51,2.64,25,96,1.79,.6,.63,1.1,5,.82,1.69,515 +3,13.49,3.59,2.19,19.5,88,1.62,.48,.58,.88,5.7,.81,1.82,580 +3,12.84,2.96,2.61,24,101,2.32,.6,.53,.81,4.92,.89,2.15,590 +3,12.93,2.81,2.7,21,96,1.54,.5,.53,.75,4.6,.77,2.31,600 +3,13.36,2.56,2.35,20,89,1.4,.5,.37,.64,5.6,.7,2.47,780 +3,13.52,3.17,2.72,23.5,97,1.55,.52,.5,.55,4.35,.89,2.06,520 +3,13.62,4.95,2.35,20,92,2,.8,.47,1.02,4.4,.91,2.05,550 +3,12.25,3.88,2.2,18.5,112,1.38,.78,.29,1.14,8.21,.65,2,855 +3,13.16,3.57,2.15,21,102,1.5,.55,.43,1.3,4,.6,1.68,830 +3,13.88,5.04,2.23,20,80,.98,.34,.4,.68,4.9,.58,1.33,415 +3,12.87,4.61,2.48,21.5,86,1.7,.65,.47,.86,7.65,.54,1.86,625 +3,13.32,3.24,2.38,21.5,92,1.93,.76,.45,1.25,8.42,.55,1.62,650 +3,13.08,3.9,2.36,21.5,113,1.41,1.39,.34,1.14,9.40,.57,1.33,550 +3,13.5,3.12,2.62,24,123,1.4,1.57,.22,1.25,8.60,.59,1.3,500 +3,12.79,2.67,2.48,22,112,1.48,1.36,.24,1.26,10.8,.48,1.47,480 +3,13.11,1.9,2.75,25.5,116,2.2,1.28,.26,1.56,7.1,.61,1.33,425 +3,13.23,3.3,2.28,18.5,98,1.8,.83,.61,1.87,10.52,.56,1.51,675 +3,12.58,1.29,2.1,20,103,1.48,.58,.53,1.4,7.6,.58,1.55,640 +3,13.17,5.19,2.32,22,93,1.74,.63,.61,1.55,7.9,.6,1.48,725 +3,13.84,4.12,2.38,19.5,89,1.8,.83,.48,1.56,9.01,.57,1.64,480 +3,12.45,3.03,2.64,27,97,1.9,.58,.63,1.14,7.5,.67,1.73,880 +3,14.34,1.68,2.7,25,98,2.8,1.31,.53,2.7,13,.57,1.96,660 +3,13.48,1.67,2.64,22.5,89,2.6,1.1,.52,2.29,11.75,.57,1.78,620 +3,12.36,3.83,2.38,21,88,2.3,.92,.5,1.04,7.65,.56,1.58,520 +3,13.69,3.26,2.54,20,107,1.83,.56,.5,.8,5.88,.96,1.82,680 +3,12.85,3.27,2.58,22,106,1.65,.6,.6,.96,5.58,.87,2.11,570 +3,12.96,3.45,2.35,18.5,106,1.39,.7,.4,.94,5.28,.68,1.75,675 +3,13.78,2.76,2.3,22,90,1.35,.68,.41,1.03,9.58,.7,1.68,615 +3,13.73,4.36,2.26,22.5,88,1.28,.47,.52,1.15,6.62,.78,1.75,520 +3,13.45,3.7,2.6,23,111,1.7,.92,.43,1.46,10.68,.85,1.56,695 +3,12.82,3.37,2.3,19.5,88,1.48,.66,.4,.97,10.26,.72,1.75,685 +3,13.58,2.58,2.69,24.5,105,1.55,.84,.39,1.54,8.66,.74,1.8,750 +3,13.4,4.6,2.86,25,112,1.98,.96,.27,1.11,8.5,.67,1.92,630 +3,12.2,3.03,2.32,19,96,1.25,.49,.4,.73,5.5,.66,1.83,510 +3,12.77,2.39,2.28,19.5,86,1.39,.51,.48,.64,9.899999,.57,1.63,470 +3,14.16,2.51,2.48,20,91,1.68,.7,.44,1.24,9.7,.62,1.71,660 +3,13.71,5.65,2.45,20.5,95,1.68,.61,.52,1.06,7.7,.64,1.74,740 +3,13.4,3.91,2.48,23,102,1.8,.75,.43,1.41,7.3,.7,1.56,750 +3,13.27,4.28,2.26,20,120,1.59,.69,.43,1.35,10.2,.59,1.56,835 +3,13.17,2.59,2.37,20,120,1.65,.68,.53,1.46,9.3,.6,1.62,840 +3,14.13,4.1,2.74,24.5,96,2.05,.76,.56,1.35,9.2,.61,1.6,560