Özel | Bu makale sizi evrişimli sinir ağlarının gerçek savaşına götürür (veri seti öğrenme materyalleri ile)

Orijinal başlık: Tensorflow ve Keras'ta pratik bir kullanım durumu ile derin Evrişimli Sinir Ağlarını Anlamak

Yazar: Ahmed Besbes

Çeviri: Su Jinliu

Düzeltme: Han Haichou

Bu makalenin uzunluğu 10451 kelime , Okumanız tavsiye edilir 10 dakika

Bu makale, veri kümeleri ve uygulama durumları aracılığıyla evrişimli sinir ağlarını ayrıntılı olarak analiz eder ve gerçek savaş için Keras ve Tensorflow'u nasıl kullanacağınızı öğretir.

Derin öğrenme şu anda en popüler yapay zeka konularından biridir. Kısmen biyolojik yoruma dayalı bir algoritmalar koleksiyonudur ve bilgisayarla görme, doğal dil işleme ve konuşma tanıma gibi birçok alanda şaşırtıcı sonuçlar göstermiştir.

Son beş yılda, derin öğrenme birçok endüstriyel alana yayıldı.

Tesla sürücüsüz arabalar, Facebook fotoğraf etiketleme sistemi, Siri ve Cortana gibi sanal asistanlar, sohbet robotları ve nesne tanıma kameraları gibi birçok yeni teknolojik atılım derin öğrenmeden kaynaklanıyor. içinde Dil anlama ile Görüntü analizi Biliş alanında derin öğrenme insan seviyesine ulaşmıştır.

Aşağıdaki örnek, derin öğrenme algoritmalarının neler yapabileceğinin iyi bir örneğidir: sahnedeki farklı nesneleri otomatik olarak tanıyın ve işaretleyin.

Derin öğrenme medyada ortak bir konu haline geldi.

Bu makaledeki ana akım medyanın abartılı içeriğini atlayacağım ve size derin öğrenmenin pratik uygulama örneklerini göstereceğim.

Görüntü tanıma ve sınıflandırmada% 90 doğruluk sağlayan derin bir sinir ağının nasıl kurulacağını size göstereceğim. Derin ağların, özellikle evrişimli sinir ağlarının (CNN) ortaya çıkmasından önce, görünüşte basit olan bu sorun, bilgisayar bilimcilerini yıllarca rahatsız etti.

Bu makale dört bölüme ayrılmıştır:

1. Görüntü sınıflandırmasının karmaşıklığını açıklamak için veri setlerini ve uygulama durumlarını sunun

2. Evrişimli sinir ağını ayrıntılı olarak açıklayın. İç mekanizmasını analiz edin ve görüntü sınıflandırmada sıradan sinir ağlarına göre üstünlüğünü açıklayın.

3. Güçlü GPU'lu AWS EC2 bulut sunucusuna dayalı olarak özel bir derin öğrenme ortamı oluşturun

4. İki derin öğrenme modelini eğitin: biri Keras ve Tensorflow'u uçtan-uca bir ardışık düzende sıfırdan kullanmak, diğeri ise büyük bir veri kümesinde önceden eğitilmiş bir ağ kullanmaktır.

Bu parçalar birbirinden bağımsızdır. Teori ile ilgilenmiyorsanız, birinci ve ikinci bölümleri atlayabilirsiniz.

Derin öğrenme çok zor bir konudur. Bir makine öğrenimi uygulayıcısı olarak bu konuyu anlamam uzun zaman aldı. Daha önce gördüğüm öğrenme materyallerini bu makalenin sonunda paylaşacağım, böylece kendinize de öğretebilir ve derin öğrenme yolculuğunuza başlayabilirsiniz.

Bu makale, sinir ağları alanındaki tüm bilgilerimi entegre etme girişimidir. Okurken uygunsuz bir şey bulursanız, lütfen zamanında belirtin. Herhangi bir sorunuz veya yeni fikriniz varsa, lütfen benimle tartışın.

