Pytorch kullanarak Resnet-34 modeli oluşturma – Yeni Başlayanlar İçin Bir Kılavuz

Kaynak Düğüm: 1075632

Bu makale, Veri Bilimi Blogathon

Giriş

Derin öğrenme son yıllarda çok gelişti ve hepimiz, modellerimiz için daha fazla doğruluk elde etmek için daha derin mimari ağlar oluşturmaktan heyecan duyuyoruz. Bu teknikler, sınıflandırma, kümeleme veya sentez gibi Görüntü ile ilgili çalışmalar için yaygın olarak denenir. Derine inmek harika görünebilir, ancak sinir ağları bozulma denilen bir sorunla karşı karşıya kaldığından yardımcı olmaz.

Burada doğruluk büyük ölçüde etkilenir. Bu aynı zamanda Ufuk gradyan inişi adı verilen bir soruna da yol açar. Bu, geri yayılım adımı sırasında ağırlıkları düzgün bir şekilde güncellememize izin vermez. Geri yayılım aşamasında, zincir kuralını kullanırız, ağda aşağı indikçe her katmanın türevleri çarpılır.

Daha derin katmanlar kullanırsak ve sigmoid gibi gizli katmanlara sahipsek, türevler her katmanda 0.25'in altına küçülür. Yani birçok katman türevi çarpıldığında gradyan üstel olarak azalır ve gradyan hesaplaması için faydasız olan çok küçük bir değer elde ederiz. Bu, bozulmayı önlemek için atlanan bağlantıları kullanan Microsoft Research tarafından Resnet'in yapılmasına yol açar. Bu yazıda Python'da Pytorch çerçevesini kullanarak 34 katmanlı ResNet mimarisinin bir uygulamasını tartışacağız.

kaybolan gradyan sorunu Resnet-34
görüntü 1

Yukarıda tartışıldığı gibi, bu diyagram bize kaybolan gradyan problemini göstermektedir. Sigmoid fonksiyonların türevleri 0.25'in altına küçültülür ve bu, gradyanları güncellerken çok fazla bilgi kaybeder.

Uçak ağlarıyla ilgili sorun

düz ağlarla ilgili sorun
görüntü 2

Şekilde görüldüğü gibi, daha derin katmanlara sahip olan uçak ağlarını görüyoruz. Solda tren hatası ve sağda test hatası var. Bunun aşırı uydurma için bir dava olabileceğini düşünürdük, ancak burada 56 katmanlı ağın hata yüzdesi hem eğitimde hem de model fazla uyum sağladığında gerçekleşmeyen test verilerinde çok daha kötüdür. Buna bozulma denir.

Resnet-34 Mimarisi

Resnet-34 Mimarisi
görüntü 3

Başlangıçta, çekirdek boyutu 64×7 olan 7 filtreye sahip bir evrişim katmanına sahibiz. ilk evrişim, ardından bir max-pooling katmanı gelir. olarak belirtilen adıma sahibiz 2 Her iki durumda da. Sonraki dönş2_x havuzlama katmanına ve aşağıdaki evrişim katmanlarına sahibiz. Bu katmanlar, artıkların bağlanma şekli nedeniyle normalde çiftler halinde gruplanır (oklar, her iki katmanda bir atladığını gösterir).

Burada kernel_sizeof 2×3, num_filters 3 olan 64 katmanımız var ve tüm bunlar havuz/3 ve filtre 2 arasındaki katmanlara karşılık gelen x128, toplamda 6 katman (bir çift ​​çarpı 3). Bu 2 katman kernel_size of 3×3, num_filters 128'dir ve bunlar da yinelenir ancak bu sefer 4'tür. Bu avg_pooling ve softmax işlevine kadar devam eder. Filtre sayısı her iki katına çıktığında, ilk katmanın belirttiğini görebiliriz. filtre_sayısı/2.

Pytorch'ta Resnet-34 tanımlama kodu:

class ResNet34(nn.Module): def __init__(self): super(ResNet34,self).__init__() self.block1 = nn.Sequential( nn.Conv2d(1,64,kernel_size=2,adım=2,padding=) 3,bias=Yanlış), nn.BatchNorm2d(64), nn.ReLU(True) ) self.block2 = nn.Sequential( nn.MaxPool2d(1,1), ArtıkBlok(64,64), ArtıkBlok(64,64,2) ,3) ) self.block64,128 = nn.Sıralı( ArtıkBlok(128,128,2), ArtıkBlok(4) ) self.blok128,256 = nn.Sıralı( ArtıkBlok(256,256,2), ArtıkBlok(5) ) self.blok256,512 = nn. Sıralı( ResidualBlock(512,512,2), ResidualBlock(2) ) self.avgpool = nn.AvgPool2d(1) # sesli_diacritic self.fc512,11 = nn.Linear(2) # grapheme_root self.fc512,168 = nn.Linear(3) # consonant_diacritic self.fc512,7 = nn.Linear(1) def ileri(self,x): x = self.block2(x) x = self.block3(x) x = self.block4(x) x = self. blok5(x) x = self.block0(x) x = self.avgpool(x) x = x.view(x.size(1),-1) x1 = self.fc2(x) x2 = self.fc3( x) x3 = self.fc1(x) dönüş x2,x3,xXNUMX

