PyTorch - Evrişimli Sinir Ağı

Derin öğrenme, makine öğreniminin bir bölümüdür ve araştırmacılar tarafından son yıllarda atılan çok önemli bir adım olarak kabul edilir. Derin öğrenme uygulamasının örnekleri, görüntü tanıma ve konuşma tanıma gibi uygulamaları içerir.

İki önemli derin sinir ağı türü aşağıda verilmiştir -

  • Evrişimli Sinir Ağları
  • Tekrarlayan Sinir Ağları.

Bu bölümde, ilk türe, yani Evrişimli Sinir Ağlarına (CNN) odaklanacağız.

Evrişimli Sinir Ağları

Evrişimli Sinir ağları, verileri birden çok dizi katmanı aracılığıyla işlemek için tasarlanmıştır. Bu tür sinir ağları, görüntü tanıma veya yüz tanıma gibi uygulamalarda kullanılır.

CNN ile diğer herhangi bir sıradan sinir ağı arasındaki temel fark, CNN'nin girdiyi iki boyutlu bir dizi olarak alması ve diğer sinir ağlarının odaklandığı özellik çıkarımına odaklanmak yerine doğrudan görüntüler üzerinde çalışmasıdır.

CNN'in baskın yaklaşımı, tanıma sorunlarının çözümünü içerir. Google ve Facebook gibi önde gelen şirketler, faaliyetlerin daha hızlı yapılmasını sağlamak için tanıma projelerinin araştırma ve geliştirme projelerine yatırım yaptı.

Her evrişimli sinir ağı üç temel fikir içerir -

  • Yerel ilgili alanlar
  • Convolution
  • Pooling

Bu terminolojilerin her birini ayrıntılı olarak anlayalım.

Yerel İlgili Alanlar

CNN, giriş verilerinde bulunan uzamsal korelasyonları kullanır. Sinir ağlarının eşzamanlı katmanlarındaki her biri, bazı giriş nöronlarını birbirine bağlar. Bu belirli bölgeye Yerel Alıcı Alan denir. Yalnızca gizli nöronlara odaklanır. Gizli nöron, belirli sınırın dışındaki değişiklikleri fark etmeden belirtilen alanın içindeki giriş verilerini işleyecektir.

Yerel ilgili alanların oluşturulmasının şema temsili aşağıda belirtilmiştir -

Evrişim

Yukarıdaki şekilde, her bağlantının, bir katmandan diğerine hareketle ilişkili bir bağlantıyla birlikte bir gizli nöron ağırlığını öğrendiğini gözlemliyoruz. Burada, bireysel nöronlar zaman zaman bir değişiklik yapar. Bu sürece "evrişim" denir.

Giriş katmanından gizli özellik haritasına bağlantıların eşlenmesi "paylaşılan ağırlıklar" olarak tanımlanır ve dahil edilen önyargı "paylaşılan önyargı" olarak adlandırılır.

Havuzlama

Evrişimli sinir ağları, CNN bildiriminden hemen sonra konumlandırılan havuz katmanlarını kullanır. Kullanıcıdan gelen girdiyi, evrişimli ağlardan çıkan ve yoğunlaştırılmış bir özellik haritası hazırlayan bir özellik haritası olarak alır. Havuz katmanları, önceki katmanların nöronlarıyla katman oluşturmaya yardımcı olur.

PyTorch'un Uygulanması

PyTorch kullanarak Evrişimli Sinir Ağı oluşturmak için aşağıdaki adımlar kullanılır.

Aşama 1

Basit bir sinir ağı oluşturmak için gerekli paketleri içe aktarın.

from torch.autograd import Variable
import torch.nn.functional as F

Adım 2

Evrişimli sinir ağının toplu temsiline sahip bir sınıf oluşturun. X girişi için parti şeklimiz (3, 32, 32) boyutundadır.

class SimpleCNN(torch.nn.Module):
   def __init__(self):
      super(SimpleCNN, self).__init__()
      #Input channels = 3, output channels = 18
      self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
      self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
      #4608 input features, 64 output features (see sizing flow below)
      self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
      #64 input features, 10 output features for our 10 defined classes
      self.fc2 = torch.nn.Linear(64, 10)

Aşama 3

(3, 32, 32) 'den (18, 32, 32)' ye ilk evrişim boyutunun aktivasyonunu hesaplayın.

Boyutun boyutu (18, 32, 32) yerine (18, 16, 16) olarak değişir. Boyut (18, 16, 16) 'dan (1, 4608)' e değiştiği için sinir ağının giriş katmanının veri boyutunu yeniden şekillendirin.

-1'in bu boyutu verilen diğer boyuttan aldığını hatırlayın.

def forward(self, x):
   x = F.relu(self.conv1(x))
   x = self.pool(x)
   x = x.view(-1, 18 * 16 *16)
   x = F.relu(self.fc1(x))
   #Computes the second fully connected layer (activation applied later)
   #Size changes from (1, 64) to (1, 10)
   x = self.fc2(x)
   return(x)