MNIST Yapay Sinir Ağı Animasyonu

Girdi Rakamı

3
Tahmin: 3 (Güven: 92%)

MNIST Yapay Sinir Ağı Nasıl Çalışır?

Bu animasyon, yapay sinir ağının bir el yazısı rakamı nasıl tanıdığını göstermektedir. Model 4 katmandan oluşur:

  • Girdi Katmanı: 28x28 piksellik el yazısı görüntüsü 784 nöronluk bir vektöre dönüştürülür.
  • Gizli Katmanlar: Sırasıyla 512, 256 ve 128 nöron içerir ve her katman bir önceki katmandan gelen bilgiyi işler.
  • Çıktı Katmanı: 10 nöron içerir ve her biri 0-9 rakamını temsil eder.

Her katman arasında ReLU, son katmanda ise log_softmax aktivasyon fonksiyonu kullanılır. log_softmax, softmax fonksiyonunun logaritmasıdır. Softmax fonksiyonu çıktıları 0 ile 1 arasında olasılık değerlerine dönüştürür ve bunların toplamı 1'e eşittir. Bu işlem hangi rakamın en yüksek olasılığa sahip olduğunu belirlemek için kullanılır.

Animasyonda aktif nöronlar kırmızı renkle, önemli bağlantılar vurgulanarak gösterilir. Ayrıca her rakamın olasılığı bir çubukla temsil edilir ve en yüksek olasılığa sahip rakam "tahmin" olarak gösterilir.

Python Kod ve Açıklamaları

Aşağıda, PyTorch ile yazılmış basit bir tam bağlantılı sinir ağı (MNISTNet) örneği ve satır içi açıklamaları yer almaktadır. Bu kod, 28x28 boyutundaki MNIST görüntülerini (784 piksel) giriş olarak alır, üç gizli katmandan geçirir ve 10 farklı rakam (0-9) için logaritmik olasılık değerleri döndürür.

import torch
import torch.nn as nn           # PyTorch'un temel sinir ağı modülleri
import torch.nn.functional as F # Aktivasyon fonksiyonları ve diğer yardımcı işlevler

class MNISTNet(nn.Module):
    """
    MNISTNet, MNIST veri kümesi için tasarlanmış basit bir tam bağlantılı (fully connected)
    yapay sinir ağı mimarisidir.
    """
    def __init__(self):
        # nn.Module sınıfının başlatıcısını çağırıyoruz
        super(MNISTNet, self).__init__()

        # Girdi katmanı: 28x28 piksel -> 784 boyutunda vektör
        # 1. Gizli katman: 784 -> 512
        self.fc1 = nn.Linear(784, 512)

        # 2. Gizli katman: 512 -> 256
        self.fc2 = nn.Linear(512, 256)

        # 3. Gizli katman: 256 -> 128
        self.fc3 = nn.Linear(256, 128)

        # Çıktı katmanı: 128 -> 10 (0'dan 9'a kadar rakam sınıfları)
        self.fc4 = nn.Linear(128, 10)

        # Overfitting'i azaltmak için Dropout katmanı (örnekleme oranı %20)
        self.dropout = nn.Dropout(0.2)

    def forward(self, x):
        """
        İleri yayılım (forward pass) metodunda verinin ağa hangi sırayla aktarılacağını tanımlarız.
        x: [batch_size, 1, 28, 28] şeklinde gelen MNIST görüntüleri
        """
        # 1) Girdi verisini düzleştiriyoruz: [batch_size, 784]
        x = x.view(-1, 28 * 28)

        # 2) İlk katman + ReLU aktivasyonu
        x = F.relu(self.fc1(x))
        # Dropout uygulayarak belirli nöronları devre dışı bırakıyoruz
        x = self.dropout(x)

        # 3) İkinci katman + ReLU aktivasyonu
        x = F.relu(self.fc2(x))
        x = self.dropout(x)

        # 4) Üçüncü katman + ReLU aktivasyonu
        x = F.relu(self.fc3(x))
        x = self.dropout(x)

        # 5) Çıktı katmanı
        x = self.fc4(x)

        # 6) log_softmax ile çıktı değerlerini olasılık dağılımına dönüştürüyoruz
        # dim=1: satır bazında (her örnek için) log_softmax hesaplar
        return F.log_softmax(x, dim=1)

Bu modelin eğitimi sırasında, çapraz entropi benzeri bir kayıp fonksiyonu (örn. nn.NLLLoss veya nn.CrossEntropyLoss) kullanılır. Eğitim tamamlandığında, model her girdi görüntü için bir "tahmin" (en yüksek olasılığa sahip rakam) üretir.