Bu kod bize Resnet-34 için bir modülün tam olarak uygulanmasını sağlar. Şimdi her satırın nasıl çalıştığını anlamak için derinlere dalalım. Bunun için daha önce gördüğümüz mimariyi kısaltalım. Aşağıdaki 34 katmanlı şemaya bakın.

kod çıktısı
görüntü 4

Herhangi bir Resnet mimarisini 5 blok halinde uygulamamız gerektiğini görebiliyoruz. İlk blok 64 adımlı 2 filtreye sahiptir, ardından adım 2 ile maksimum havuzlama yapılır. Mimari 3 dolgu kullanır. Dahili ortak değişken kaydırma şansı olduğundan, toplu normalleştirme ile ağı stabilize etmeliyiz. Sonunda ReLU aktivasyonunu kullanıyoruz. İlk blok herhangi bir mimari için aynıdır ve kalan bloklar farklı katmanlar için değiştirilir ve belirli bir düzende tekrarlanır. 1. blok şu şekilde uygulanabilir:

nn.Conv2d(1,64,kernel_size=2,stride=2,padding=3,bias=False),
nn.BatchNorm2d(64),
nn.ReLU(True)

Bu noktada, bir atlama bağlantımız var. Artık ağların ana fikri budur. Daha önce gördüğümüz mimari diyagram, noktalı ve koyu oklarla bağlantı gösterisini atlamıştı. Noktalı çizgi, öncekinden daha büyük bir kanala geçerken burada olan şeydir. İkinci blok, aşağıdaki kodda gösterildiği gibi çekirdek boyutu 1 * 1 ve iki artık blok ile 3 * 3'lik bir ilk maksimum havuzun uygulanmasına sahiptir. Bu ikisi 64'ü giriş ve çıkış kanalı olarak alır ve mimaride gösterildiği gibi 3 kez tekrarlanır. Sonunda, sonuncusu 2 adımda bir sonraki bloğa bağlanır.

nn.MaxPool2d(1,1), ArtıkBlok(64,64), ArtıkBlok(64,64,2)

Son bloğun içeriği 3 kez tekrarlandı ve mimari diyagramda koyu ok ile giriş ve çıkış kanal boyutunun aynı kaldığını belirtmiştik. Mimari diyagramda gösterilen '/2' bize kullanılan adım hakkında bilgi verir.

Üçüncü blok, 3'lük son bloktan gelen ve 3'lik bir çıkış kanalı veren bir giriş kanalı ile 64*128 çekirdek boyutunu alır. Daha sonra aynı 128'i giriş ve 128'i çıkış kanalı olarak alırız. Bunu daha önceki mimari diyagramda gösterildiği gibi 4 kez tekrarlıyoruz.

ArtıkBlok(64,128), ArtıkBlok(128,128,2)

Buna benzer şekilde çekirdek boyutu olarak 4 ve 5 olan 256. ve 512. bloklarımızı oluşturuyoruz.

ArtıkBlok(128,256), ArtıkBlok(256,256,2)
ArtıkBlok(256,512), ArtıkBlok(512,512,2)

Doğrusal işlevler, bunu nihai olarak, cifar 10 veri setlerini sınıflandırma gibi adımları içerebilen son görevle birleştirmeye yardımcı olur ve fikir, katmanları düzleştirmek ve maksimumu bulmak için olasılıksal bir değer vermektir. Ve blokların her birini bağlamak için tanımladığımız ileri fonksiyon. Eğitim dahil eksiksiz python uygulaması için buna başvurabilirsiniz. Web sitesi. Pytorch'un transfer öğrenme tekniğini de kullanabiliriz ve bu kod için bu GitHub'a başvurabilirsiniz. repo.

Sonuç:

Referans:

  1. https://www.kaggle.com/khoongweihao/resnet-34-pytorch-starter-kit
  2. https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types

Benim hakkımda: Derin Öğrenme ve Doğal Dil İşleme alanıyla ilgilenen ve şu anda Yapay Zeka alanında yüksek lisans yapmakta olan bir Araştırma Öğrencisiyim.

Resim Kaynak

  1. Resim 1,2: https://towardsdatascience.com/the-vanishing-gradient-problem-69bf08b15484
  2. Resim 3,4: https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types
  3. Önizleme Resmi: https://www.zdnet.com/pictures/10-cool-robots-at-this-years-robobusiness-conference/2/

Benimle bağlantı kurmaktan çekinmeyin:

  1. Linkedin: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2. Github: https://github.com/Siddharth1698

ResNet-34'te bu makalede gösterilen medya, Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.

Kaynak: https://www.analyticsvidhya.com/blog/2021/09/building-resnet-34-model-using-pytorch-a-guide-for-beginners/

Zaman Damgası:

Den fazla Analitik Vidhya