Bu makalenin kodu ve eğitim modeli Github hesabımda (https://github.com/ahmedbesbes/

Tensorflow ve Keras'ta pratik kullanım durumu ile derin Evrişimli Sinir Ağlarını anlama), herkesi kontrol etmeye ve değiştirmeye hoş geldiniz.

Başlayalım.

1. İlginç bir örnek: kedileri köpeklerden nasıl ayırt edebilirim?

Derin öğrenme modellerini karşılaştırmaya adanmış birçok resim koleksiyonu vardır. Bu makalede seçilen fotoğraf koleksiyonu "Kaggle Cats and Dogs War" (https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition). İsminden de tahmin edebileceğiniz gibi, bu kedi ve köpeklerin resimlerinden oluşan bir koleksiyon.

Diğer Kaggle yarışmalarında olduğu gibi, iki klasörümüz olacak:

  • Egzersiz verileri klasörü: 25.000 kedi ve köpek resmi içerir. Her resim dosya adıyla işaretlenir. Modelimizi eğitmek ve doğrulamak için kullanacağız.

  • Test veri klasörü: Sayısal kimliğe göre adlandırılmış 12.500 resim içerir. Veri setindeki her fotoğraf için, resimdeki hayvanın köpek olma olasılığını tahmin edin (1 köpek, 0 kedi anlamına gelir). Uygulamada, modeli Kaggle'ın liderlik tablosunda puanlamak için kullanılır.

Gördüğünüz gibi farklı çözünürlüklerde, çekim açılarında ve odak uzunluklarında birçok fotoğrafımız var. Tüm kedi ve köpeklerin oturarak veya ayakta, mutlu, üzgün, uyuyan veya havlayan farklı şekilleri, konumları ve renkleri vardır.

Özellikler sonsuz olabilir. Ancak insanlar sahnedeki evcil hayvanları bir grup farklı fotoğrafta kolayca tanıyabilir. Ancak bu, makineler için basit değildir. Otomatik sınıflandırma, kedi ve köpeklerin özelliklerinin nasıl güçlü bir şekilde tanımlanacağını bilmeyi gerektirir. Her hayvanı tanımlayabilecek temel özellikleri bilmeniz gerekir.

Derin sinir ağı, sınıflandırma görevlerinde birden çok katmanda kategori özelliklerini ayıklama kabiliyeti nedeniyle görüntü sınıflandırmada çok etkilidir ve bozulmaya ve basit geometrik deformasyona direnebilir.

Derin sinir ağı bunu nasıl yapıyor?

2. Tam bağlantılı ağ ve evrişimli sinir ağı

Çoğu kişi, başlangıçta görüntü sınıflandırma sorununu çözmek için tamamen bağlı bir ağ seçecektir. Ancak, yavaş yavaş bu tür bir ağın tam bir görev olmadığını keşfettiler.

İş yapmanın en iyi yolu.

Bunun neden böyle olduğunu inceleyelim.

2.1 Tamamen bağlı (FC) bir sinir ağı

Tamamen bağlı bir sinir ağı, bitişik katmanlar arasındaki her nöronun birbirine bağlı olduğu bir ağdır. Standart bir geleneksel sinir ağı mimarisidir. Sinir ağlarının ardındaki ilkeler hakkında daha fazla bilgi edinmek için lütfen Andrej Karpathy'nin Stanford Üniversitesi'ndeki harika ders notlarına bakın ( sinir ağları-2 /).

Açıklama kolaylığı için, aşağıda üç katmanlı gizli katman tamamen bağlı bir sinir ağı verilmiştir.

Tamamen bağlı bir ağ kullanılarak, resim önce tek boyutlu bir vektöre dönüştürülecek ve ardından bir giriş olarak ağa girilecektir.

Örneğin, 256x256 renkli bir fotoğraf, içerik bir (255, 255, 3) nesnedir, 3, 256 x 256 x 3 = 196608 vektöre dönüştürülen renk kanallarının sayısını ifade eder. Yaptığımız şey, görüntüyü uzun bir vektöre dönüştürmek, vektörün her bir öğesi bir piksel değeridir.

Bir dizi 256x256 renkli fotoğrafı analiz etmek için tamamen bağlı bir ağ kullanarak şunları elde edebiliriz:

  • Her nöronun bir piksel değerini kodladığı 196608 boyutunda bir girdi katmanı

  • 2 boyutunda bir çıktı katmanı ve her nöron tahmini çıktı kategorisini gösterir

  • Gizli katman ve gizli nöronlar

Tamamen bağlı ağ, iyi bir sınıflandırma aracıdır. Denetimli algoritmalar alanında, karmaşık doğrusal olmayan kalıpları öğrenebilir ve güçlü bir özetleme yeteneğine sahiptir.Elbette, öncül, mimarinin kararlı olması ve aşırı uygun veri olmamasıdır.

Resimleri işlemek için, tamamen bağlı bir ağ en uygun araç değildir.

İki ana sebep var:

1. 1000 gizli birim içeren bir gizli katman varsayalım.Giriş katmanının boyutu düşünüldüğünde 1000 makul bir değerdir. Bu durumda, giriş katmanını ve ilk gizli katmanı bağlayan parametrelerin sayısı 196608 x 1000 = 196608000'e ulaşır! Bu sadece çok büyük bir sayı sorunu değildir. Sinir ağları genellikle kararlılığı sağlamak için birden fazla gizli katman gerektirdiğinden, ağ imkansızdır İyi çalışıyor. Dürüst olmak gerekirse, ağ böyle gizli bir katmana ve 1000 gizli birime sahip olabilir ki bu gerçekten iyi. Ama depolama maliyetini hesaplayalım. Bir parametre 8 baytlık bir kayan değerdir, 196698000 parametreleri 1572864000 bayttır, yaklaşık 1.572 GB . Bu yüzden sadece ilk gizli katmanın parametrelerini depolamak için 1.572 GB'ye ihtiyacımız var. Bilgisayarınızın RAM'i çok büyük olmadıkça, bu çözüm kesinlikle ölçeklenebilir değildir.

2. Tamamen bağlı bir ağ kullanarak, resmin doğasında bulunan uzamsal yapı bilgisini kaybedeceğiz. Aslında, görüntü bir büyüme vektörüne dönüştürüldükten sonra, her piksel değerinin işlenmesi çok benzerdir. Pikseller arasındaki uzamsal ilişki bulunamıyor. Her piksel aynı rolü oynar. Çok ciddi bir bilgi kaybı olan benzer pikseller arasındaki korelasyonu ve benzerliği kaybettik. Hepimiz bu bilginin modele kodlanabileceğini umuyoruz.

Bu iki sınırlamanın üstesinden gelmek için, genişletilebilen ve görüntü verilerinin karmaşıklığını işlemek için uygun olan yeni bir sinir ağı mimarisi oluşturmaya yönelik çok sayıda çalışma yapılmıştır. .

Böylece yarattık Evrişimli Sinir Ağı (CNN) .

2.2 Evrişimli Sinir Ağı

Evrişimli sinir ağı, görüntü verilerini işlemek için tasarlanmış özel bir sinir mimarisidir. 1989'da LeCun ve arkadaşları tarafından tanıtılmasından bu yana, evrişimli sinir ağları, el yazısı rakam sınıflandırması ve yüz tanımada iyi performans göstermiştir. Geçtiğimiz birkaç yıl içinde, birkaç makale daha zorlayıcı görsel sınıflandırmada da iyi performans gösterdiğini göstermiştir. En ünlüsü, Krizhevsky'nin 2012 ImageNet sınıflandırma testindeki rekor kıran performansıdır.Krişimli sinir ağı modeli AlexNet'in hata oranı yalnızca% 16,4 iken, ikinci sırada% 26,1 hata oranı vardır.

Evrişimli sinir ağları sadece medya abartısı değildir, birçok faktör neden bu kadar çok insanın onunla ilgilendiğini açıklayabilir.

1. Büyük eğitim veri kümesini, milyonlarca etiket örneğini açın. En ünlü veri tabanlarından biri ImageNet'tir.

2. Güçlü GPU performansı, büyük ölçekli model eğitimini mümkün kılar.

3. Çıkarma (https://www.youtube.com/watch?v=UcKPd) gibi iyileştirilmiş model düzenleme stratejisi

AM8cnI).

Evrişimli sinir ağları, görüntü sınıflandırmada çok güçlü bir rol oynar ve daha önce bahsedildiği gibi, tamamen bağlı ağların karşılaştığı iki ana sınırlamayı çözmek için özel olarak tasarlanmıştır.

Evrişimli sinir ağlarının kendi mimarisi ve özellikleri vardır. Standart olarak tamamen bağlı bir ağdan farklı görünse de, ikisinin mekanizması aynıdır. Gizli katmanlar, ağırlık, önyargı, gizli katman nöronları, kayıp fonksiyonları, geri yayılım algoritmaları ve stokastik gradyan inişinden bahsedeceğiz. Bu kavramları çok iyi anlamadıysanız, Andrej Karpathy'nin sinir ağları hakkındaki açıklamasını okuyabileceğinizi umuyorum.

Evrişimli sinir ağları beş temel bölümden oluşur ve bunları anlamak size genel mekanizmanın sezgisel bir anlayışını verecektir.

1. Giriş katmanı

2. Evrişimli katman

3. Aktivasyon işlevi katmanı

4. Havuzlama katmanı

5. Tamamen bağlantılı katman

Her parçayı anlamadan önce, evrişimli sinir ağının mimarisine bir göz atalım.

Gördüğünüz gibi, görüntü ağdaki birden çok işlem katmanından geçecek ve çıktı nöronu her kategorinin beklenen değerini içeriyor.

Her katmanın ilkelerini ayrıntılı olarak tanıtalım.

  • Giriş katmanı

Tamamen bağlı bir ağda, giriş bir nöron vektörü olarak tanımlanır. Resimlerle ilgilenip ilgilenmediğimizden bağımsız olarak, verileri buna dönüştürmek için ayarlamamız gerekiyor.

Evrişimli sinir ağında, resim birçok küçük kare veya nöron olarak kabul edilir ve her nöron bir piksel değerini temsil eder. Evrişimli sinir ağları, temelde resimleri vektörlere sıkıştırmaya gerek kalmadan aslına uygun hale getirebilir.

Aşağıdaki grafik farkı göstermektedir:

  • Evrişimli katman

Evrişimsel katman, evrişimli sinir ağının en önemli parçasıdır. İşlevini açıklamadan önce, evrişimli sinir ağları ile tamamen bağlı ağlar arasındaki bağlantı farkını anlamalıyız. bu nokta çok önemlidir. Ayrıntılandırmama izin verin:

Daha önce de belirtildiği gibi, tamamen bağlı ağ gerçekten "tümüyle bağlantılıdır". Bu, her gizli katmandaki her nöronun bitişik gizli katmandaki tüm nöronlara bağlı olduğu anlamına gelir. Çok boyutlu bir veri noktası bir gizli katmandan başka bir gizli katmana aktığında, gizli katmandaki her bir nöronun aktivasyon durumu, önceki katmandaki tüm nöronların ağırlığı ile belirlenir.

Bununla birlikte, evrişimli sinir ağları ile durum oldukça farklıdır. Tam olarak bağlı değil.

Diğer bir deyişle, gizli katmandaki her bir nöron, önceki gizli katmandaki tüm nöronlara değil, yalnızca önceki gizli katmanın küçük bir parçasına bağlıdır.

Aşağıda bir örnek verilmiştir:

Bu şekilde, birinci gizli katmanın ilk nöronu, giriş katmanının 3x3 piksel alanına bağlanır. Giriş katmanından gizli katmana yapılan bu eşlemeye Özellik haritası . Bu gizli katman nöronu yalnızca 3x3'lük küçük bir alana dayanır ve sonunda bu alanın özelliklerini yakalamayı öğrenecektir.

İlk gizli katmandaki nöronun değeri neyi temsil ediyor? Gri alan, adı verilen bir ağırlık matrisine karşılık gelir Evrişim çekirdek (kernal) Resimde aynı büyüklükte ve aynı alan denir Alıcı alan , İkisi arasındaki evrişimin sonucu, ilk gizli katman nöronunun değeridir.

Arkasındaki işlem çok basittir, yani iki matris arasındaki elemanlar çarpılır ve ardından bir çıktı değeri oluşturmak için eklenir. Yukarıdaki örnekte, ilk gizli elemanın değerini elde etmek için 9 çarpılan değeri ekliyoruz.

Nöron, görsel kalıpları yerel algılama alanından öğrenir. Değerini, resimdeki karakteristik bir niteliğin gücünü temsil ediyor olarak düşünebilirsiniz.

Peki diğer gizli katmanlardaki nöronlar nasıl hesaplanır?

İkinci gizli katmanın nöronlarını hesaplamak için, evrişim çekirdeği, giriş görüntüsünde bir birim oturmaktan sağa doğru hareket edecektir. (Adım = 1) , Evrişim yapmak için aynı filtreyi kullanın. Aşağıdaki resme bakın:

Şimdi, evrişim çekirdeğinin tüm resim üzerinde hareket ettiğini, her adımda evrişimin yapıldığını ve çıktı değerinin özellik haritasında saklandığını hayal edebiliriz.

Bu, evrişimli katmanın rolüdür: bir filtre verildiğinde, evrişimli katman, bir özellik haritasını göstermek için giriş katmanını tarar.

Peki evrişim işlemi neyi temsil ediyor? Ortaya çıkan özellik haritası nasıl anlaşılır?

Başlangıçta evrişimli katmanın resimdeki görsel grafikleri yakalayabileceğini söylemiştim. Bu yüzden şimdi kanıtlayacağım.

Veri kümesinden bir kedinin resmini indireceğim, ardından evrişim çekirdeğini değiştirerek birden çok evrişim yapıp sonuçları görselleştireceğim.

Bir fonksiyon tanımlayacağım, girdi olarak evrişim çekirdeğini alacağım, görüntüyü bükeceğim ve ardından orijinal görüntüyü ve evrişimden sonra görüntüyü çizeceğim.

Evrişim çekirdeği küçük bir matristir (yukarıdaki gri kare)

Önce aşağıdaki filtreleri deneyelim:

Buna kutu bulanıklığı denir. Filtre, giriş görüntüsündeki belirli bir piksel değerine uygulandığında, pikseli ve çevreleyen 8 pikseli kesecek ve ortalama piksel değerini hesaplayacaktır. Matematiksel olarak, bu sadece basit bir ortalama alma algoritmasıdır. Görsel olarak, görüntü dönüştürmedeki farkı zayıflatabilir.

Kutu filtreleme yaygın olarak kullanılmaktadır Gürültü giderme .

Kutu filtresini bir kedi resmine uygulayalım ve nasıl çalıştığını görelim.

Kıvrılmış görüntüye yakından bakarsanız, daha pürüzsüz olduğunu ve daha az beyaz piksel (gürültü) olduğunu göreceksiniz.

Şimdi başka bir blok filtresi deneyelim.

Bazı filtreler, özellikle kenarlar gibi resmin bazı ayrıntılarını yakalamak için kullanılır.

Aşağıdaki örnek, resim A'daki dikey değişimin yaklaşık değerini hesaplar.

Beyaz kısım, dikey kenarların varlığını göstererek filtreye daha iyi yanıt verir. Lütfen kedinin sol kulağının kenarının nasıl yakalandığına yakından bakın.

Güzel! Aşağıdaki örnek aynı işlemdir, ancak yön yatay olarak değiştirilmiştir.

Lütfen kedi bıyığı bilgilerinin nasıl yakalandığına daha yakından bakın.

İlk iki filtre gradyan operatörleri. Belli ölçüde resmin iç yapısını belli bir yönde gösterebilirler.

Ancak, G_x ve G_y aşağıdaki formülle birleştirildiğinde:

Daha iyi bir kenar yakalama efekti olacaktır.

Bu, iki basit konvolüsyonun doğrusal olmayan bir kombinasyonu olan Sobel operatörü olarak adlandırılır. Daha sonra, bu tür kenar algılamasını elde etmek için evrişimli katmanın çoklu özellik haritalarını doğrusal olmayan bir şekilde bütünleştirebileceğini göreceğiz.

Ayrıca birçok gelişmiş filtre vardır. Daha fazla bilgi için lütfen Wikipedia'daki talimatlara bakın (https://en.wikipedia.org/wiki/Kernel_(image_

işleme)).

