{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "accelerator": "GPU",
  "colab": {
   "provenance": []
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PyTorch ile Derin Öğrenme · Aşırı öğrenme ve düzenlileştirme\n",
    "\n",
    "Macademia · Büyükler için"
   ],
   "id": "c00"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> **Colab'da çalıştırma:** Bu dosyayı [colab.research.google.com](https://colab.research.google.com) adresinde **Dosya → Not defteri yükle** ile aç. GPU için **Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU** seç. Hücreleri yukarıdan aşağı sırayla çalıştır (Shift + Enter). PyTorch Colab'da kuruludur; bilgisayarında çalıştırmak istersen `pip install torch torchvision`."
   ],
   "id": "c01"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch, random, numpy as np\n",
    "torch.manual_seed(0); random.seed(0); np.random.seed(0)          # tekrarlanabilirlik\n",
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "print('PyTorch', torch.__version__, '| device:', device)"
   ],
   "id": "c02"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Az ve gürültülü veri"
   ],
   "id": "c03"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "from sklearn.datasets import make_moons\n",
    "Xa, ya = make_moons(40, noise=0.3, random_state=1); Xb, yb = make_moons(300, noise=0.3, random_state=2)\n",
    "Xtr, ytr = torch.tensor(Xa, dtype=torch.float32), torch.tensor(ya, dtype=torch.float32).unsqueeze(1)\n",
    "Xva, yva = torch.tensor(Xb, dtype=torch.float32), torch.tensor(yb, dtype=torch.float32).unsqueeze(1)"
   ],
   "id": "c04"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Deney fonksiyonu"
   ],
   "id": "c05"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy\n",
    "def deney(p=0.0, wd=0.0, sabir=None, epochs=300, seed=0):\n",
    "    torch.manual_seed(seed)\n",
    "    m = nn.Sequential(nn.Linear(2, 64), nn.ReLU(), nn.Dropout(p), nn.Linear(64, 64), nn.ReLU(), nn.Dropout(p), nn.Linear(64, 1))\n",
    "    opt = torch.optim.AdamW(m.parameters(), lr=0.01, weight_decay=wd); f = nn.BCEWithLogitsLoss()\n",
    "    best, state, bekle, hist = 1e9, None, 0, []\n",
    "    for ep in range(epochs):\n",
    "        m.train(); opt.zero_grad(); f(m(Xtr), ytr).backward(); opt.step()\n",
    "        m.eval()\n",
    "        with torch.no_grad():\n",
    "            tl, vl = f(m(Xtr), ytr).item(), f(m(Xva), yva).item()\n",
    "        hist.append((tl, vl))\n",
    "        if vl < best - 1e-4:\n",
    "            best, state, bekle = vl, copy.deepcopy(m.state_dict()), 0\n",
    "        else:\n",
    "            bekle += 1\n",
    "            if sabir and bekle >= sabir:\n",
    "                break\n",
    "    return np.array(hist), best"
   ],
   "id": "c06"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Ablasyon tablosu"
   ],
   "id": "c07"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for name, kw in [('temel', {}), ('dropout 0.3', {'p': 0.3}), ('weight_decay 0.01', {'wd': 0.01}), ('erken durdurma', {'sabir': 30})]:\n",
    "    h, best = deney(**kw)\n",
    "    print(f'{name:22s} val={h[-1, 1]:.3f} best={best:.3f} gap={h[-1, 1] - h[-1, 0]:.3f}')\n",
    "    plt.plot(h[:, 1], label=name)\n",
    "plt.legend(); plt.ylabel('val loss'); plt.show()"
   ],
   "id": "c08"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Alıştırmalar\n",
    "1. Eğitim örneğini 200'e çıkar; açık ne oldu?\n",
    "2. Üç farklı tohumla tekrarla ve ortalama al.\n",
    "3. Görüntü verisinde `transforms.RandomRotation` ile veri artırma dene."
   ],
   "id": "c09"
  }
 ]
}