1. Genel Bakış
Bu laboratuvarda, konvolüsyon katmanını çiçekleri tanıyabilen bir sinir ağı modeline nasıl yerleştireceğinizi öğreneceksiniz. Bu kez modeli kendiniz sıfırdan oluşturacak ve TPU'nun gücünü kullanarak saniyeler içinde eğitecek ve tasarımını yinelemeyi öğreneceksiniz.
Bu laboratuvar, konvolüsyonel nöral ağlarla ilgili gerekli teorik açıklamaları içerir ve derin öğrenme hakkında bilgi edinen geliştiriciler için iyi bir başlangıç noktasıdır.
Bu laboratuvar, "TPU'da Keres" serisinin 3. bölümüdür. Bunları aşağıdaki sırayla veya ayrı ayrı yapabilirsiniz.
- TPU hızında veri ardışık düzenleri: tf.data.Dataset ve TFRecords
- Transfer öğrenme içeren ilk Keras modeliniz
- [BU LABORATUVAR] Keras ve TPU'larla evrişimli nöral ağlar
- Keras ve TPU'lar ile modern convnet'ler, squeezenet, Xception
Neler öğreneceksiniz?
- Keras sıralı modelini kullanarak evrişimli görüntü sınıflandırıcı oluşturmak için.
- Keras modelinizi TPU'da eğitmek için
- İyi bir kıvrımlı katman seçimiyle modelinizde ince ayar yapmak için.
Geri bildirim
Bu kod laboratuvarında bir sorun görürseniz lütfen bize bildirin. Geri bildirim, GitHub sorunları [geri bildirim bağlantısı] üzerinden gönderilebilir.
2. Google Colaboratory hızlı başlangıç kılavuzu
Bu laboratuvarda Google Collaboratory kullanılır ve herhangi bir kurulum yapmanıza gerek yoktur. Colaboratory, eğitim amaçlı bir online not defteri platformudur. Ücretsiz CPU, GPU ve TPU eğitimi sunar.
Colaboratory'yi tanımak için bu örnek not defterini açıp birkaç hücreyi çalıştırabilirsiniz.
TPU arka ucu seçin
Colab menüsünde Çalışma zamanı > Çalışma zamanı türünü değiştir'i ve ardından TPU'yu seçin. Bu kod laboratuvarında, donanım hızlandırmalı eğitim için desteklenen güçlü bir TPU (Tensör İşleme Birimi) kullanacaksınız. Çalışma zamanına bağlantı, ilk çalıştırma sırasında otomatik olarak kurulur veya sağ üst köşedeki "Bağlan" düğmesini kullanabilirsiniz.
Not defteri yürütme
Bir hücreyi tıklayıp Üst Karakter-ENTER tuşlarını kullanarak hücreleri tek tek yürütün. Ayrıca, Çalışma zamanı > Tümünü çalıştır seçeneğini kullanarak not defterinin tamamını da çalıştırabilirsiniz.
İçindekiler
Tüm not defterlerinde bir içindekiler listesi bulunur. Soldaki siyah oku kullanarak açabilirsiniz.
Gizli hücreler
Bazı hücrelerde yalnızca başlık gösterilir. Bu, Colab'e özel bir not defteri özelliğidir. Üzerlerini çift tıklayarak içindeki kodu görebilirsiniz, ancak bu durum genellikle pek de ilgi çekici değildir. Genellikle işlevleri destekler veya görselleştirmeyi sağlar. İçerideki işlevlerin tanımlanması için bu hücreleri çalıştırmanız gerekir.
Kimlik doğrulama
Yetkili bir hesapla kimlik doğrulaması yapmanız koşuluyla Colab, gizli Google Cloud Storage paketlerinize erişebilir. Yukarıdaki kod snippet'i bir kimlik doğrulama sürecini tetikler.
3. [BİLGİ] Tensor İşleme Birimleri (TPU'lar) nedir?
Özet
Keras'ta TPU'da model eğitme (ve TPU yoksa GPU veya CPU kullanma) kodu:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Bu eğitimde, çiçek sınıflandırıcıyı etkileşimli hızlarda (eğitim çalıştırma başına dakika) oluşturmak ve optimize etmek için TPU'ları kullanacağız.
Neden TPU'lar?
Modern GPU'lar, programlanabilir "çekirdekler" etrafında düzenlenmiştir. Bu, 3D oluşturma, derin öğrenme, fiziksel simülasyonlar gibi çeşitli görevleri gerçekleştirmelerine olanak tanıyan çok esnek bir mimaridir. Öte yandan TPU'lar, bir klasik vektör işlemciyi özel bir matris çarpım birimiyle eşleştirir ve nöral ağlar gibi büyük matris çarpımlarının baskın olduğu tüm görevlerde üstün başarı elde eder.
Görsel: Matris çarpımı olarak yoğun bir nöral ağ katmanı. Bu katmanda, sekiz resimden oluşan bir grup aynı anda nöral ağ üzerinden işlenir. Bir resmin tüm piksel değerlerinin ağırlıklı toplamını gerçekten yaptığını doğrulamak için lütfen bir satır x sütun çarpımı yapın. Kıvrımlı katmanlar, biraz daha karmaşık olsa da matris çarpımları olarak da temsil edilebilir ( açıklama, 1. bölümdeki).
Donanım
MXU ve VPU
TPU v2 çekirdeği, matris çarpımları çalıştıran bir Matris Çarpma Biriminden (MXU) ve etkinleştirmeler, softmax vb. diğer tüm görevler için bir Vektör İşleme Birimi (VPU)ndan oluşur. VPU, float32 ve int32 hesaplamalarını yürütür. Öte yandan MXU, karma hassasiyetli 16-32 bit kayan nokta biçiminde çalışır.
Karma hassasiyetli kayan nokta ve bfloat16
MXU, bfloat16 girişlerini ve float32 çıkışlarını kullanarak matris çarpımlarını hesaplar. Ara toplama işlemleri, float32 hassasiyetinde gerçekleştirilir.
Nöral ağ eğitimi, genellikle azaltılmış kayan nokta hassasiyeti nedeniyle ortaya çıkan gürültüye karşı dayanıklıdır. Gürültünün optimize edicinin yakınlaşmasına bile yardımcı olduğu durumlar vardır. 16 bit kayan nokta hassasiyeti geleneksel olarak hesaplamaları hızlandırmak için kullanılır, ancak float16 ve float32 biçimleri çok farklı aralıklara sahiptir. Hassasiyeti float32'den float16'ya düşürmek genellikle taşma ve taşma sorunlarına neden olur. Bunun için çeşitli çözümler mevcuttur ancak float16'nın çalışması için genellikle ek işlemler gerekir.
Bu nedenle Google, TPU'larda bfloat16 biçimini kullanıma sundu. bfloat16, tam olarak float32 ile aynı üssün bitleri ve aralığına sahip, kesilmiş bir float32'dir. Buna ek olarak TPU'lar, matris çarpımlarını bfloat16 girişleriyle ancak float32 çıkışlarıyla karışık hassasiyetle hesaplıyordur, böylece daha düşük hassasiyetten faydalanmak için genellikle hiçbir kod değişikliği gerekmez.
Sistolik dizi
MXU, veri öğelerinin bir dizi donanım hesaplama birimi üzerinden aktığı "sistolik dizi" mimarisi kullanarak matris çarpma işlemlerini donanımda uygular. (Tıpta "sistolik" terimi, kalp kasılmalarını ve buradan veri akışını ifade eder.)
Matris çarpımının temel öğesi, bir matristeki satır ile diğer matristeki sütun arasındaki nokta çarpımıdır (bu bölümün üst kısmındaki resme bakın). Y=X*W matris çarpımı için sonucun bir öğesi şöyle olur:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
GPU'da bu nokta çarpımı bir GPU "çekirdeği"ne programlanır ve ardından elde edilen matrisin her değerini aynı anda hesaplamaya çalışmak için paralel olarak kullanılabilen tüm "çekirdeklerde" yürütülür. Elde edilen matris 128x128 boyutundaysa 128x128=16K "çekirdek"in kullanılabilir olması gerekir. Bu da genellikle mümkün değildir. En büyük GPU'lar yaklaşık 4.000 çekirdeğe sahiptir. Öte yandan TPU, MXU'daki işlem birimleri için minimum düzeyde donanım kullanır: Yalnızca bfloat16 x bfloat16 => float32
çarpım toplayıcılar, başka bir şey yoktur. Bu üniteler o kadar küçüktür ki bir TPU, 128x128 MXU'da 16.000 tane uygulayabilir ve bu matris çarpımını tek seferde işleyebilir.
Çizim: MXU sistolik dizisi. İşlem öğeleri çarpma toplayıcılardır. Bir matrisin değerleri diziye (kırmızı noktalar) yüklenir. Diğer matrisin değerleri, diziden (gri noktalar) geçer. Dikey çizgiler, değerleri yukarı doğru yayar. Yatay çizgiler kısmi toplamları yayar. Veriler dizi boyunca akarken sağ taraftan çıkan matris çarpımının sonucunu aldığınızı doğrulamak kullanıcıya bırakılmıştır.
Buna ek olarak nokta çarpımları, MXU cinsinden hesaplanırken ara toplamlar, bitişik hesap birimleri arasında geçiş yapar. Bu verilerin bellekte veya bir kayıt dosyasında saklanması ve bu dosyalardan alınması gerekmez. Sonuçta TPU sistolik dizi mimarisi önemli bir yoğunluk ve güç avantajına sahip olmanın yanı sıra matris çarpımlarını hesaplarken GPU'ya göre göz ardı edilemez bir hız avantajına sahiptir.
Cloud TPU
Google Cloud Platform'da bir "Cloud TPU v2" isteğinde bulunduğunuzda, PCI'ye bağlı TPU kartı olan bir sanal makine elde edersiniz. TPU kartında dört adet çift çekirdekli TPU çipi bulunur. Her TPU çekirdeğinde bir VPU (Vektör İşleme Birimi) ve 128x128 MXU (Matris Çarpma Birimi) bulunur. Daha sonra bu "Cloud TPU" genellikle ağ üzerinden bunu isteyen sanal makineye bağlanır. Bu nedenle, resmin tamamı şu şekilde görünür:
Görsel: Ağa bağlı bir "Cloud TPU" hızlandırıcısı olan sanal makineniz. "Cloud TPU", üzerinde dört adet çift çekirdekli TPU çipi bulunan PCI bağlı bir TPU kartına sahip bir sanal makineden oluşur.
TPU kapsülleri
Google'ın veri merkezlerinde TPU'lar, yüksek performanslı bilgi işlem (HPC) bağlantısına bağlanır. Bu bağlantı, TPU'ları tek bir çok büyük hızlandırıcı gibi gösterebilir. Google bunlara kapsül adını verir ve en fazla 512 TPU v2 çekirdek veya 2048 TPU v3 çekirdeklerini kapsayabilir.
Çizim: TPU v3 kapsülü. HPC Interconnect üzerinden bağlı TPU kartları ve raflar.
Eğitim sırasında, tamamen azaltma algoritması kullanılarak TPU çekirdekleri arasında gradyanlar değiştirilir ( tüm azaltmaların iyi açıklamasını burada bulabilirsiniz). Eğitilen model, büyük toplu boyutlarda eğitim alarak donanımdan yararlanabilir.
Çizim: Google TPU'nun 2D toroidal örgü HPC ağında tamamen azaltma algoritması kullanılarak eğitim sırasında gradyanların senkronizasyonu.
Yazılım
Büyük toplu eğitim boyutu
TPU'lar için ideal toplu iş boyutu, TPU çekirdeği başına 128 veri öğesidir ancak donanım zaten TPU çekirdeği başına 8 veri öğesinden iyi bir kullanım gösterebilmektedir. Cloud TPU'da 8 çekirdek olduğunu unutmayın.
Bu kod laboratuvarında Keras API'yi kullanacağız. Keras'ta belirttiğiniz grup, tüm TPU için genel grup boyutudur. Gruplarınız otomatik olarak 8'e bölünecek ve TPU'nun 8 çekirdeği üzerinde çalıştırılacaktır.
Daha fazla performans ipucu için TPU Performans Kılavuzu'na bakın. Çok büyük toplu boyutlar için bazı modellerde özel dikkat gösterilmesi gerekebilir. Daha fazla bilgi için LARSOptimizer başlıklı makaleyi inceleyin.
Gelişmiş seçenekler: XLA
Tensorflow programları hesaplama grafiklerini tanımlar. TPU, Python kodunu doğrudan çalıştırmaz, Tensorflow programınız tarafından tanımlanan hesaplama grafiğini çalıştırır. Arka planda, XLA (hızlandırılmış doğrusal cebir derleyicisi) adlı bir derleyici, işleme düğümlerinin Tensorflow grafiğini TPU makine koduna dönüştürür. Bu derleyici, kodunuzda ve bellek düzeninizde birçok gelişmiş optimizasyon da gerçekleştirir. İş TPU'ya gönderilirken derleme otomatik olarak gerçekleşir. Derleme zincirinize açıkça XLA eklemeniz gerekmez.
Çizim: TPU'da çalıştırmak için Tensorflow programınız tarafından tanımlanan hesaplama grafiği önce XLA (hızlandırılmış doğrusal Cebir derleyici) temsiline dönüştürülür, ardından XLA tarafından TPU makine koduna derlenir.
Keras'ta TPU'ları kullanma
TPU'lar, Tensorflow 2.1 itibarıyla Keras API aracılığıyla desteklenmektedir. Keras desteği, TPU'lar ve TPU kapsülleri üzerinde çalışır. TPU, GPU ve CPU'da çalışan bir örnek aşağıda verilmiştir:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Bu kod snippet'inde:
TPUClusterResolver().connect()
, ağda TPU'yu bulur. Çoğu Google Cloud sisteminde (AI Platform işleri, Colaboratory, Kubeflow, "ctpu up" yardımcı programı aracılığıyla oluşturulan Derin Öğrenme sanal makineleri) parametre olmadan çalışır. Bu sistemler, TPU_NAME ortam değişkeni sayesinde TPU'larının nerede olduğunu bilir. TPU'yu manuel olarak oluşturursanız TPU_NAME ortam değişkenini, kullandığınız sanal makinede ayarlayın veyaTPUClusterResolver
'yi açık parametrelerle çağırın:TPUClusterResolver(tp_uname, zone, project)
TPUStrategy
, dağıtımı ve "all-reduce" gradyan senkronizasyon algoritmasını uygulayan kısımdır.- Strateji bir kapsam aracılığıyla uygulanır. Model, strateji kapsamı içinde tanımlanmalıdır().
tpu_model.fit
işlevi, TPU eğitimi için giriş olarak bir tf.data.Dataset nesnesi bekler.
Genel TPU bağlantı noktası görevleri
- Bir Tensorflow modeline veri yüklemenin birçok yolu olsa da TPU'lar için
tf.data.Dataset
API'nin kullanılması gerekir. - TPU'lar çok hızlıdır ve verileri beslemek, bunlarda çalışırken genellikle darboğaz haline gelir. Veri darboğazlarını tespit etmek için kullanabileceğiniz araçlar ve diğer performans ipuçlarını TPU Performans Kılavuzu'nda bulabilirsiniz.
- int8 veya int16 sayıları, int32 olarak kabul edilir. TPU'da 32 bitten az çalışan tam sayı donanımı yoktur.
- Bazı Tensorflow işlemleri desteklenmez. Listeyi burada bulabilirsiniz. Neyse ki bu sınırlama, yalnızca eğitim kodu (modelinizde ileri ve geri geçiş) için geçerlidir. CPU'da yürütüleceğinden veri girişi ardışık düzeninizdeki tüm Tensorflow işlemlerini kullanmaya devam edebilirsiniz.
tf.py_func
, TPU'da desteklenmez.
4. [BİLGİ] Nöral ağ sınıflandırıcıyla ilgili temel bilgiler
Özet
Sonraki paragrafta kalın olarak yazılmış terimlerin tümünü biliyorsanız bir sonraki alıştırmaya geçebilirsiniz. Derin öğrenmeye yeni başlıyorsanız hoş geldiniz. Lütfen okumaya devam edin.
Keras, bir dizi katman olarak oluşturulan modeller için Sequential API'yi sunmaktadır. Örneğin, üç yoğun katman kullanan bir resim sınıflandırıcı Keras'ta şu şekilde yazılabilir:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )
Yoğun nöral ağ
Bu, görüntüleri sınıflandırmak için kullanılan en basit nöral ağdır. Katmanlar halinde düzenlenmiş "nöronlardan" oluşur. Birinci katman giriş verilerini işler ve çıkışlarını diğer katmanlara iletir. Bu katmana "yoğun" denmesinin nedeni, her bir nöronun bir önceki katmandaki tüm nöronlara bağlı olmasıdır.
Bir resmi, tüm piksellerinin RGB değerlerini uzun bir vektörde birleştirerek ve bunu giriş olarak kullanarak böyle bir ağa besleyebilirsiniz. Görüntü tanıma için en iyi teknik olmasa da daha sonra bu özelliği iyileştireceğiz.
Nöronlar, aktivasyonlar, RELU
Bir "nöron", tüm girişlerinin ağırlıklı bir toplamını hesaplar, "önyargı" adı verilen bir değer ekler ve sonucu, "etkinleştirme işlevi" olarak adlandırılan bir yöntemle iletir. Ağırlıklar ve önyargılar başlangıçta bilinmez. Bunlar rastgele başlatılır ve nöral ağının bilinen çok sayıda veriyle eğitilmesiyle "öğrenilir".
En popüler aktivasyon işlevi, doğrusal birim için RELU olarak adlandırılır. Yukarıdaki grafikte de görebileceğiniz gibi bu çok basit bir işlevdir.
Softmax etkinleştirme
Çiçekleri 5 kategoriye (gül, lale, karahindiba, papatya, ayçiçeği) ayırdığımız için yukarıdaki ağ 5 nöron katmanıyla sona eriyor. Ara katmanlardaki nöronlar, klasik RELU aktivasyon işlevi kullanılarak etkinleştirilir. Ancak son katmanda, bu çiçeğin gül, lale vb. olma olasılığını temsil eden 0 ile 1 arasında sayılar hesaplamak istiyoruz. Bunun için "softmax" adlı bir etkinleştirme işlevi kullanacağız.
Bir vektöre softmax uygulamak için her bir öğenin üstel değeri alınır ve ardından vektör normalleştirilir. Bu işlem genellikle L1 normu (mutlak değerlerin toplamı) kullanılarak yapılır. Böylece, değerler 1'e ulaşır ve olasılık olarak yorumlanabilir.
Kreuz entropi kaybı
Nöral ağımız giriş resimlerinden tahminler ürettiğine göre, bu tahminlerin ne kadar iyi olduğunu (yani ağın bize söylediği ile doğru cevaplar arasındaki mesafeyi, genellikle "etiketler" olarak adlandırılır) ölçmemiz gerekir. Veri kümesindeki tüm görüntüler için doğru etiketlere sahip olduğumuzu unutmayın.
Herhangi bir mesafe kullanılabilir ancak sınıflandırma sorunları için "çapraz entropi mesafesi" en etkili yöntemdir. Bunu hata veya "kayıp" işlevi olarak adlandıracağız:
Gradyan inişi
Sinir ağını "eğitmek", çapraz entropi kayıp işlevini en aza indirmek için ağırlıkları ve önyargıları ayarlamak amacıyla eğitim resimlerini ve etiketlerini kullanmak anlamına gelir. İşleyiş şekline bakalım.
Çapraz entropi, eğitim görüntüsünün ağırlıklarının, sapmalarının, piksellerinin ve bilinen sınıfının bir fonksiyonudur.
Çapraz entropi değerinin tüm ağırlıklara ve tüm önyargılara göre kısmi türevlerini hesaplarsak belirli bir resim, etiket ve ağırlıkların ve önyargıların mevcut değeri için hesaplanan bir "eğim" elde ederiz. Milyonlarca ağırlığa ve sapmaya sahip olabileceğimizi, bu nedenle gradyanı hesaplamanın çok fazla iş yükü olacağını unutmayın. Neyse ki Tensorflow bunu bizim için yapıyor. Bir renk geçişinin matematiksel özelliği, "yukarı"yı işaret etmesidir. Çapraz entropi değerinin düşük olduğu yere gitmek istediğimizde ters yönde ilerleriz. Ağırlıkları ve önyargıları gradyanın bir kesri kadar güncelleriz. Ardından, bir eğitim döngüsünde sonraki eğitim resmi ve etiket gruplarını kullanarak aynı işlemi tekrar tekrar yaparız. Bu minimum değerin benzersiz olduğunun garantisi olmasa da bu işlem, çapraz entropi değerinin minimum olduğu bir noktaya yakınsayacaktır.
Mini toplanma ve ivme
Gradyanınızı yalnızca bir örnek resimde hesaplayabilir ve ağırlıkları ile önyargıları hemen güncelleyebilirsiniz. Ancak bunu 128 resimlik bir grupta yaptığınızda, farklı örnek resimlerin getirdiği kısıtlamaları daha iyi temsil eden bir gradyan elde edersiniz. Bu nedenle, çözüme daha hızlı yaklaşma olasılığı daha yüksektir. Mini grubun boyutu ayarlanabilir bir parametredir.
Bazen "stokastik gradyan azalma" olarak da adlandırılan bu tekniğin daha pratik bir avantajı vardır: Gruplarla çalışmak, daha büyük matrislerle çalışmak anlamına da gelir ve bu matrislerin GPU'larda ve TPU'larda optimizasyonu genellikle daha kolaydır.
Yine de yakınsama biraz karmaşık olabilir ve gradyan vektörü tamamen sıfır ise durabilir. Bu, minimum değer bulduğumuz anlamına mı geliyor? Her zaman değil Bir renk geçişi bileşeni, minimum veya maksimum değerde sıfır olabilir. Milyonlarca öğe içeren bir gradyan vektörüyle, hepsi sıfırsa, her sıfırın bir minimum değere karşılık gelme ve hiçbirinin bir maksimum noktaya ulaşma olasılığı oldukça küçüktür. Birçok boyutu olan bir alanda, eyer noktaları oldukça yaygındır ve bunlarla yetinmek istemeyiz.
Görsel: eyer noktası. Gradyan 0'dır, ancak tüm yönlerde minimum değer değildir. (Resim ilişkilendirmesi Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
Çözüm, optimizasyon algoritmasına biraz momentum eklemektir. Böylece algoritma, durma noktasını geçerken sorun yaşamaz.
Sözlük
Toplu veya mini toplu: Eğitim her zaman eğitim verileri ve etiketleri grupları üzerinde gerçekleştirilir. Bu, algoritmanın yakınlaşmasına yardımcı olur. "Toplu" boyutu, genellikle veri tenörlerinin ilk boyutudur. Örneğin, [100, 192, 192, 3] şeklindeki bir tensör, piksel başına üç değer (RGB) içeren 192x192 piksellik 100 resim içerir.
çapraz entropi kaybı: Sınıflandırıcılarda genellikle kullanılan özel bir kayıp işlevi.
yoğun katman: Her nöronun bir önceki katmandaki tüm nöronlara bağlı olduğu bir nöron katmanı.
özellikler: Bir nöral ağın girişleri bazen "özellikler" olarak adlandırılır. İyi tahminler elde etmek için bir veri kümesinin hangi bölümlerinin (veya bölüm kombinasyonlarının) bir yapay zeka ağına besleneceğini belirleme sanatına "özellik mühendisliği" denir.
labels: "sınıflar"ın başka bir adı veya gözetimli sınıflandırma sorunundaki doğru cevaplar
öğrenme hızı: Ağırlıkların ve sapmaların, eğitim döngüsünün her iterasyonunda güncellendiği gradyanın oranı.
Logitler: Etkinleştirme işlevi uygulanmadan önce bir nöron tabakasının çıkışlarına "logitler" denir. Bu terim, daha önce en popüler aktivasyon fonksiyonu olan "sigmoid işlevi" olarak da bilinen "mantıksal fonksiyon"dan gelir. "Lojistik fonksiyondan önceki nöron çıkışları", "logits" olarak kısaltılmıştı.
loss: nöral ağ çıkışlarını doğru yanıtlarla karşılaştıran hata işlevi
nöron: Girişlerinin ağırlıklı toplamını hesaplar, bir önyargı ekler ve sonucu bir aktivasyon fonksiyonuyla besler.
Tek sıcak kodlama: 5 üzerinden 3. sınıf, 5 öğeli bir vektör olarak kodlanır. 3. öğe 1'dir ve diğer tüm öğeler sıfırdır.
relu: Düzeltilmiş doğrusal birim. Nöronlar için popüler bir aktivasyon fonksiyonu.
sigmoid: Eskiden popüler olan ve özel durumlarda hâlâ yararlı olan başka bir etkinleştirme işlevidir.
softmax: Bir vektör üzerinde işlem yapan, en büyük bileşen ile diğer tüm bileşenler arasındaki farkı artıran ve ayrıca olasılık vektörü olarak yorumlanabilmesi için vektörün toplamını 1 olacak şekilde normalleştiren özel bir etkinleştirme işlevidir. Sınıflandırıcılarda son adım olarak kullanılır.
tensör: "Tensör", matrise benzer ancak rastgele sayıda boyuta sahiptir. 1 boyutlu bir tensör bir vektördür. 2 boyutlu tensör, bir matristir. 3, 4, 5 veya daha fazla boyutlu tensörleriniz de olabilir.
5. [YENİ BİLGİ] Konvolüsyonel nöral ağlar
Özet
Bir sonraki paragrafta yer alan kalın yazı tipindeki tüm terimleri zaten biliyorsanız bir sonraki alıştırmaya geçebilirsiniz. Konvolüsyonel nöral ağlarla yeni başlıyorsanız lütfen okumaya devam edin.
Görsel: Her biri 4x4x3=48 öğrenilebilir ağırlıktan oluşan iki art arda filtreyle bir resmi filtreleme.
Basit bir konvolüsyonel nöral ağ Keras'ta şöyle görünür:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
Evrişimli nöral ağlar 101
Evrimsel bir ağ katmanında, bir "nöron" yalnızca resmin küçük bir bölgesinde, hemen üzerindeki piksellerin ağırlıklı bir toplamını yapar. Normal yoğun bir katmandaki bir nöronun yaptığı gibi, bir eğilim ekler ve toplamı bir aktivasyon fonksiyonu aracılığıyla iletir. Ardından bu işlem, aynı ağırlıklar kullanılarak resmin tamamında tekrarlanır. Yoğun katmanlarda her nöronun kendi ağırlıkları olduğunu unutmayın. Burada, ağırlıklardan oluşan tek bir "yama", resim üzerinde her iki yönde de ("büyüme") kayabilir. Çıkış, resimdeki piksel sayısı kadar değer içerir (ancak kenarlarda biraz dolgu gereklidir). 4x4x3=48 ağırlıklardan oluşan bir filtre kullanan bir filtreleme işlemidir.
Ancak 48 ağırlık yeterli olmayacaktır. Daha fazla serbestlik derecesi eklemek için aynı işlemi yeni bir ağırlık grubuyla tekrarlarız. Bu işlem, yeni bir filtre çıkışı grubu oluşturur. Giriş resmindeki R, G, B kanallarına benzer şekilde buna bir çıkış "kanalı" diyelim.
İki (veya daha fazla) ağırlık kümesi, yeni bir boyut eklenerek tek bir tensör olarak toplanabilir. Bu şekilde, konvolüsyonlu bir katman için ağırlık tensörünün genel şeklini elde ederiz. Giriş ve çıkış kanallarının sayısı parametre olduğundan, konvolüsyonel katmanları yığmaya ve zincirlemeye başlayabiliriz.
Görsel: Evrişimli nöral ağ, veri "küplerini" başka veri "küplerine" dönüştürür.
Sıralı konvolüsyon, maksimum havuz hızı
Toplamaları 2 veya 3 adımla gerçekleştirerek elde edilen veri kübünü yatay boyutlarında da küçültebiliriz. Bunu yapmanın iki yaygın yolu vardır:
- Aşamalı konvolüsyon: Yukarıdaki gibi ancak adımı 1'den büyük olan kayan bir filtre
- Maksimum toplama: MAX işlemini uygulayan kaydırmalı pencere (genellikle 2x2 yamalar üzerinde, her 2 pikselde bir tekrarlanır)
Çizim: Hesaplama penceresinin 3 piksel kaydırılması daha az çıkış değeriyle sonuçlanır. Adımlamalı konvolüsyonlar veya maksimum havuzlama (2 adım kaydırarak 2x2 pencerede maksimum), veri kübünün yatay boyutlarda küçültülmesinin bir yoludur.
Konvolüsyonsal sınıflandırıcı
Son olarak, son veri kübünü düzleştirip yoğun, softmax etkinleştirilmiş bir katmandan besleyerek bir sınıflandırma başlığı ekleriz. Tipik bir konvolüsyonel sınıflandırıcı aşağıdaki gibi görünebilir:
Görsel: Devrimsel ve yumuşak maksimum katmanları kullanan bir resim sınıflandırıcı. 3x3 ve 1x1 filtreler kullanılır. Maxpool katmanları, 2x2 veri noktası gruplarının maksimum değerini alır. Sınıflandırma başı, yumuşak maksimum aktivasyonlu yoğun bir katmanla uygulanır.
Keras'ta
Yukarıda gösterilen konvolüsyon grubu, Keras'ta şu şekilde yazılabilir:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
6. Özel dönüşümünüz
Uygulamalı
Şimdi sıfırdan konvolüsyonel bir nöral ağ oluşturup eğitelim. TPU kullanmak, çok hızlı yineleme yapmamızı sağlar. Lütfen aşağıdaki not defterini açın, hücreleri çalıştırın (Üst Karakter-ENTER) ve "İŞLEM GEREKİR" etiketini gördüğünüz her yerde talimatları uygulayın.
Keras_Flowers_TPU (playground).ipynb
Amaç, aktarma öğrenme modelinin %75'lik doğruluğunu aşmaktır. Bu modelin avantajı, milyonlarca görüntüden oluşan bir veri kümesinde önceden eğitilmiş olmasıydı. Bizde ise yalnızca 3.670 görüntü var. En azından bunu eşleştirebilir misiniz?
Ek bilgiler
Kaç kat, ne kadar büyük?
Katman boyutlarını seçmek, bilimden çok sanata benzer. Çok az veya çok fazla parametreye (ağırlıklar ve sapmalar) sahip olmak arasında doğru dengeyi bulmanız gerekir. Çok az sayıda ağırlığa sahip olan sinir ağı, çiçek şekillerinin karmaşıklığını temsil edemez. Çok fazla resim varsa "fazlasıyla uyumlu" olabilir. Diğer bir deyişle, eğitim resimlerine odaklanıp genelleme yapamamanıza neden olabilir. Çok sayıda parametre olduğunda, modelin eğitilmesi de yavaş olur. Keras'ta model.summary()
işlevi, modelinizin yapısını ve parametre sayısını gösterir:
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 192, 192, 16) 448
_________________________________________________________________
conv2d_1 (Conv2D) (None, 192, 192, 30) 4350
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 96, 96, 30) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 96, 96, 60) 16260
_________________________________________________________________
...
_________________________________________________________________
global_average_pooling2d (Gl (None, 130) 0
_________________________________________________________________
dense (Dense) (None, 90) 11790
_________________________________________________________________
dense_1 (Dense) (None, 5) 455
=================================================================
Total params: 300,033
Trainable params: 300,033
Non-trainable params: 0
_________________________________________________________________
Birkaç ipucu:
- "Derin" nöral ağların etkili olmasının nedeni birden fazla katmana sahip olmasıdır. Bu basit çiçek tanıma problemi için 5 ila 10 katman kullanmak mantıklı olacaktır.
- Küçük filtreler kullanın. 3x3 boyutlu filtreler genellikle her yerde işe yarar.
- 1x1 filtreler de kullanılabilir ve ucuzdur. Bu sistemler aslında hiçbir şeyi "filtrelemez", yalnızca kanalların doğrusal kombinasyonlarını hesaplar. Bunları gerçek filtrelerle değiştirin. ("1x1 toplamaları" hakkında daha fazla bilgiyi sonraki bölümde bulabilirsiniz.)
- Bu tür bir sınıflandırma problemlerinde, maksimum havuz katmanlarıyla (veya adım >1 olan kıvrımlarla) sıkça alt örnekleme yapın. Çiçeğin nerede olduğu önemli değildir, yalnızca gül veya karahindiba çiçeği olduğu için x ve y bilgilerini kaybetmek önemli değildir, daha küçük alanları filtrelemek ise daha ucuzdur.
- Filtrelerin sayısı genellikle ağın sonundaki sınıf sayısına benzer olur (neden? aşağıdaki "küresel ortalama havuz" hilesine bakın). Yüzlerce sınıfa göre sınıflandırma yapıyorsanız filtre sayısını art arda katmanlarda kademeli olarak artırın. 5 sınıflı çiçek veri kümesi için yalnızca 5 filtreyle filtreleme yeterli olmaz. Çoğu katmanda aynı filtre sayısını (ör. 32) kullanabilir ve sonuna doğru azaltabilirsiniz.
- Son yoğun katmanlar pahalıdır. Bu katmanlar, tüm konvolüsyon katmanlarının toplamından daha fazla ağırlığa sahip olabilir. Örneğin, 24x24x10 boyutunda son veri küpünden elde edilen çok makul bir çıkış olsa bile, 100 nöronlu bir katmanın maliyeti 24x24x10x100=576.000 ağırlık olacaktır. Dikkatli olun veya genel ortalama havuza bakın (aşağıya bakın).
Küresel ortalama toplama
Konvolüsyonlu bir nöral ağın sonunda pahalı bir yoğun katman kullanmak yerine, gelen veri "küpünü" sınıflarınız kadar çok parçaya bölebilir, değerlerinin ortalamasını alabilir ve bir softmax etkinleştirme işleviyle besleyebilirsiniz. Sınıflandırma başlığını oluşturmanın bu şekilde maliyeti 0 ağırlıktır. Keras'ta söz dizimi tf.keras.layers.GlobalAveragePooling2D().
şeklindedir
Çözüm
Çözüm not defteri buradadır. Sorun yaşadığınızda bu özelliği kullanabilirsiniz.
Keras_Flowers_TPU (solution).ipynb
İşlediklerimiz
- 🤔 Dönüşüm katmanlarıyla oynadım
- 🤓 Maksimum toplama, adımlar, küresel ortalama toplama ile denemeler yapıldı.
- 😀 TPU'da gerçek dünyadaki bir modelde hızlı iterasyon yaptı
Lütfen bir dakikanızı ayırarak bu yapılacaklar listesini zihninizde inceleyin.
7. Tebrikler!
İlk modern konvolüsyonel nöral ağınızı oluşturup% 80'den fazla doğruluk sağlayacak şekilde eğittiniz ve TPU'lar sayesinde yalnızca birkaç dakika içinde mimarisini geliştirdiniz. Modern konvolüsyon mimarileri hakkında bilgi edinmek için lütfen bir sonraki laboratuvara geçin:
- TPU hızında veri ardışık düzenleri: tf.data.Dataset ve TFRecords
- Transfer öğrenme içeren ilk Keras modeliniz
- [BU LABORATUVAR] Keras ve TPU'larla evrişimli nöral ağlar
- Keras ve TPU'lar ile modern convnet'ler, squeezenet, Xception
TPU'ların pratikte kullanımı
TPU'lar ve GPU'lar Cloud AI Platform'da kullanılabilir:
- Derin Öğrenme Sanal Makinelerinde
- AI Platform Notebooks'ta
- AI Platform Training alanındaki iş ilanları
Son olarak, geri bildirimlere değer veriyoruz. Bu laboratuvarda bir eksiklik görürseniz veya bir şeylerin iyileştirilmesi gerektiğini düşünüyorsanız lütfen bize bildirin. Geri bildirimlerinizi, GitHub sorunları [feedback link] sayfasında bulabilirsiniz.
|