Şimdi, girdideki görsel öğelere karşılık gelen evrişimli bir değer üretmek olan, evrişimli sinir ağındaki evrişimli katmanın rolünü anladık. Çıktı değerinin boyutu küçülebilir, bu nedenle bunu belirli bir özellik girişinin küçültülmüş bir versiyonu olarak düşünebilirsiniz.

Evrişim çekirdeği, evrişimin hangi özelliği aradığını belirler. Özellik algılayıcı olarak işlev görür. Algılamak için birçok filtre düşünebiliriz

Kenarlar, yarım daireler, köşeler vb.

Evrişimli katmanda birden fazla filtre mi var?

Klasik evrişimli sinir ağı mimarisinde, her evrişimli katman genellikle birden fazla filtreye sahiptir. Bazen 10, 16 veya 32 ve bazen daha da fazlaydı. Bu durumda, her bir evrişimli katmanda yaptığımız evrişim sayısı, filtre sayısına eşittir. Buradaki fikir, farklı özellik haritaları oluşturmaktır ve her özellik haritası, resimdeki belirli bir özelliği bulur. Elimizde ne kadar çok filtre varsa, o kadar çok ayrıntı çıkarabiliriz.

Unutmayın, şimdi çıkardığımız bu basit özellikler, daha karmaşık kalıpları tespit etmek için ağda birleştirilecektir.

Peki filtre ağırlığını nasıl seçeriz?

Filtre ağırlığını mevcut veri setinin genel bilgilerine göre hesaplamıyoruz.

Aslında, evrişimli sinir ağlarını eğitirken, filtre ağırlıklarını manuel olarak ayarlamıyoruz. Bu değerler ağdır Otomatik öğrenme nın-nin. Klasik tamamen bağlı ağda geri yayılım algoritması aracılığıyla ağırlıkların nasıl öğrenildiğini hatırlıyor musunuz? Evet, aynı prensip evrişimli sinir ağları için de geçerlidir.

Her katman için büyük bir ağırlık matrisi belirlediğimizden değil, evrişimli sinir ağı filtre ağırlıklarını öğrenir. Başka bir deyişle, sınıflandırma hatasını azaltmak için ağırlığı rastgele değerden ayarladığımızda, ağ ilgilendiğimiz nesnenin özelliklerini bulmak için uygun olan doğru filtreyi bulacaktır. Bu, tüm süreci altüst eden etkili bir düşünce çizgisidir.

Evrişimli sinir ağlarının hem bulaşıcı hem de gizemli olduğunu görüyorum. Aşağıdakiler, ilk evrişimli sinir ağı, yani ünlü AlexNet tarafından öğrenilen üç özellik haritasıdır.

Daha garip şekiller oluşturmak için basit kenarlardan unsurları çıkarmanın ne kadar karmaşık olduğuna dikkat edin.

Kilo paylaşımı?

Özellik haritası yalnızca bir filtre tarafından oluşturulur. Tüm gizli katman nöronları aynı ağırlığı paylaşır çünkü aynı filtre tüm nöron değerlerini oluşturur. Bu ağırlık paylaşımıdır. Bu özellik, öğrenilen parametrelerin sayısını büyük ölçüde azaltır, böylece evrişimli sinir ağlarının eğitim hızını artırır.

Eğitim hızını iyileştirmenin yanı sıra, paylaşılan ağırlıklar kavramı, aynı görsel desenin resmin farklı alanlarında birden çok kez görüneceği gerçeğine dayanmaktadır, bu nedenle tüm resmi algılamak için aynı filtreyi kullanmak mantıklıdır.

  • Aktivasyon fonksiyonu katmanı

Özellik haritaları evrişimli katmandan çıkarıldıktan sonra, bir sonraki adım onları etkinleştirme işlevi katmanına taşımaktır. Aktivasyon işlevi katmanı, birlikte çalışmak için genellikle evrişimli katmana bağlıdır.

Etkinleştirme işlevi katmanı, özellik haritası için etkinleştirme işlevini kullanır, böylece tüm negatif değerler 0 olur. Bu işlemin çıktısına revize edilmiş özellik haritası denir.

Aktivasyon fonksiyonunun iki ana avantajı vardır:

  • Ağa doğrusal olmama durumu katarlar. Aslında, şimdiye kadar bahsedilen işlemlerin tümü doğrusaldır, örneğin evrişim, matris çarpımı ve toplama gibi. Doğrusal olmamamız yoksa, sonunda doğrusal bir model elde ederiz ve sınıflandırma görevini tamamlayamayız.

  • Gradyanların kaybolmasını önleyerek eğitim sürecini iyileştirirler.

Aşağıda, işlev etkinleştirme katmanının resmin görsel görüntüsünü nasıl etkilediği anlatılmaktadır.

  • Havuz tabakası

Revize edilen özellik haritası artık havuz katmanına geliyor. Havuzlama, özellik haritalarının boyutsallığını azaltabilen bir alt örnekleme işlemidir.

En yaygın havuzlama işlemi Max-pooling'dir. Genellikle 2x2 olan küçük bir pencere seçer, gözden geçirilmiş özellik haritası üzerinde 2 adım adım kayar ve her adımda maksimum değeri alır.

Örneğin, 10x10 revize edilmiş bir özellik haritası 5x5 çıktıya dönüştürülecektir.

Maksimum havuzun birçok avantajı vardır:

  • Özellik haritasının boyutu küçültülür ve eğitim parametrelerinin sayısı azaltılır, böylece aşırı uydurma kontrol edilir.

  • Özellik haritasını sıkıştırmak için en önemli özellikleri edinin.

  • Giriş görüntüsünün deformasyonu, bozulması ve ötelenmesi ağda değişmezdir ve küçük girdi bozulması, maksimum değeri aldığımız için havuzlamanın çıktısını değiştirmez.

Max-pooling özellikle sezgisel değildir. Anladığıma göre şu şekilde özetliyorum:

Kenar gibi bir özellik tespit edilirse, örnek olarak yukarıdaki örnekteki 2x2 kırmızı kareyi alın.Özelliği hangi piksellerin ortaya çıkardığı umurumuzda değil. Bunun yerine, yalnızca maksimum değeri çıkarırız ve bunun görsel bir özelliği temsil ettiğini varsayarız. Bu yöntem cesur görünüyor, çünkü birçok uzamsal bilgi atıldı. Ama aslında oldukça etkilidir ve pratikte iyi performans gösterir. Elbette bu 4x4 resim örneğini önemsemenize gerek yok. Görece yüksek çözünürlüklü resimlere maksimum havuzlama uygulandığından, ana uzamsal bilgiler korunur ve yalnızca önemsiz ayrıntılar atılır. Bu nedenle maksimum havuz, fazla takmayı önleyebilir. Ağın resimdeki en alakalı bilgilere odaklanmasını sağlar.

  • Tamamen bağlı katman

Evrişimsel sinir ağları da tamamen bağlantılı bir katmana sahiptir, bu da klasik tam bağlantılı ağlarda gördüğümüz şeydir. Genellikle ağın sonundadır ve son havuz katmanı bir vektör halinde düzleştirilmiş ve çıktı katmanına tam olarak bağlanmıştır. Çıktı katmanı, aynı boyut ve sayıda kategoriye sahip bir tahmin vektörüdür.

Hala tüm çerçeve hakkında bir izleniminiz varsa, şunu girin: > kıvrım > Fonksiyon aktivasyonu- > Maksimum havuzlama, ardından son olarak çıktıya tam olarak bağlı bir katman ekleyin. Temel parçaları bütünleştiren tam bir küçük evrişimli sinir ağı elde edeceksiniz.

Şöyle görünüyor:

Buradaki düzleştirme katmanının, önceki havuz katmanının vektörleştirilmesinin sonucu olduğuna dikkat edin.

Neden tamamen bağlantılı bir katmana ihtiyacımız var?

Tamamen bağlantılı katman oyunları sınıflandırma Ve önceki katmanların hepsi Özellikleri ayıkla .

Sıkıştırılmış evrişim, revizyon ve havuzlama ürünlerini aldıktan sonra, tamamen bağlı katman, sınıflandırmayı uygulamak için bunları entegre eder.

Sınıflandırmaya ek olarak, tamamen bağlantılı bir katman eklemek de bu özelliklerin doğrusal olmayan kombinasyonunu öğrenmenin bir yoludur. Evrişimli katmandan ve havuz katmanından gelen özelliklerin çoğu sınıflandırmayı zaten tamamlayabilir, ancak bu özellikler entegre edildikten sonra etki daha iyi olacaktır.

Tamamen bağlı katmanı, ağa eklenen ek bir çıkarma olarak düşünün.

sonuç olarak

Şimdiye kadar bahsedilen katmanları özetleyelim.

Zemin

Özellikleri

Giriş katmanı

Giriş resmi, alan yapısı bilgilerini kaydedin

Evrişimli katman

Girişten belirli bir modele karşılık gelen özellik haritalarını çıkarın

Fonksiyon aktivasyon katmanı

Ağa doğrusal olmayanlık katmak için negatif piksel değerini 0 olarak ayarlayın

Maksimum havuz katmanı

Aşağı örnekleme, özellik eşlemesini revize eder, boyutluluğu azaltır ve fazla uydurmayı önlemek için önemli özellikleri korur.

Tamamen bağlı katman

Doğrusal olmayan özellik kombinasyonunu öğrenin ve sınıflandırmayı uygulayın

Klasik tamamen bağlantılı bir mimaride, her türden yalnızca bir tane olmayacaktır. Aslında, iki ardışık evrişim havuzu katmanına sahip bir ağı düşünürseniz, ikinci evrişimin resmin sıkıştırılmış bir versiyonunu elde etmek olduğunu ve resmin belirli bir özelliği içerdiğini bileceksiniz. Bu nedenle, ikinci evrişimli katmanı, hala birçok uzamsal yapı bilgisini tutan orijinal girdi görüntüsünün soyut sıkıştırılmış bir versiyonu olarak kullanabilirsiniz.

Sınıflandırmayı uygulamadan önce doğrusal olmayan özellik kombinasyonlarını öğrenebilmemiz için genellikle 2 ila 3 tam bağlantılı katman belirleriz.

Bu noktada Andrej Karpathy'den alıntı yapabilirsiniz:

Evrişimsel sinir ağı mimarisinin en yaygın biçimi, birkaç evrişim işlevi etkinleştirme katmanı katmanını ve ardından havuz katmanını içerir ve bu yapı, görüntü tamamen küçük bir boyutta birleştirilene kadar tekrarlanır. Belli bir aşamada, tamamen bağlantılı bir katmana geçiş normaldir. Tamamen bağlı son katman, kategori değerleri gibi çıktıları tutar. Başka bir deyişle, en yaygın evrişimli sinir ağı mimarisi bu forma izin verir:

