Created
March 5, 2026 20:15
-
-
Save MuhammetOzturk/74fd1fd5ce5cd50582f203354d4ef09d to your computer and use it in GitHub Desktop.
Yapay-Sinir-Agina-Giris .ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "provenance": [], | |
| "authorship_tag": "ABX9TyOploscDIIABMM7FI7vTG4j", | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| }, | |
| "language_info": { | |
| "name": "python" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/MuhammetOzturk/74fd1fd5ce5cd50582f203354d4ef09d/yapay-sinir-agina-giris.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Biyolojik Sinir Hucresi\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "### Sinir İletiminde Sinyal Gönderimi\n", | |
| "\n", | |
| "Biyolojik sinir hücreleri (nöronlar), vücudumuzdaki bilgiyi elektrik ve kimyasal sinyaller aracılığıyla ileten temel birimlerdir. Bu süreç genellikle aşağıdaki adımları içerir:\n", | |
| "\n", | |
| "1. **Dendritler ve Hücre Gövdesi (Soma):** Nöron, dendritler ve hücre gövdesi aracılığıyla diğer nöronlardan veya duyusal hücrelerden sinyalleri alır. Bu sinyaller genellikle kimyasaldır ve nöron zarında elektriksel değişikliklere neden olur.\n", | |
| "\n", | |
| "2. **Aksiyon Potansiyeli Oluşumu (Eşik Değeri):** Gelen sinyallerin toplamı, nöronun belirli bir eşik değerine ulaşmasına neden olursa, hücre gövdesinde bir elektrik darbesi olan aksiyon potansiyeli oluşur. Bu, sinyalin iletilmeye hazır olduğunu gösterir.\n", | |
| "\n", | |
| "3. **Akson Boyunca İletim:** Aksiyon potansiyeli, nöronun uzun uzantısı olan akson boyunca hızla ilerler. Akson genellikle miyelin kılıf adı verilen yalıtkan bir tabaka ile kaplıdır, bu da sinyalin daha hızlı iletilmesini sağlar.\n", | |
| "\n", | |
| "4. **Akson Ucu ve Sinaptik Boşluk:** Aksiyon potansiyeli akson ucuna ulaştığında, nörotransmiter adı verilen kimyasal haberciler sinaptik boşluğa (nöronlar arasındaki küçük boşluk) salınır.\n", | |
| "\n", | |
| "5. **Sinyalin Alıcı Nörona Aktarımı:** Sinaptik boşluktaki nörotransmiterler, alıcı nöronun dendritleri veya hücre gövdesindeki özel reseptörlere bağlanır. Bu bağlanma, alıcı nöronun zarında yeni bir elektriksel değişiklik başlatır ve sinyal iletim döngüsü devam eder.\n", | |
| "\n", | |
| "Bu karmaşık süreç, düşüncelerimizden hareketlerimize kadar vücudumuzdaki her türlü işlevin temelini oluşturur.\n" | |
| ], | |
| "metadata": { | |
| "id": "GWy7dux5-IiW" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Kendime Not\n", | |
| "\n", | |
| "### Sigmoid Turev\n", | |
| "$$\n", | |
| "\\begin{align}\n", | |
| "\\dfrac{d}{dx} \\sigma(x) &= \\dfrac{d}{dx} \\left[ \\dfrac{1}{1 + e^{-x}} \\right] \\\\\n", | |
| "&= \\dfrac{d}{dx} \\left( 1 + \\mathrm{e}^{-x} \\right)^{-1} \\\\\n", | |
| "&= -(1 + e^{-x})^{-2}(-e^{-x}) \\\\\n", | |
| "&= \\dfrac{e^{-x}}{\\left(1 + e^{-x}\\right)^2} \\\\\n", | |
| "&= \\dfrac{1}{1 + e^{-x}\\ } \\cdot \\dfrac{e^{-x}}{1 + e^{-x}} \\\\\n", | |
| "&= \\dfrac{1}{1 + e^{-x}\\ } \\cdot \\dfrac{(1 + e^{-x}) - 1}{1 + e^{-x}} \\\\\n", | |
| "&= \\dfrac{1}{1 + e^{-x}\\ } \\cdot \\left( \\dfrac{1 + e^{-x}}{1 + e^{-x}} - \\dfrac{1}{1 + e^{-x}} \\right) \\\\\n", | |
| "&= \\dfrac{1}{1 + e^{-x}\\ } \\cdot \\left( 1 - \\dfrac{1}{1 + e^{-x}} \\right) \\\\\n", | |
| "&= \\sigma(x) \\cdot (1 - \\sigma(x))\n", | |
| "\\end{align}\n", | |
| "$$\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "### Hata Fonksiyonun Aktivasyon Fonksiyonu ile Geriye Dogru Yayilimi\n", | |
| "\n", | |
| "$$\n", | |
| "\\begin{aligned}\n", | |
| "z &= w \\cdot x + b \\\\\n", | |
| "a &= \\sigma(z) = \\frac{1}{1 + e^{-z}} \\\\\n", | |
| "L &= (y - a)^2 \\\\\n", | |
| "\\end{aligned}\n", | |
| "$$\n", | |
| "\n", | |
| "$$\\frac{\\partial L}{\\partial w} = \\frac{\\partial L}{\\partial a} \\cdot \\frac{\\partial a}{\\partial z} \\cdot \\frac{\\partial z}{\\partial w}\n", | |
| "$$\n", | |
| "\n", | |
| "$$\\frac{\\partial L}{\\partial a} = \\frac{\\partial}{\\partial a} (y - a)^2 = 2(y - a) \\cdot (-1) = -2(y - a)$$\n", | |
| "\n", | |
| "$$\\frac{\\partial a}{\\partial z} = \\frac{\\partial}{\\partial z} \\left( \\frac{1}{1 + e^{-z}} \\right) = a(1 - a)$$\n", | |
| "\n", | |
| "$$\\frac{\\partial z}{\\partial w} = \\frac{\\partial}{\\partial w} (w \\cdot x + b) = x$$" | |
| ], | |
| "metadata": { | |
| "id": "meS1a1wY-Svq" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "[How Does a Neural Network Work](https://www.youtube.com/shorts/Dbcx2_MO0LM) \n", | |
| "[Backpropagation calculus](https://www.youtube.com/watch?v=tIeHLnjs5U8)" | |
| ], | |
| "metadata": { | |
| "id": "JIEGPOh0fOCI" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "npbjvJ1wwofA" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "from sklearn.datasets import make_regression" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X,y = make_regression(\n", | |
| " n_features=1,\n", | |
| " n_targets=1,\n", | |
| " n_samples=100,\n", | |
| " random_state=1\n", | |
| ")\n", | |
| "\n", | |
| "plt.scatter(X,y,edgecolors='black',c=X,s=100)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 447 | |
| }, | |
| "id": "b2_1oipAxtFQ", | |
| "outputId": "8793430b-552a-40ac-b32c-233a09521969" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.collections.PathCollection at 0x7ee12f6e2ae0>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 2 | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ], | |
| "image/png": "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ly9TkBERkRJ0m0m8qm3btqxalcANNwxh46aPCQqKIjysKVarDZcrl+Pp28nLc9CrV2+++upLYmJivF2yiIhUMpqZEa9r3rw5Gzdu4Oeff2bQoD74+CaTk7sVu99xbrvtJjZt2sTSpUsUZERE5JS0ZkZEREQqJa2ZERERkWpBYUZERESqNIUZERERqdIUZkRERKRKU5gRERGRKk1hRkRERKo0hRkRERGp0hRmREREpEpTmBEREZEqTWFGREREqjSFGREREanSFGZERESkSlOYERERkSpNYUZERESqNIUZERERqdIUZkRERKRKU5gRERGRKk1hRkRERKq0Cgszzz//PD169CAgIICwsLBTtjEM46TPtGnTSrRZtmwZHTp0wG6306hRI6ZOnVpRJYuIiEgVVGFhprCwkOuuu4677777jO0+/vhjjhw5UvwZPHhw8bn9+/czcOBAevfuzYYNGxg3bhx33nknCxYsqKiyRUREpIrxqaiOn3nmGYCzzqSEhYURExNzynNTpkyhQYMGvPrqqwA0b96cn3/+mddff51+/fqVa70iIiJSNXl9zczo0aOJjIykS5cufPTRR5imWXwuISGBPn36lGjfr18/EhISzthnQUEBTqezxEdERETOTxU2M1Mazz77LJdccgkBAQEsXLiQe+65h+zsbO69914AUlJSiI6OLnFNdHQ0TqeTvLw8/P39T9nvxIkTi2eGRERE5PxWppmZ8ePHn3LR7p8/O3bsKHV/Tz75JBdccAHt27fnkUce4eGHH2bSpEllHsT/9+ijj+JwOIo/SUlJf7tPERERqZzKNDPz4IMPctttt52xTXx8/F8upmvXrjz33HMUFBRgt9uJiYkhNTW1RJvU1FRCQkJOOysDYLfbsdvtf7kOERERqTrKFGaioqKIioqqqFrYsGED4eHhxUGke/fuzJ07t0SbRYsW0b179wqrQURERKqWClszk5iYSHp6OomJibjdbjZs2ABAo0aNCAoKYtasWaSmptKtWzf8/PxYtGgRL7zwAg899FBxH3fddRdvv/02Dz/8MHfccQdLlizhm2++Yc6cORVVdqVWUFBAbm4uISEhWK1Wb5cjIiJSOZgVZNiwYSZw0mfp0qWmaZrmvHnzzHbt2plBQUFmYGCg2bZtW3PKlCmm2+0u0c/SpUvNdu3amTabzYyPjzc//vjjMtficDhM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\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Tek Katmanli Yapay Sinir Aginda Geriye Yayilim Fonksiyonu\n", | |
| "\n", | |
| "> *Aktivasyon fonksiyonu yok!*\n", | |
| "\n", | |
| "$$y = W \\cdot X + b$$ \n", | |
| "\n", | |
| "$$L=\\frac{1}{n} \\cdot (y_{pred} - y_{true})^2$$\n", | |
| "\n", | |
| "$$\\frac {\\partial L}{\\partial w} =\n", | |
| "\\frac {\\partial L}{\\partial y} \\cdot \\frac {\\partial y}{\\partial w}$$\n", | |
| "\n", | |
| "$$\\frac {\\partial L}{\\partial y} = \\frac {2}{n} \\cdot (y_{pred} - y_{true})$$\n", | |
| "\n", | |
| "$$\\frac {\\partial y}{\\partial w} = X$$\n", | |
| "\n", | |
| "$$\\frac {\\partial L}{\\partial w} = \\frac {2}{n} \\cdot (y_{pred} - y_{true}) \\cdot X$$" | |
| ], | |
| "metadata": { | |
| "id": "qCyz7PE3E28j" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "class SingleLayerNetwork:\n", | |
| " def __init__(self,X,y,learning_rate=0.01):\n", | |
| " self.X = X\n", | |
| " self.y = y.reshape(-1,1)\n", | |
| " self.lr = learning_rate\n", | |
| " self.W = np.random.rand()\n", | |
| " self.b = np.random.rand()\n", | |
| "\n", | |
| " def forward(self,X=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| " return np.dot(X, self.W) + self.b\n", | |
| "\n", | |
| " def compute_loss(self,X=None,preds=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| " if preds is None:\n", | |
| " preds = self.forward(X)\n", | |
| "\n", | |
| " n = len(X)\n", | |
| " error = preds - self.y\n", | |
| " # mean square error fonksiyonu\n", | |
| " loss = 2/n * np.sum(error ** 2).round().item()\n", | |
| "\n", | |
| " return error,loss\n", | |
| "\n", | |
| " def gradient(self,X=None, preds=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| " if preds is None:\n", | |
| " preds = self.forward(X)\n", | |
| "\n", | |
| " n = X.shape[0]\n", | |
| " # error = y_pred - y_true\n", | |
| " error,loss = self.compute_loss(X,preds)\n", | |
| "\n", | |
| " # mean square error fonksiyonu turevi 2/n . (y_true - y_pred) . X\n", | |
| " dw = 2/n * np.dot(X.T,error)\n", | |
| " db = 2/n * np.sum(error) # np.mean?\n", | |
| "\n", | |
| " self.W -= self.lr * dw\n", | |
| " self.b -= self.lr * db\n", | |
| "\n", | |
| " return loss\n", | |
| "\n", | |
| "\n", | |
| "net = SingleLayerNetwork(X,y)\n", | |
| "for i in range(10):\n", | |
| " loss = net.gradient()\n", | |
| " print(f\"loss:{loss}\")" | |
| ], | |
| "metadata": { | |
| "id": "JfqHl4B0z_YM", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "da139dbc-3587-49d4-b034-c351421f90fa" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "loss:10221.66\n", | |
| "loss:9900.86\n", | |
| "loss:9590.22\n", | |
| "loss:9289.36\n", | |
| "loss:8998.02\n", | |
| "loss:8715.880000000001\n", | |
| "loss:8442.64\n", | |
| "loss:8178.04\n", | |
| "loss:7921.78\n", | |
| "loss:7673.58\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "#@title Iki Katmanli Tek Noronlu Yapay Sinir Agi\n", | |
| "\n", | |
| "class MultiLayerNetwork:\n", | |
| " def __init__(self,X,y,learning_rate=0.001):\n", | |
| " self.X = X\n", | |
| " self.y = y.reshape(-1,1)\n", | |
| " self.W1 = np.random.rand()\n", | |
| " self.b1 = np.random.rand()\n", | |
| " self.W2 = np.random.rand()\n", | |
| " self.b2 = np.random.rand()\n", | |
| " self.lr = learning_rate\n", | |
| "\n", | |
| " def forward(self,X=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| "\n", | |
| " self.output1 = np.dot(X,self.W1) + self.b1\n", | |
| " self.output2 = np.dot(self.output1,self.W2) + self.b2\n", | |
| " return self.output2\n", | |
| "\n", | |
| " def compute_loss(self,X=None,preds=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| " if preds is None:\n", | |
| " preds = self.forward(X)\n", | |
| "\n", | |
| " n = X.shape[0]\n", | |
| " error = preds - self.y\n", | |
| " loss = 1/n * np.sum(error **2)\n", | |
| "\n", | |
| " return error,loss\n", | |
| "\n", | |
| " def gradient(self,X=None,preds=None):\n", | |
| " if X is None:\n", | |
| " X = self.X\n", | |
| " if preds is None:\n", | |
| " preds = self.forward(X)\n", | |
| "\n", | |
| " n = X.shape[0]\n", | |
| " error,loss = self.compute_loss(X)\n", | |
| "\n", | |
| " dw2 = 2/n * np.dot( error.T, self.output1)\n", | |
| " db2 = (2/n) * np.sum(error, axis=0)\n", | |
| "\n", | |
| " delta_hidden = np.dot(error, self.W2)\n", | |
| " dw1 = 2/n * np.dot(delta_hidden.T,X)\n", | |
| " db1 = (2/n) * np.sum(delta_hidden, axis=0)\n", | |
| "\n", | |
| " self.W2 -= self.lr * dw2.item()\n", | |
| " self.b2 -= self.lr * db2.item()\n", | |
| "\n", | |
| " self.W1 -= self.lr * dw1.item()\n", | |
| " self.b1 -= self.lr * db1.item()\n", | |
| "\n", | |
| " return loss\n", | |
| "\n", | |
| "from IPython.display import display,update_display\n", | |
| "\n", | |
| "multilayer = MultiLayerNetwork(X,y)\n", | |
| "singlelayer = SingleLayerNetwork(X,y)\n", | |
| "\n", | |
| "fig,axs = plt.subplots(1,2,figsize=(7,4))\n", | |
| "handle = display(fig, display_id=True)\n", | |
| "\n", | |
| "axs[0].plot([],[])\n", | |
| "axs[1].plot([],[])\n", | |
| "\n", | |
| "loss1 = []\n", | |
| "loss2 = []\n", | |
| "epochs = 100\n", | |
| "for i in range(epochs):\n", | |
| " l1 = multilayer.gradient()\n", | |
| " l2 = singlelayer.gradient()\n", | |
| " loss1.append(l1)\n", | |
| " loss2.append(l2)\n", | |
| " axs[0].plot(range(len(loss1)),loss1,color='red')\n", | |
| " axs[1].plot(range(len(loss2)),loss2,color='green')\n", | |
| " plt.tight_layout()\n", | |
| " update_display(fig,display_id=handle.display_id)\n", | |
| "plt.close()" | |
| ], | |
| "metadata": { | |
| "collapsed": true, | |
| "id": "cqwObOtGzYJA", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 407 | |
| }, | |
| "outputId": "3c949dbb-0885-4b1d-d669-33b7f31b85d1" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 700x400 with 2 Axes>" | |
| ], | |
| "image/png": "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kqTs7GyVlJS4XenaoUMHtWnTxu2K2s6dO7tdSJCYmCiXy6Vt27ZZbap6taxUsytmPcK5ZmeZlQV8yueff66uXbuqa9eukqTRo0era9eu1rdSY8aM0QMPPKDhw4friiuu0OHDh7Vs2TKFhoZa7zF37lx16NBBffr00c0336xevXq57QEbFhamjz/+WHv27FH37t318MMPa8KECW57yV511VWaN2+eZs6cqS5duugf//iHFi1apE6dOtXTb0KKn1R3s74AfFtQVRrHxcVp9uzZat++vfbv36+JEyfqmmuu0datW5Wbm6vg4GCFh4e7/Uz5K2qre7Wsy+XS0aNH1bBhwwprS09P18SJE6vSHc90MsiWD66slQV8xnXXXSdzjv+eHQ6HnnzyST355JNnbdO8eXPNmzfvnJ9z2WWX6d///vc529xxxx264447zl1wLYtRjPZojyTps6LP6vWzAfiOKs3E3nTTTbrjjjt02WWXKTExUUuXLlVBQYHefffduqqv0mrzilmPUNH/wTkcUmpq/dcCALVod9puu0sA4ANqtMVWeHi4fvGLX+ibb75RZGSkiouLVVBQ4Nam/BW11b1a1ul0nnUWVqr5FbMeyRhpwQL3Y9OmSfffb089AAAAHqJGIfbw4cP6z3/+o1atWql79+5q0KCB25Wuu3btUk5OjtsVtVu2bHHbGiYjI0NOp1OxsbFWm/q+Wtaj3X77mbOyf/2r9M9/2lMPANSyQX8bZHcJALxQlULsH//4R61Zs0bffvut1q1bp1//+tcKDAzUXXfdpbCwMA0bNkyjR4/WqlWrlJ2draFDhyo+Pl49e/aUJPXt21exsbEaNGiQNm/erOXLl+vxxx9XSkqKQkJCJEn333+/du/erTFjxmjnzp169dVX9e6772rUqFG133tvUj7I3n67PXUAQC1opmbW87f++5aNlQDwVlW6sOu///2v7rrrLv3vf//ThRdeqF69eumzzz7ThRdeKEl68cUXFRAQoAEDBqioqEiJiYl69dVXrZ8PDAzU4sWLNWLECMXHx6tx48YaMmSI28ULMTExWrJkiUaNGqWXX35ZrVu31qxZs5SYmFhLXfZixrhf8MXFXgC81MG0g3JMZOcVANXnMOe6RNaLuVwuhYWFqbCw0DfWx56u/M4Fvvk/IeARfHosqQU1+f2cHmJNGuMY4M+qM5bUaE0sbNKtm/vrJk3sqQMAasng1wfbXQIAL0OI9Uan3WpSknTkiD11AEANXKyLred/38vtaAFUDSHWW5VfQsBdvQB4mf+k/cfuEgB4MUKsNysfZBcutKcOAACAekaI9SX9+9tdAQBU21XPXmV3CQC8CCHW27GsAIAXiw89dSObzGOZNlYCwNsQYn1BUJW2+wUAj7Fu7Dq7SwDgpQixvqCkxP01s7EAAMDHEWJ9xSWX2F0BANRYyMQQu0sA4CUIsb7i66/dX7drZ08dAFBFr7d53XperGIbKwHgTQixvuqbb+yuAAAqZejQoXaXAMALEWJ9CfvGAgAAP0GI9WXsGwvACzkmcnEqgPMjxPqa8rOxAOAFTBpjF4CqIcT6OrbbAgAAPogQ64sWLbK7AgAAgDpFiPVFt91mdwUAUCOsiwVwPoRYf8CSAgBegHWxAKqCEOuruMALAAD4MEIsAMAjzZ492+4SAHgwQqy/YEkBAC8z9Dvu5AXg7AixvowlBQC8DOtiAVQWIRYAAABehxDrT1hSAMDLtJvYzu4SAHgoQqyvY0kBAC9zdaOrreff6BsbKwHgyQixAACP8skjn9hdAgAvQIj1N+HhdlcAAABQY4RYf/D++6eeFxbaVwcAVAO3oAVQEUKsP/jVr+yuAACqhK22AJwPIRYAAABehxDrj9hqC4CXmTNnjt0lAPAwhFh/8cEHdlcAANX2u29/Z3cJADwMIdZf3Hqr3RUAQJWwLhbAuRBiAQAA4HUIsf6KdbEAvAxbbQE4HSHWn3ALWgBeZvZFs+0uAYCHIsQCADzWkCFD7C4BgIcixAIAvMabb75pdwkAPAQh1p9deqndFQBAlQzZw8wsgBMIsf7m4YdPPd+50746AKCS2GoLQEUIsf7m+eftrgAAAKDGCLEAAK/CVlsAJEIsAMALzImZY3cJADwMIdbfcdMDAF5g8ODBdpcAwMMQYv0RNz0A4OX+/ve/210CAJsRYgEAXmfwbmZmAX9HiAUAeAW22gJwOkIspMWL7a4AAACgSgix/iow8NTzW2+1rw4AZygtLdX48eMVExOjhg0b6uc//7meeuopmdPWsxtjNGHCBLVq1UoNGzZUQkKCvv76a7f3OXjwoJKTk+V0OhUeHq5hw4bp8OHDbm2+/PJLXXPNNQoNDVV0dLQmT55cL32sDWy1Bfg3Qqy/On7c7goAnMWzzz6r6dOn6y9/+Yt27NihZ599VpMnT9Yrr7xitZk8ebKmTp2qGTNmKCsrS40bN1ZiYqKOHTtmtUlOTta2bduUkZGhxYsXa+3atRo+fLh13uVyqW/fvmrbtq2ys7P13HPP6YknntDMmTPrtb9VwZICACfVKMROmjRJDodDI0eOtI4dO3ZMKSkpatGihZo0aaIBAwYoLy/P7edycnKUlJSkRo0aqWXLlnrkkUd0vFyoWr16tbp166aQkBBdcsklmj17dk1KBQCvsW7dOt12221KSkrSRRddpNtvv119+/bV+vXrJZ2YhX3ppZf0+OOP67bbbtNll12mN998U/v27dOiRYskSTt27NCyZcs0a9YsxcXFqVevXnrllVc0f/587du3T5I0d+5cFRcX6/XXX1fHjh01cOBAPfjgg5oyZYpdXQeASqt2iN2wYYP++te/6rLLLnM7PmrUKH344YdasGCB1qxZo3379ql///7W+dLSUiUlJam4uFjr1q3TnDlzNHv2bE2YMMFqs2fPHiUlJen666/Xpk2bNHLkSN17771avnx5dcsFAK9x1VVXacWKFfrqq68kSZs3b9Ynn3yim266SdKJMTI3N1cJCQnWz4SFhSkuLk6ZmZmSpMzMTIWHh6tHjx5Wm4SEBAUEBCgrK8tq07t3bwUHB1ttEhMTtWvXLv3444913s/awJICwH9VK8QePnxYycnJeu2119SsWTPreGFhof72t79pypQp+uUvf6nu3bvrjTfe0Lp16/TZZ59Jkj7++GNt375db731li6//HLddNNNeuqppzRt2jQVFxdLkmbMmKGYmBi98MILuvTSS5Wamqrbb79dL774Yi10GQA826OPPqqBAweqQ4cOatCggbp27aqRI0cqOTlZkpSbmytJioiIcPu5iIgI61xubq5atmzpdj4oKEjNmzd3a1PRe5z+GeUVFRXJ5XK5PerbPRffU++fCcDzVCvEpqSkKCkpyW0WQJKys7NVUlLidrxDhw5q06aN2+xA586d3QbOxMREuVwubdu2zWpT/r0TExOt90AdaNHC7goA/L93331Xc+fO1bx58/TFF19ozpw5ev755zVnjv23Xk1PT1dYWJj1iI6Orvca/jbob/X+mQA8T5VD7Pz58/XFF18oPT39jHO5ubkKDg5WeHi42/HyswPn+5f/2dq4XC4dPXq0wro8YXbA65y+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4rR+/Xq7Szqn9PR0XXHFFWratKlatmypfv36adeuXW5tjh07ppSUFLVo0UJNmjTRgAEDzri9pKeZNGmSHA6HRo4caR3zpn58//33uvvuu9WiRQs1bNhQnTt31ueff26dN8ZowoQJatWqlRo2bKiEhAR9/fXXNlZcsdLSUo0fP14xMTFq2LChfv7zn+upp55yu6e1J/Zl7dq1uvXWWxUVFSWHw6FFixa5na9MzQcPHlRycrKcTqfCw8M1bNgwHT58uB574dsYaz0DY639vHWclTxorDUw8+fPN8HBweb1118327ZtM/fdd58JDw83eXl5dpd2VomJieaNN94wW7duNZs2bTI333yzadOmjTl8+LDV5v777zfR0dFmxYoV5vPPPzc9e/Y0V111lY1Vn9v69evNRRddZC677DLz0EMPWce9pR8HDx40bdu2Nb/73e9MVlaW2b17t1m+fLn55ptvrDaTJk0yYWFhZtGiRWbz5s3mV7/6lYmJiTFHjx61sfIzPf3006ZFixZm8eLFZs+ePWbBggWmSZMm5uWXX7baeGJfli5dah577DHz3nvvGUlm4cKFbucrU/ONN95ounTpYj777DPz73//21xyySXmrrvuquee+CbGWs/AWOsZvHWcNcZzxlpCrDHmyiuvNCkpKdbr0tJSExUVZdLT022sqmry8/ONJLNmzRpjjDEFBQWmQYMGZsGCBVabHTt2GEkmMzPTrjLP6tChQ6Zdu3YmIyPDXHvttdbA6k39GDt2rOnVq9dZz5eVlZnIyEjz3HPPWccKCgpMSEiIefvtt+ujxEpLSkoy99xzj9ux/v37m+TkZGOMd/Sl/MBamZq3b99uJJkNGzZYbT766CPjcDjM999/X2+1+yrGWvsx1nrG+GSMb4yzxtg71vr9coLi4mJlZ2crISHBOhYQEKCEhARlZmbaWFnVFBYWSpKaN28uScrOzlZJSYlbvzp06KA2bdp4ZL9SUlKUlJTkVq/kXf344IMP1KNHD91xxx1q2bKlunbtqtdee806v2fPHuXm5rr1JSwsTHFxcR7Xl6uuukorVqzQV199JUnavHmzPvnkE910002SvKsvJ1Wm5szMTIWHh6tHjx5Wm4SEBAUEBCgrK6vea/YljLWegbHWc/rii+OsVL9jrd/fdvaHH35QaWnpGfcJj4iI0M6dO22qqmrKyso0cuRIXX311erUqZMkKTc3V8HBwQoPD3drGxERodzcXBuqPLv58+friy++0IYNG84450392L17t6ZPn67Ro0frT3/6kzZs2KAHH3xQwcHBGjJkiFVvRX/XPK0vjz76qFwulzp06KDAwECVlpbq6aefVnJysiR5VV9OqkzNubm5atmypdv5oKAgNW/e3GP75S0Ya+3HWOtZffHFcVaq37HW70OsL0hJSdHWrVv1ySef2F1Kle3du1cPPfSQMjIyFBoaanc5NVJWVqYePXromWeekSR17dpVW7du1YwZMzRkyBCbq6uad999V3PnztW8efPUsWNHbdq0SSNHjlRUVJTX9QWoLYy1nsFXxlrG2Zrz++UEF1xwgQIDA8+4AjMvL0+RkZE2VVV5qampWrx4sVatWqXWrVtbxyMjI1VcXKyCggK39p7Wr+zsbOXn56tbt24KCgpSUFCQ1qxZo6lTpyooKEgRERFe0Q9JatWqlWJjY92OXXrppcrJyZEkq15v+Lv2yCOP6NFHH9XAgQPVuXNnDRo0SKNGjVJ6erok7+rLSZWpOTIyUvn5+W7njx8/roMHD3psv7wFY629GGs9ry++OM5K9TvW+n2IDQ4OVvfu3bVixQrrWFlZmVasWKH4+HgbKzs3Y4xSU1O1cOFCrVy5UjExMW7nu3fvrgYNGrj1a9euXcrJyfGofvXp00dbtmzRpk2brEePHj2UnJxsPfeGfkjS1VdffcbWO1999ZXatm0rSYqJiVFkZKRbX1wul7KysjyuLz/99JMCAtyHh8DAQJWVlUnyrr6cVJma4+PjVVBQoOzsbKvNypUrVVZWpri4uHqv2Zcw1tqLsdbzxidfHGeleh5ra3pVmi+YP3++CQkJMbNnzzbbt283w4cPN+Hh4SY3N9fu0s5qxIgRJiwszKxevdrs37/fevz0009Wm/vvv9+0adPGrFy50nz++ecmPj7exMfH21h15Zx+xawx3tOP9evXm6CgIPP000+br7/+2sydO9c0atTIvPXWW1abSZMmmfDwcPP++++bL7/80tx2220esV1KeUOGDDE/+9nPrK1f3nvvPXPBBReYMWPGWG08sS+HDh0yGzduNBs3bjSSzJQpU8zGjRvNd999V+mab7zxRtO1a1eTlZVlPvnkE9OuXTu22KoljLWehbHWXt46zhrjOWMtIfb/vfLKK6ZNmzYmODjYXHnlleazzz6zu6RzklTh44033rDaHD161PzhD38wzZo1M40aNTK//vWvzf79++0rupLKD6ze1I8PP/zQdOrUyYSEhJgOHTqYmTNnup0vKysz48ePNxERESYkJMT06dPH7Nq1y6Zqz87lcpmHHnrItGnTxoSGhpqLL77YPPbYY6aoqMhq44l9WbVqVYX/XQwZMqTSNf/vf/8zd911l2nSpIlxOp1m6NCh5tChQzb0xjcx1noOxlp7ees4a4znjLUOY067NQQAAADgBfx+TSwAAAC8DyEWAAAAXocQCwAAAK9DiAUAAIDXIcQCAADA6xBiAQAA4HUIsQAAAPA6hFgAAAB4HUIsAAAAvA4hFgAAAF6HEAsAAACvQ4gFAACA1/k//9aNHbp065oAAAAASUVORK5CYII=\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "#@title Aktivasyon Fonksiyonlu ve Cok Noronlu Versiyon\n", | |
| "class MultiLayerNetwork:\n", | |
| " def __init__(self, X, y, hidden_size=4, lr=0.001):\n", | |
| " self.X = X\n", | |
| " self.y = y.reshape(-1, 1)\n", | |
| " input_size = X.shape[1]\n", | |
| "\n", | |
| " # He Initialization (randn kullanarak)\n", | |
| " self.W1 = np.random.randn(input_size, hidden_size) * 0.01\n", | |
| " self.b1 = np.zeros((1, hidden_size))\n", | |
| " self.W2 = np.random.randn(hidden_size, 1) * 0.01\n", | |
| " self.b2 = np.zeros((1, 1))\n", | |
| " self.lr = lr\n", | |
| "\n", | |
| " def relu(self, z):\n", | |
| " return np.maximum(0, z)\n", | |
| "\n", | |
| " def relu_derivative(self, z):\n", | |
| " return (z > 0).astype(float)\n", | |
| "\n", | |
| " def forward(self, X=None):\n", | |
| " if X is None: X = self.X\n", | |
| " # Gizli katman + ReLU\n", | |
| " self.z1 = np.dot(X, self.W1) + self.b1\n", | |
| " self.a1 = self.relu(self.z1)\n", | |
| "\n", | |
| " # Çıktı katmanı (Regresyon olduğu için lineer bırakıyoruz)\n", | |
| " self.output2 = np.dot(self.a1, self.W2) + self.b2\n", | |
| " return self.output2\n", | |
| "\n", | |
| " def gradient(self):\n", | |
| " n = self.X.shape[0]\n", | |
| " preds = self.forward()\n", | |
| " error = preds - self.y # dLoss/dOutput2\n", | |
| "\n", | |
| " # 2. Katman Gradyanları\n", | |
| " dw2 = (2/n) * np.dot(self.a1.T, error)\n", | |
| " db2 = (2/n) * np.sum(error, axis=0, keepdims=True)\n", | |
| "\n", | |
| " # 1. Katmana Geri Yayılım (Zincirleme Kuralı)\n", | |
| " # Hata * W2 * ReLU_Türevi\n", | |
| " delta_hidden = np.dot(error, self.W2.T) * self.relu_derivative(self.z1)\n", | |
| "\n", | |
| " dw1 = (2/n) * np.dot(self.X.T, delta_hidden)\n", | |
| " db1 = (2/n) * np.sum(delta_hidden, axis=0, keepdims=True)\n", | |
| "\n", | |
| " # Güncelleme\n", | |
| " self.W2 -= self.lr * dw2\n", | |
| " self.b2 -= self.lr * db2\n", | |
| " self.W1 -= self.lr * dw1\n", | |
| " self.b1 -= self.lr * db1\n", | |
| "\n", | |
| " return np.mean(error**2)" | |
| ], | |
| "metadata": { | |
| "id": "OOFZQjIXat2J" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment