İçindekiler[Saklamak][Göstermek]
Beyin, sinir ağları ile karşılaştırılabilir. Bu, genellikle konuya yeni başlayan birinin makine öğrenimi ve yapay sinir ağlarının arkasındaki fikirleri anlamasına yardımcı olmak için kullanılan analojidir.
Perde arkasında devam eden birkaç matematiksel ve istatistiksel hesaplama katmanı olduğundan, bu ağları matematiksel bir fonksiyon olarak tanımlamak daha gelişmiş bir yöntemdir.
Bu, makine öğrenimiyle gerçekten ilgilenen ve Python sinir ağı kodunun nasıl yazıldığını görmek isteyenler içindir.
Bu makalede, tamamen bağlı bir derin sinir ağının (DNN) sıfırdan nasıl oluşturulacağını göstereceğiz. Python 3.
Python Sinir Ağı Kodumuzun Dosya Yapısına Genel Bir Bakış
Burada oluşturulan üç dosya olacak. İlki, "Yardımcı İşlevleri Ayarlama" ve "Sıfırdan Sinir Ağı Oluşturma" bölümlerinde tartışılacak olan basit nn.py dosyasıdır.
Ayrıca, "MNIST Verilerini Yükleme" bölümünde açıklandığı gibi, test verilerini yüklemek için mnist loader.py adlı bir dosyamız olacak.
Son olarak, sinir ağımızı test etmek için terminalde başlatılacak olan test.py adında bir dosyamız olacak.
Bu dosya "Çalışan Testler" bölümünde ayrıntılı olarak açıklanmıştır.
Montaj
Bu öğreticiyi takip etmek için NumPy Python kitaplığı indirilmelidir. Bunu terminalde aşağıdaki komutu kullanarak gerçekleştirebilirsiniz:
Modülleri İçe Aktarma ve Yardımcı işlevini ayarlama
İhtiyacımız olan sadece iki kitaplık rastgele ve hemen içe aktaracağımız NumPy. Sinir ağımızın başlangıç ağırlıkları için rastgele kitaplığı kullanarak bunları karıştıracağız.
Hesaplamalarımızı hızlandırmak için NumPy veya np kullanacağız (geleneksel olarak, genellikle np olarak içe aktarılır). İthalatlarımızdan sonra iki yardımcı fonksiyonumuz yapılacaktır. İki sigmoid işlevi: bir ve sigmoid asal.
Lojistik regresyon, sigmoid fonksiyonunu kullanarak verileri sınıflandırırken, geri yayılım, sigmoid asal fonksiyonunu kullanarak delta veya gradyanı hesaplayacaktır.
Ağ Sınıfı Oluşturma
Tamamen bağlantılı bir sinir ağı oluşturmak bu bölümün tek odak noktasıdır. Ağ sınıfı, sonraki tüm işlevleri kapsayacaktır. Object() { [yerel kod] } işlevi başlangıçta ağ sınıfımızda oluşturulacaktır.
Bir bağımsız değişken, boyutlar, Object() { [yerel kod] } işlevi için gereklidir. Boyutlar değişkeni, sinir ağımızın her katmanında bulunan giriş düğümlerinin sayısını temsil eden sayısal değerler topluluğudur.
__init__ yöntemimizde dört özelliği başlatıyoruz. Girdi değişkenleri, boyutlar, sırasıyla katman boyutlarının listesini ve katman sayısını, katman sayısını ayarlamak için kullanılır.
İlk adım, giriş katmanını takip eden her katmana ağımızın ilk önyargılarını rastgele atamaktır.
Son olarak, girdi ve çıktı katmanları arasındaki her bir bağlantının rastgele oluşturulmuş ağırlıkları vardır. Np.Random.Randn(), bağlam için normal dağılımdan alınan rastgele bir örnek verir.
İleri Besleme İşlevi
Bir sinir ağında, bilgi ileri besleme işlevi tarafından ileriye gönderilir. Mevcut aktivasyon vektörünü gösteren bir argüman, a, bu fonksiyon için gerekli olacaktır.
Bu işlev, ağdaki tüm önyargıları ve ağırlıkları yineleyerek her katmandaki etkinleştirmeleri tahmin eder. Verilen cevap, son katmanın aktivasyonları olan tahmindir.
Mini Toplu Degrade İniş
Ağ sınıfımızın çalışma gücü Gradient Descent'tir. Bu versiyonda, gradyan inişinin değiştirilmiş bir varyasyonu olan mini toplu (stokastik) gradyan inişi kullanıyoruz.
Bu, modelimizi güncellemek için küçük bir grup veri noktasının kullanılacağını gösterir. Bu yönteme dört gerekli ve bir isteğe bağlı argüman iletilir. Gerekli dört değişken, eğitim veri seti, dönem sayısı, mini partilerin boyutu ve öğrenme oranıdır (eta).
Test verileri istek üzerine mevcuttur. Sonunda bu ağı değerlendirdiğimizde test verilerini sağlayacağız. Bu fonksiyondaki örnek sayısı, eğitim verileri bir liste tipine dönüştürüldüğünde başlangıçta listenin uzunluğuna ayarlanır.
Aynı işlemi, verilen verileri test etmek için de uyguluyoruz. Bunun nedeni, bize liste olarak geri gönderilmek yerine, aslında listelerin zipleridir. MNIST veri örneklerini daha sonra yüklediğimizde, bununla ilgili daha fazla şey öğreneceğiz.
Her iki tür veriyi de liste olarak sağladığımızdan emin olabilirsek, bu tip döküm mutlaka gerekli değildir.
Verilere sahip olduğumuzda, bir döngü içinde eğitim dönemlerini gözden geçiririz. Bir eğitim dönemi, sinir ağı eğitiminin yalnızca bir turudur. Mini partilerin bir listesini yapmadan önce rastgeleliği sağlamak için her bir çağdaki verileri karıştırıyoruz.
Aşağıda açıklanan mini toplu iş güncelleme işlevi, her bir mini toplu iş için çağrılacaktır. Test verileri mevcutsa, test doğruluğu da iade edilecektir.
Maliyet türevi yardımcı işlevi
Geri yayılım kodunu gerçekten oluşturmadan önce, maliyet türevi adlı bir yardımcı fonksiyon geliştirelim. Çıktı katmanımızda bir hata yaparsak, maliyet türev fonksiyonu bunu gösterecektir.
İki girdi gerektirir: çıktı etkinleştirme dizisi ve beklenen çıktı değerlerinin y koordinatları.
Geri yayılım işlevi
Mevcut aktivasyon vektörümüz, aktivasyon ve ayrıca diğer aktivasyon vektörleri, aktivasyonlar ve z-vektörleri, zs, hepsi akılda tutulmalıdır. İlk önce giriş katmanı adı verilen bir katman etkinleştirilir.
Onları yerleştirdikten sonra her bir önyargı ve ağırlık üzerinden geçeceğiz. Her döngü, ağırlıkların ve aktivasyonun nokta ürünü olarak z vektörünün hesaplanmasını, zs listesine eklenmesini, aktivasyonun yeniden hesaplanmasını ve güncellenmiş aktivasyonun aktivasyon listesine eklenmesini içerir.
Son olarak, matematik. zs vektörlerinin son elemanının sigmoid üssü ile çarpılan önceki katmandaki hataya eşit olan delta, geriye doğru geçişimize başlamadan önce hesaplanır.
Nabla b'nin son katmanı delta olarak ayarlandı ve nabla w'nin son katmanı, deltanın nokta ürünü ve sondan ikinci aktivasyon katmanı olacak şekilde ayarlandı (aktarmalı, böylece matematiği gerçekten yapabiliriz) .
İkinci kat ile başlayıp son kat ile bitirerek eskisi gibi ilerliyoruz ve bu son katları tamamladıktan sonra işlemi tekrarlıyoruz. Nablalar daha sonra bir demet olarak geri verilir.
Mini toplu gradyan inişi güncelleniyor
Daha önceki SGD (stokastik gradyan iniş) yöntemimiz mini toplu güncellemeyi içeriyor. SGD'de kullanıldığı ve aynı zamanda backprop gerektirdiği için bu işlevi nereye koyacağımı tartıştım.
Sonunda burada yayınlamaya karar verdim. Tıpkı backprop fonksiyonumuzun yaptığı gibi, önyargıların ve ağırlıkların nablalarının 0 vektörünü oluşturarak başlar.
İki girdisi olarak mini parti ve eta öğrenme oranını gerektirir. Mini partide, daha sonra her bir x girdisi ve y çıktısı için her nabla dizisinin deltasını elde etmek için backprop işlevini kullanırız. Nabla listeleri daha sonra bu deltalarla güncellenir.
Son olarak, ağın ağırlıklarını ve önyargılarını güncellemek için öğrenme oranını ve nablaları kullanırız. Her değer, en son değere güncellenir, öğrenme oranı çıkarılır, mini parti boyutuyla çarpılır ve ardından nabla değerine eklenir.
Değerlendir işlevi
Değerlendirme işlevi, yazmamız gereken son işlevdir. Test verileri bu fonksiyon için tek girdidir. Bu fonksiyonda, sadece ağın çıktılarını beklenen sonuç olan y ile karşılaştırırız. Girişi x, ileri besleyerek ağın çıkışları belirlenir.
Kodu tamamla
Tüm kodları birleştirdiğimizde bu şekilde karşımıza çıkıyor.
Sinir Ağının Test Edilmesi
MNIST verileri yükleniyor
The MNIST verileri .pkl.gz formatındadır, GZIP ile açıp turşu ile yükleyeceğiz. Bu verileri, eğitim, doğrulama ve test verilerine bölünmüş, üç boyutlu bir demet olarak yüklemek için hızlı bir yöntem yazalım.
Verilerimizi yönetmeyi kolaylaştırmak için, y'yi 10 öğeli bir diziye kodlamak için başka bir işlev yazacağız. Dizi, görüntünün uygun basamağıyla eşleşen 0 dışında tümü 1 olacaktır.
Verilerimizi okunabilir bir biçime yüklemek için temel yükleme verilerini ve bir sıcak kodlama yöntemini kullanacağız. x değerlerimizi görüntünün 784 pikseliyle eşleşen 784 boyutlu bir listeye ve y değerlerimizi tek sıcak kodlanmış vektör biçimine dönüştürecek başka bir işlev yazılacaktır.
Sonra x ve y değerlerini bir indeks diğeriyle eşleşecek şekilde birleştireceğiz. Bu, eğitim, doğrulama ve test veri kümeleri için geçerlidir. Daha sonra değiştirilen verileri döndürürüz.
Koşu Testleri
Teste başlamadan önce hem daha önce kurduğumuz sinir ağını (simple nn) hem de MNIST veri seti yükleyicisini içe aktaracak “mnist yükleyici” adında yeni bir dosya yapacağız.
Bu dosyada tek yapmamız gereken verileri içe aktarmak, giriş katmanı boyutu 784 ve çıktı katmanı boyutu 10 olan bir ağ oluşturmak, eğitim verileri üzerinde ağın SGD işlevini çalıştırmak ve ardından test verilerini kullanarak test etmektir.
Girdi katmanları listemiz için 784 ile 10 arasındaki sayıların herhangi birinin ne olduğunun bir önemi olmadığını unutmayın. Diğer katmanları istediğimiz gibi değiştirebiliriz; sadece giriş ve çıkış boyutları sabittir.
Üç katman gerekli değildir; dört, beş, hatta sadece iki tane kullanabiliriz. Deneyerek iyi eğlenceler.
Sonuç
Burada Python 3 kullanarak sıfırdan bir sinir ağı oluşturuyoruz. Üst düzey matematiğin yanı sıra uygulamanın özelliklerini de tartıştık.
Yardımcı işlevleri uygulayarak başladık. Nöronların çalışması için sigmoid ve sigmoid asal fonksiyonlar çok önemlidir. Ardından, verileri sinir ağına beslemek için temel süreç olan ileri besleme işlevini uygulamaya koyduk.
Ardından, sinir ağımızı çalıştıran motor olan Python'da gradyan iniş işlevini oluşturduk. "Yerel minimumları" bulmak ve ağırlıklarını ve önyargılarını optimize etmek için sinir ağımız gradyan inişini kullanır. Geri yayılım işlevini kullanarak oluşturduk dereceli alçalma.
Bu işlev, çıktılar uygun etiketlerle eşleşmediğinde güncellemeler sunarak sinir ağının "öğrenmesini" sağlar.
Son olarak, yepyeni Python'umuzu koyduk sinir ağı MNIST veri setini kullanarak teste. Her şey sorunsuz çalıştı.
Mutlu Kodlama!
Yorum bırak