Artık evrişimli sinir ağlarının temel parçalarını bildiğimize göre, klasik bir ağa bir göz atalım.

  • LeNet5

Aşağıdaki, çok ünlü bir evrişimli sinir ağıdır. LeNet5 LeCun ve arkadaşları tarafından 1998'de tasarlanmıştır.

Bu ağ mimarisini açıklamama izin verin. Elbette önce kendin analiz etmeyi deneyebileceğini umuyorum.

  • Giriş katmanı: 32x32 gri tonlamalı bir görüntü, bir renk kanalı

  • Evrişimli katman n ° 1: Resmin altı adet 28x28 özellik haritası oluşturması için altı adet 5x5 filtre kullanılmıştır Bu katmanın aktivasyon işlevi ReLU değildir.

  • Havuzlama katmanı: Bu 628x28 özellik haritası, 614x14 havuz oluşturma özelliği haritası oluşturmak için birleştirildiğinde, boyut 1/4 olur.

  • Evrişimli katman n ° 2: 10x10 boyutunda 16 özellik haritası oluşturmak için bu 614x14 özellik haritası için 16 farklı 5x5 filtre kullanılır. Her filtre, 6 matris oluşturmak için 6 girişle birleştirilir ve toplam 16 özellik haritası olan bir özellik haritası oluşturmak için toplanır.

  • Havuzlama katmanı: Bu 1610x10 özellik haritasını 165x5 özellik haritasına toplayın.

  • İlk tamamen bağlantılı katman: 120 nöron içerir ve her nöron 165x5 özellik haritasının tüm piksellerine bağlanır. Bu katman 16x5x5x120 = 48000 öğrenme ağırlığına sahiptir.

  • Tamamen bağlantılı ikinci katman: 84 nöron içeren bu katman bir önceki katmanla tamamen bağlantılıdır ve 120x84 = 10080 öğrenme ağırlıkları vardır.

  • Tamamen bağlı katman: Link çıktı katmanı 84x10 = 840 öğrenme ağırlığına sahiptir.

Daha gelişmiş evrişimli sinir ağı mimarisi

Daha karmaşık ve ayrıntılı evrişimli sinir ağı mimarisiyle ilgileniyorsanız, bu bloga göz atabilirsiniz (https://adeshpande3.github.io/adeshpande3.github.io/The-9-Deep-Learning-Papers-

Bilmeniz Gerekenler.html).

Aşağıda, 2012 ImageNet yarışmasını-AlexNet kazanan evrişimli sinir ağı var.

3. Derin öğrenme için özel bir ortam oluşturun

Derin öğrenmedeki hesaplama miktarı çok büyük. Bunu, dizüstü bilgisayarınızda bir model oluşturmaya hazır olduğunuzda bulacaksınız.

Ancak, GPU'ların kullanımı eğitimi büyük ölçüde hızlandırabilir. Çünkü GPU, matris ürünü gibi paralel görevlerde çok verimli. Sinir ağları tamamen matris ürünleriyle ilgili olduğundan, GPU'ları kullanmak performansı büyük ölçüde artıracaktır.

Dizüstü bilgisayarımda güçlü bir GPU'm yok, bu yüzden Amazon Web Services (AWS) üzerinde bir sanal makine seçtim p2.xlarge . p2.xlarge, Nvidia GPU, 12 GB video depolama, 61 GB RAM, 4vCPU ve 2.496 CUDA çekirdeği ile Amazon EC2 (Amazon Elastic Computing Cloud) bulut sunucusunun bir parçasıdır. Performans çok güçlü, saatte 0,9 dolara mal oluyor.

Elbette daha güçlü örnekler var ama halihazırda işlenecek işler için p2.xlarge kesinlikle yeterli.

Örneğe Deep Learning AMI CUDA 8 Ubuntu Sürümü ile başladım.Daha fazla bilgi için lütfen buna bakın (https://aws.amazon.com/marketplace/pp/B06VSPXKDX). Temel olarak Tensorflow, Theano, Caffe, Keras gibi ihtiyaç duyulan tüm derin öğrenme çerçevelerini içeren ve ayrıca kurulumu çok zor olan GPU sürücülerini içeren bir Ubuntu 16.04 sunucusu kurun.

AWS, projenize hızla başlayabilmeniz için derin öğrenme için size güçlü örnekler ve kullanıma hazır özel ortamlar sağlar. Bu harika.

AWS'ye pek aşina değilseniz aşağıdaki iki gönderiye göz atabilirsiniz.

  • https://blog.keras.io/running-jupyter-notebooks-on-gpu-on-aws-a-starter-guide.html

  • https://hackernoon.com/keras-with-gpu-on-amazon-ec2-a-step-by-step-instruction-4f90364e49ac

Şunları yapmanıza izin verir:

  • Bir EC2 sanal makine oluşturun ve bağlayın

  • Jupyter dizüstü bilgisayarı uzaktan kullanmak için ağ güvenlik özelliklerini ayarlayın

4. Kedi ve köpek sınıflandırıcıları oluşturmak için Tensorfow ve Keras'ı kullanın

Çevre kuruldu. Şimdiye kadar öğrendiğimiz bilgileri gerçek savaşa, yani kedi ve köpek resimlerini sınıflandırmak için evrişimli bir sinir ağı inşa etmeye uygulayabiliriz.

Tensorflow derin öğrenme çerçevesini ve Keras'ı kullanacağız

Keras, Python ile yazılmış yüksek seviyeli bir sinir ağı uygulama programlama arayüzüdür (KPI), TensorFlow'da kullanılabilir,

CNTK ve Theano'da koş. Başlangıçta hızlı deneyleri mümkün kılmak için tasarlandı. Fikirleri gecikmeden sonuca dönüştürmek için uygulama, iyi araştırmanın sırrıdır.

4.1 Sıfırdan evrişimli bir sinir ağı oluşturmak

İlk bölümde, evrişimli bir sinir ağını eğitmek için uçtan uca bir boru hattı inşa edeceğiz. Veri hazırlama, veri seti büyütme, mimari tasarım, eğitim ve doğrulamayı dahil edeceğiz. Eğitim seti ve doğrulama setindeki kayıp ve doğruluk matrisini deneysel olarak test edeceğiz. Bu, tahmin modelini eğiterek durumu iyileştirmemizi sağlar.

Verileri hazırlayın

Evrişimli bir sinir ağı oluşturmaya başlamadan önce ilk şey, Kaggle'dan eğitim setini indirip açmaktır.

Bu verileri, keras'ın kolayca işleyebilmesi için düzenlemeliyiz.

İki alt klasör içeren bir veri klasörü oluşturacağız:

  • tren

  • doğrulama

Bu iki alt klasörün her biri iki klasör içerir.

  • kediler

  • köpekler

Sonunda aşağıdaki klasör yapısına sahibiz:

Böyle bir klasör yapısı, modelimizin eğitim veya doğrulama olup olmadığından hangi klasörden resim ve etiketleri çıkaracağını bilmesini sağlar.

Bir dosya ağacı oluşturmanıza izin veren bir işlev vardır. İki parametresi vardır: toplam resim sayısı n ve doğrulama seti oranı r.

Parametrelerim:

  • n: 25000 (tüm veri seti)

  • r: 0.2

Keras'ı ve bağımlılıklarını indirelim.

Resim oluşturucu ve veri büyütme

Bir modeli eğittiğimizde, tüm veri setini indirip depoda saklamıyoruz. Bu çok verimsizdir, özellikle çalıştırmak için kendi bilgisayarınızı kullanıyorsanız.

ImageDataGenerator işlevini kullanacağız. Eğitim seti ve doğrulama setinden sınırsız sayıda toplu görüntü almanızı sağlar. Her bir resim grubu ağ üzerinden akar, ileri ve geri yayılır ve ardından parametreler doğrulama verilerinin testiyle güncellenir. Ardından bir sonraki resim grubu aynı işleme sahip olacaktır.

ImageDataGenerator nesnesinde (hedef), her bir görüntü grubunu rastgele değiştireceğiz. Bu işleme veri artırma ( veri büyütme ). Daha fazla veri üretebilir, bu nedenle modelimiz hiçbir zaman aynı iki fotoğrafı görmez. Bu, fazla takmayı önler ve modeli daha güçlü hale getirir.

İki ImageDataGenerator nesnesi oluşturacağız.

train_datagen Eğitim seti mi, val_datagen Doğrulama kümesidir. Bu iki montaj, resimlerde distorsiyon ayarlamaları yapacaktır. Ve train_datagen daha fazla ayarlama yapacak.

İlk iki nesneden iki dosya oluşturucu oluşturacağız:

  • train_generator

  • validation_generator

Her bir jeneratör, katalogdan, gerçek zamanlı veri amplifikasyonundan toplu tensör görüntü verileri üretecektir. Ve veriler sonsuz bir yığın halinde dönecek.

Model mimarisi

Üç evrişim / havuzlama katmanı ve iki tamamen bağlı katmana sahip bir evrişimsel sinir ağı kullanacağım. Üç evrişimli katman sırasıyla 32, 32 ve 643x3 filtre kullanır.

Aşırı uydurmayı önlemek için tamamen bağlı iki katmanda bırakma kullanıyorum.

Öğrenme oranı 0.01 ve momentum katsayısı 0.9 olan bir stokastik gradyan iniş optimize edicisi kullanıyorum.

İkili sınıflandırma yaptığımız için ikili entropi maliyet fonksiyonunu kullandım.

Keras, model özetini görüntülemek için uygun bir yol sağlar. Her katman için çıktı şeklini ve eğitim parametrelerinin sayısını gösterecektir.

Bu, modeli takmadan önce kullanılabilirlik testidir:

Ağ mimarisine bir göz atalım:

  • Görsel sunum mimarisi:

Eğitim modeli

Modeli eğitmeden önce, eğitim sırasında geri çağrılacak iki geri arama işlevi tanımladım.

  • Kayıp işlevi doğrulama verilerini iyileştiremediğinde eğitimi zamanında durdurmak için bir geri arama işlevi kullanılır.

  • Kaybı ve doğruluğu doğrulamak için her dönemi (eğitim setindeki tüm örneklerle bir kez eğitim) depolamak için başka bir geri arama işlevi kullanılır. Bu, eğitim hatasını deneysel olarak test etmek için kullanılabilir.

Ayrıca Keras ile mükemmel bir şekilde bütünleşen harika bir ilerleme çubuğu olan keras-tqdm (https://github.com/bstriner/keras-tqdm) kullandım.

Model eğitiminizi kolayca denetlemenizi sağlar.

Yapmanız gereken çok basit, TQDMNotebookCallback'i keras_tqdm'den indirmek ve ardından üçüncü geri arama işlevi olarak kullanmak.

Aşağıdaki, keras-tqdm'nin neye benzediğini gösteren basit bir örnektir.

Eğitim hakkında:

  • Fit_generator yöntemini kullanacağız. Standart bağlantı yönteminin bir çeşididir ve girdi olarak bir jeneratör alır.

  • Modeli 50 dönem eğiteceğiz. Her çağda, 32 fotoğraflık bir grup halinde ağa akan, ileri ve geri yayılma yapan ve ağırlığı ayarlamak için SGD kullanan 20.000 benzersiz güçlendirilmiş fotoğraf olacak. Birden fazla dönem kullanmak, aşırı uydurmayı da önlemektir.

Hesaplama miktarı çok büyük:

  • Kendi dizüstü bilgisayarınızı kullanıyorsanız, her dönem 15 dakika sürecektir.

  • Benim gibi bir p2.xlarge EC2 bulut sunucusu kullanıyorsanız, her dönem yaklaşık 2 dakika sürecektir.

tqdm, kaybı ve doğruluğu doğrulamak için her dönemi denetlemenizi sağlar. Bu, modelin kalitesini kontrol etmek için çok yararlıdır.

Sınıflandırma sonucu

Doğrulama setinde doğruluk oranımız% 89,4'e ulaştı. Eğitim / doğrulama hatası ve doğruluğu aşağıda gösterilmektedir.

Ağ mimarisini tasarlamak için çok fazla zaman harcamadığımı düşünürsek, bu sonuç zaten çok iyi.

Şimdi modeli daha sonra kullanmak üzere kaydedelim.

Aynı tabloda eğitim ve doğrulama kaybını deneyelim:

Doğrulama kaybı, art arda iki dönem boyunca düzelmedi ve eğitimi askıya aldık.

Şimdi eğitim seti ve doğrulama setinde doğruluğu test ediyoruz.

İki matris, bir seviyeye ulaşana kadar artmaya devam eder ve model sonunda aşırı uyumlu hale gelir (epoch34'ten başlayarak).

4.2 Önceden eğitilmiş modeli indirin

Şimdiye kadar her şey yolunda. Doğrulama verileri üzerinde% 89 doğruluk oranıyla iyi performans gösteren belirli bir evrişimli sinir ağı tasarladık.

Ancak, daha iyi bir puan almanın bir yolu var. Kedi ve köpeklerin fotoğraflarını içeren büyük bir veri kümesinde, önceden eğitilmiş evrişimli sinir ağının ağırlıklarını indirin. Böyle bir ağ, sınıflandırmamızla ilgili ilgili özellikleri öğrenmiş olacaktır.

VGG16 ağının ağırlıklarını indireceğim. Daha doğrusu, son evrişimli katmana karşılık gelen ağ ağırlıklarını indireceğim. Ağın bu bölümü, özellik algılama rolünü oynar ve sınıflandırma görevleri için tamamen bağlantılı bir katman ekleyeceğiz.

LeNet5 ile karşılaştırıldığında, VGG16 çok büyük bir ağdır. 16 katmana, eğitilebilir ağırlıklara ve yaklaşık 140 milyon parametreye sahiptir. VGG16 hakkında daha fazla bilgi edinmek için lütfen bu pdf'ye bakın (https://arxiv.org/pdf/1409.1556.pdf).

Önce ImageNet üzerinde eğitilmiş VGG16 ağırlıklarını indiriyoruz. Bu, son üç tam bağlantılı katmanla pek ilgilenmediğimizi gösteriyor.

Özellik temsilini elde etmek için resmi ağa koyduk ve ardından özellik temsilini sinir ağı sınıflandırma aracına girdik.

Bunu eğitim seti ve doğrulama seti için yapıyoruz.

Resimler ağdan geçtiğinde, doğru sırada görüntülenirler. Bu nedenle, etiketleri onlarla kolayca ilişkilendirebiliriz.

Şimdi, VGG16'dan çıkarılan tüm özellikleri evrişimli sinir ağının sınıflandırma parçası olarak ekleyerek, tamamen bağlantılı küçük bir ağ tasarladık.

Sadece 15 çağda doğruluk oranı% 90,7'ye ulaştı. Etkisi çok iyi. Ve dizüstü bilgisayarımda her dönem yalnızca 1 dakika sürüyor.

Pek çok derin öğrenme öncüsü, sınıflandırma görevlerini tamamlamak için önceden eğitilmiş ağların kullanılmasını savunur. Aslında, bu, büyük veri kümeleri üzerinde büyük ölçekli ağ eğitiminden tam olarak yararlanıyor.

Keras, VGG16, GoogleNet ve ResNet gibi önceden eğitilmiş ağları kolayca indirmenize izin verir. Daha fazla bilgi için lütfen buna bakın (https://keras.io/applications/).

sloganı: Yapma. Gereksiz işlerle zaman kaybetmeyin. Önceden eğitilmiş ağı kullanın!

Başka ne yapabiliriz?

Spesifik evrişimli sinir ağlarını geliştirmekle ilgileniyorsanız:

  • Veri kümesine daha fazla veri artırma ekleyin

  • Ağ hiperparametrelerini kullanın: evrişimli katman sayısı, filtre sayısı, filtre boyutu. Her kombinasyonu test etmek için doğrulama veri kümesini kullanın.

  • Optimize ediciyi değiştirin veya iyileştirin

  • Farklı bir maliyet işlevi deneyin

  • Daha tam bağlantılı katmanlar kullanın

  • Daha cesur bir bırakma yaratın

  • https://arxiv.org/pdf/1311.2901.pdf

sonuç olarak

AWS

pythonKeras

  • https://chara.cs.illinois.edu/sites/sp16-cs591txt/files/0226-presentation.pdf

  • +https://cs.stanford.edu/people/karpathy/sfmltalk.pdf

  • https://papers.nips.cc/paper/5782-character-level-convolutional-networks-for-text-classification.pdf

referans:

Zigong Iron Fist "Yedi Yıllık Sorunu", Ağaçlandırmayı Yeşillendiriyor ve 20 km "Ekolojik Bariyer" İnşa Ediyor
önceki
Resimli Wuhan | Luojia Altın Sonbahar Uluslararası Kültür Festivali düzenlendi
Sonraki
Machine Intelligence Accelerator: Büyük Veri Ortamında Bilgi Mühendisliğinin Fırsatları ve Zorlukları
Afet düzeyinde performans! Avrupa yarışmasına 5 takım gitti, sadece 1 takım ileri gitti, sadece Ligue 1 onlardan daha kötüydü
Hua Taohuayuan'ı arıyor Maobian Kitabevi · Taokei Koleji
Evrişimli sinir ağı CNN'yi anlamak için bir makale (çalışma notları)
Avrupa Ligi'nde büyük bir üzüntü daha! 119. dakika geri sayımı seyirci karnavalını öldürüyor, sahne kazanmak gibi
Reformun 40. yıldönümünü anma ve açılış
500 yıldan fazla bir süredir "Shangshudi", Wudi Wu Shifen'in eski konutu "Bahçe Tarzı" olarak restore edildi.
"Yetkilendirme" sergiler de düzenleyebilir Telif hakkı koruması Chengdu'nun kültürel ve yaratıcı gelişimine yardımcı olur
Bulanıklığı kontrol etmek için büyük veri yükseltme önlemleri: "tek boyut her şeye uyar" kazayla yaralanmayı reddetme
Binzhou Araç Yönetim Ofisi, ev kayıt penceresi ... Bahar Şenliği sırasında normal iş
Global Blockchain + Risk Sermayesi Raporu: Rüzgar yükseliyor ve yeni bir teknoloji yatırımı dalgasına öncülük etmesi bekleniyor
Dört büyük Dünya Kupası kalecisinden üçü Şampiyonlar Ligi'nin hayalini kuruyor! Sadece çeyrek finale yükselmek için ana ligden ayrıldı
To Top