Keras'ın Toplu Normalleştirme katmanı, PlatoBlockchain Veri Zekası bozuldu. Dikey Arama. Ai.

Keras'ın Toplu Normalizasyon katmanı bozuk

GÜNCELLEME: Maalesef Toplu Normalleştirme katmanının davranışını değiştiren Keras'a Çekme İsteğim kabul edilmedi. Detayları okuyabilirsiniz okuyun. Özel uygulamalarla uğraşacak kadar cesur olanlar için kodu şurada bulabilirsiniz: benim şubem. Onu koruyabilir ve Keras'ın en son kararlı sürümüyle birleştirebilirim (2.1.6, 2.2.2 ve 2.2.4) Kullandığım sürece ama söz vermediğim sürece.

Derin Öğrenme'de çalışan çoğu insan, ya kullanmış ya da duymuştur keras. Yapmayanlarınız için, TensorFlow, Theano ve CNTK gibi temel Derin Öğrenme çerçevelerini özetleyen ve bir üst düzey API YSA eğitimi için. Kullanımı kolaydır, hızlı prototip oluşturmaya olanak tanır ve arkadaş canlısı aktif bir topluluğa sahiptir. Bir süredir yoğun bir şekilde kullanıyorum ve projeye periyodik olarak katkıda bulunuyorum ve Derin Öğrenme üzerinde çalışmak isteyen herkese kesinlikle tavsiye ediyorum.

Keras hayatımı kolaylaştırsa da, birçok kez Toplu Normalleştirme katmanının garip davranışı tarafından ısırıldım. Varsayılan davranışı zamanla değişti, ancak yine de birçok kullanıcı için sorunlara neden oluyor ve sonuç olarak birkaç ilgili Açık sorunlar Github'da. Bu blog yazısında, Keras'ın BatchNormalization katmanının Transfer Learning ile neden iyi oynamadığına dair bir vaka oluşturmaya çalışacağım, sorunu gideren kodu sağlayacağım ve sonuçlarla örnekler vereceğim. yama.

Aşağıdaki alt bölümlerde, Transfer Öğrenmenin Derin Öğrenmede nasıl kullanıldığına, Toplu Normalleştirme katmanının ne olduğuna, learnining_phase'in nasıl çalıştığına ve Keras'ın BN davranışını zaman içinde nasıl değiştirdiğine dair bir giriş sunuyorum. Bunları zaten biliyorsanız, doğrudan 2. bölüme geçebilirsiniz.

1.1 Transfer Öğrenmeyi kullanmak, Derin Öğrenme için çok önemlidir

Derin Öğrenmenin geçmişte eleştirilmesinin nedenlerinden biri, çok fazla veri gerektirmesidir. Bu her zaman doğru değildir; Bu sınırlamayı ele almak için birkaç teknik vardır, bunlardan biri Transfer Öğrenmedir.

Bir Bilgisayar Görme uygulaması üzerinde çalıştığınızı ve Cats'i Köpeklerden ayıran bir sınıflandırıcı oluşturmak istediğinizi varsayalım. Modeli eğitmek için aslında milyonlarca kedi / köpek resmine ihtiyacınız yok. Bunun yerine önceden eğitilmiş bir sınıflandırıcı kullanabilir ve daha az veriyle en iyi evrişimlerde ince ayar yapabilirsiniz. Bunun arkasındaki fikir, önceden eğitilmiş model görüntülere uyduğundan, alt kıvrımların çizgiler, kenarlar ve diğer kullanışlı desenler gibi özellikleri tanıyabilmesi, yani ağırlıklarını ya iyi başlatma değerleri olarak kullanabileceğiniz ya da verilerinizle ağı kısmen yeniden eğitebileceğiniz anlamına gelir. .
Keras'ın Toplu Normalleştirme katmanı, PlatoBlockchain Veri Zekası bozuldu. Dikey Arama. Ai.
Keras, çeşitli önceden eğitilmiş modellerle ve modellerin ince ayarının nasıl yapılacağına ilişkin kullanımı kolay örneklerle birlikte gelir. Daha fazlasını okuyabilirsiniz belgeleme.

1.2 Toplu Normalleştirme katmanı nedir?

Toplu Normalleştirme katmanı, 2014 yılında Ioffe ve Szegedy tarafından tanıtıldı. Bir önceki katmanın çıktısını standartlaştırarak kaybolan gradyan sorununu giderir, gerekli yineleme sayısını azaltarak eğitimi hızlandırır ve daha derin sinir ağlarının eğitimini sağlar. Tam olarak nasıl çalıştığını açıklamak bu yazının kapsamı dışındadır, ancak kesinlikle orjinal kağıt. Aşırı basitleştirilmiş bir açıklama, girdiyi ortalamasını çıkararak ve standart sapmasına bölerek yeniden ölçeklendirmesidir; ayrıca gerekirse dönüşümü geri almayı da öğrenebilir.
Keras'ın Toplu Normalleştirme katmanı, PlatoBlockchain Veri Zekası bozuldu. Dikey Arama. Ai.

1.3 Keras'taki learning_phase nedir?

Bazı katmanlar, eğitim ve çıkarım modu sırasında farklı şekilde çalışır. En dikkate değer örnekler Toplu Normalleştirme ve Bırakma katmanlarıdır. BN durumunda, eğitim sırasında girdiyi yeniden ölçeklendirmek için mini partinin ortalamasını ve varyansını kullanırız. Öte yandan, çıkarım sırasında eğitim sırasında tahmin edilen hareketli ortalamayı ve varyansı kullanırız.

Keras, adı verilen yerleşik bir mekanizmaya sahip olduğu için hangi modda çalıştırılacağını bilir. öğrenme_fazı. Öğrenme aşaması, ağın tren mi yoksa test modunda mı olduğunu kontrol eder. Kullanıcı tarafından manuel olarak ayarlanmadıysa, fit () sırasında ağ learning_phase = 1 (eğitim modu) ile çalışır. Tahminler üretirken (örneğin, tahmin () & eval () yöntemlerini çağırdığımızda veya fit () 'in doğrulama adımında) ağ, learning_phase = 0 (test modu) ile çalışır. Önerilmese bile, kullanıcı ayrıca öğrenme aşamasını statik olarak belirli bir değere değiştirebilir, ancak bunun grafiğe herhangi bir model veya tensör eklenmeden önce yapılması gerekir. Öğrenme aşaması statik olarak ayarlanmışsa, Keras kullanıcının seçtiği modda kilitlenecektir.

1.4 Keras, Toplu Normalleştirmeyi zaman içinde nasıl uyguladı?

Keras, Toplu Normalleştirme'nin davranışını birkaç kez değiştirdi ancak en son önemli güncelleme Keras 2.1.3'te gerçekleşti. V2.1.3'ten önce, BN katmanı donduğunda (eğitilebilir = Yanlış), toplu istatistiklerini güncellemeye devam etti, bu, kullanıcılarında epik baş ağrısına neden olan bir şeydi.

Bu sadece tuhaf bir politika değildi, aslında yanlıştı. Evrişimler arasında bir BN katmanının var olduğunu hayal edin; katman donmuşsa, üzerinde herhangi bir değişiklik olmamalıdır. Kısmen ağırlıklarını güncellersek ve sonraki katmanlar da dondurulursa, daha yüksek hataya yol açan mini parti istatistiklerinin güncellemelerine asla ayarlama şansı bulamayacaklar. Neyse ki 2.1.3 sürümünden başlayarak, bir BN katmanı donduğunda artık istatistiklerini güncellemiyor. Ama bu yeterli mi? Transfer Öğrenimini kullanıyorsanız değil.

Aşağıda sorunun tam olarak ne olduğunu açıklıyorum ve çözmek için teknik uygulamayı çiziyorum. Ayrıca, modelin doğruluğu üzerindeki etkilerini göstermek için birkaç örnek de veriyorum. yama uygulanır.

2.1 Sorunun teknik açıklaması

Keras'ın mevcut uygulamasındaki sorun, bir BN katmanı dondurulduğunda, eğitim sırasında mini toplu istatistikleri kullanmaya devam etmesidir. BN donduğunda daha iyi bir yaklaşımın eğitim sırasında öğrendiği hareketli ortalama ve varyansı kullanmak olduğuna inanıyorum. Neden? Katman dondurulduğunda mini parti istatistiklerinin neden güncellenmemesi gerektiğiyle aynı nedenlerden dolayı: sonraki katmanlar uygun şekilde eğitilmediğinden kötü sonuçlara yol açabilir.

Bir Bilgisayar Görüşü modeli oluşturduğunuzu ancak yeterli veriye sahip olmadığınızı varsayın, bu nedenle Keras'ın önceden eğitilmiş CNN'lerinden birini kullanmaya ve ona ince ayar yapmaya karar verdiniz. Ne yazık ki, böyle yaparak, yeni veri kümenizin BN katmanları içindeki ortalama ve varyansının orijinal veri kümeleriyle benzer olacağına dair hiçbir garanti alamazsınız. Şu anda, eğitim sırasında ağınızın her zaman mini parti istatistiklerini kullanacağını unutmayın, BN katmanı dondurulur ya da dondurulmaz; ayrıca çıkarım sırasında donmuş BN katmanlarının önceden öğrenilmiş istatistiklerini kullanacaksınız. Sonuç olarak, en üst katmanlara ince ayar yaparsanız, ağırlıkları ortalama / varyans değerine ayarlanacaktır. yeni veri kümesi. Yine de, çıkarım sırasında ölçeklendirilmiş verileri alacaklar. farklı olarak çünkü ortalama / varyans orijinal veri kümesi kullanılacak.
Keras'ın Toplu Normalleştirme katmanı, PlatoBlockchain Veri Zekası bozuldu. Dikey Arama. Ai.
Yukarıda, gösteri amaçlı basit (ve gerçekçi olmayan) bir mimari sağlıyorum. Modeli Evrişim k + 1'den ağın üstüne (sağ taraf) kadar ince ayarladığımızı ve altını (sol taraf) dondurduğumuzu varsayalım. Eğitim sırasında 1'den k'ye kadar tüm BN katmanları, eğitim verilerinizin ortalamasını / varyansını kullanacaktır. Her BN'deki ortalama ve varyans eğitim öncesi öğrenilenlere yakın değilse, bunun donmuş ReLU'lar üzerinde olumsuz etkileri olacaktır. Ayrıca, ağın geri kalanının (CONV k + 1 ve sonraki sürümlerden), çıkarım sırasında alacaklara kıyasla farklı ölçekleri olan girdilerle eğitilmesine neden olacaktır. Eğitim sırasında ağınız bu değişikliklere adapte olabilir, yine de tahmin moduna geçtiğiniz anda Keras farklı standardizasyon istatistikleri kullanır ve bu, sonraki katmanların girdilerinin dağılımını hızlı bir şekilde kötü sonuçlara götürür.

2.2 Etkilenip etkilenmediğinizi nasıl anlarsınız?

Bunu tespit etmenin bir yolu, Keras'ın öğrenme aşamasını statik olarak 1'e (eğitim modu) ve 0'a (test modu) ayarlamak ve her durumda modelinizi değerlendirmektir. Aynı veri kümesinde doğruluk açısından önemli bir fark varsa, sorundan etkileniyorsunuzdur. Öğrenim aşaması mekanizmasının Keras'ta uygulanma şekli nedeniyle, genellikle onunla uğraşmanın tavsiye edilmediğini belirtmek gerekir. Learning_phase üzerindeki değişikliklerin, halihazırda derlenmiş ve kullanılmış modeller üzerinde hiçbir etkisi olmayacaktır; sonraki alt bölümlerdeki örneklerde de görebileceğiniz gibi, bunu yapmanın en iyi yolu temiz bir oturumla başlamak ve grafikte herhangi bir tensör tanımlanmadan önce öğrenme aşamasını değiştirmektir.

İkili sınıflandırıcılarla çalışırken sorunu tespit etmenin bir başka yolu da doğruluğu ve AUC'yi kontrol etmektir. Doğruluk% 50'ye yakınsa ancak AUC 1'e yakınsa (ve ayrıca aynı veri kümesinde eğitim / test modu arasında farklılıklar gözlemliyorsanız), bunun nedeni BN istatistikleri nedeniyle olasılıkların ölçek dışı olması olabilir. Benzer şekilde, regresyon için MSE ve Spearman korelasyonunu kullanarak tespit edebilirsiniz.

2.3 Nasıl düzeltebiliriz?

Donmuş BN katmanları aslında tam da buysa, sorunun çözülebileceğine inanıyorum: test modunda kalıcı olarak kilitlendi. Uygulama açısından, eğitilebilir işaretin hesaplama grafiğinin bir parçası olması gerekir ve BN'nin davranışı yalnızca öğrenme aşamasına değil, aynı zamanda eğitilebilir özelliğin değerine de bağlı olmalıdır. Uygulamamın ayrıntılarını şurada bulabilirsiniz: Github.

Yukarıdaki düzeltmeyi uygulayarak, bir BN katmanı donduğunda artık mini grup istatistiklerini kullanmayacak, bunun yerine eğitim sırasında öğrenilenleri kullanacaktır. Sonuç olarak, eğitim ve test modları arasında doğruluk artışına yol açan hiçbir tutarsızlık olmayacaktır. Açıkçası, BN katmanı dondurulmadığında, eğitim sırasında mini parti istatistiklerini kullanmaya devam edecektir.

2.4 Yamanın etkilerinin değerlendirilmesi

Yakın zamanda yukarıdaki uygulamayı yazmış olsam da, arkasındaki fikir, aynı etkiye sahip çeşitli geçici çözümler kullanılarak gerçek dünyadaki problemler üzerinde yoğun bir şekilde test edildi. Örneğin, eğitim ve test modları arasındaki tutarsızlık, ağı iki parçaya bölerek (donmuş ve çözülmemiş) ve önbelleğe alınmış eğitim gerçekleştirerek (verileri dondurulmuş modelden bir kez geçirip ardından bunları dondurulmuş ağı eğitmek için kullanarak) önlenebilir. Yine de, "bunu daha önce yaptığıma güvenin" tipik olarak bir ağırlık taşımadığından, aşağıda yeni uygulamanın pratikteki etkilerini gösteren birkaç örnek vereceğim.

İşte deneyle ilgili birkaç önemli nokta:

  1. Modeli bilinçli olarak aşmak için çok az miktarda veri kullanacağım ve modeli aynı veri kümesinde eğitip doğrulayacağım. Bunu yaparak, tren / doğrulama veri kümesinde neredeyse mükemmel doğruluk ve aynı performansı bekliyorum.
  2. Doğrulama sırasında aynı veri setinde önemli ölçüde daha düşük doğruluk elde edersem, mevcut BN politikasının çıkarım sırasında modelin performansını olumsuz etkilediğine dair net bir göstergeye sahip olacağım.
  3. Herhangi bir ön işleme, Jeneratörlerin dışında gerçekleştirilecektir. Bu, v2.1.5'te tanıtılan bir hatayı gidermek için yapılır (şu anda gelecek v2.1.6 ve en son ana sürümde düzeltilmiştir).
  4. Keras'ı değerlendirme sırasında farklı öğrenme aşamaları kullanmaya zorlayacağız. Bildirilen doğruluk arasındaki farklılıkları tespit edersek, mevcut BN politikasından etkilendiğimizi bileceğiz.

Denemenin kodu aşağıda gösterilmiştir:

import numpy as np
from keras.datasets import cifar10
from scipy.misc import imresize

from keras.preprocessing.image import ImageDataGenerator
from keras.applications.resnet50 import ResNet50, preprocess_input
from keras.models import Model, load_model
from keras.layers import Dense, Flatten
from keras import backend as K


seed = 42
epochs = 10
records_per_class = 100

# We take only 2 classes from CIFAR10 and a very small sample to intentionally overfit the model.
# We will also use the same data for train/test and expect that Keras will give the same accuracy.
(x, y), _ = cifar10.load_data()

def filter_resize(category):
   # We do the preprocessing here instead in the Generator to get around a bug on Keras 2.1.5.
   return [preprocess_input(imresize(img, (224,224)).astype('float')) for img in x[y.flatten()==category][:records_per_class]]

x = np.stack(filter_resize(3)+filter_resize(5))
records_per_class = x.shape[0] // 2
y = np.array([[1,0]]*records_per_class + [[0,1]]*records_per_class)


# We will use a pre-trained model and finetune the top layers.
np.random.seed(seed)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
l = Flatten()(base_model.output)
predictions = Dense(2, activation='softmax')(l)
model = Model(inputs=base_model.input, outputs=predictions)

for layer in model.layers[:140]:
   layer.trainable = False

for layer in model.layers[140:]:
   layer.trainable = True

model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(ImageDataGenerator().flow(x, y, seed=42), epochs=epochs, validation_data=ImageDataGenerator().flow(x, y, seed=42))

# Store the model on disk
model.save('tmp.h5')


# In every test we will clear the session and reload the model to force Learning_Phase values to change.
print('DYNAMIC LEARNING_PHASE')
K.clear_session()
model = load_model('tmp.h5')
# This accuracy should match exactly the one of the validation set on the last iteration.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))


print('STATIC LEARNING_PHASE = 0')
K.clear_session()
K.set_learning_phase(0)
model = load_model('tmp.h5')
# Again the accuracy should match the above.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))


print('STATIC LEARNING_PHASE = 1')
K.clear_session()
K.set_learning_phase(1)
model = load_model('tmp.h5')
# The accuracy will be close to the one of the training set on the last iteration.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))

Keras v2.1.5'teki sonuçları kontrol edelim:

Epoch 1/10
1/7 [===>..........................] - ETA: 25s - loss: 0.8751 - acc: 0.5312
2/7 [=======>......................] - ETA: 11s - loss: 0.8594 - acc: 0.4531
3/7 [===========>..................] - ETA: 7s - loss: 0.8398 - acc: 0.4688 
4/7 [================>.............] - ETA: 4s - loss: 0.8467 - acc: 0.4844
5/7 [====================>.........] - ETA: 2s - loss: 0.7904 - acc: 0.5437
6/7 [========================>.....] - ETA: 1s - loss: 0.7593 - acc: 0.5625
7/7 [==============================] - 12s 2s/step - loss: 0.7536 - acc: 0.5744 - val_loss: 0.6526 - val_acc: 0.6650

Epoch 2/10
1/7 [===>..........................] - ETA: 4s - loss: 0.3881 - acc: 0.8125
2/7 [=======>......................] - ETA: 3s - loss: 0.3945 - acc: 0.7812
3/7 [===========>..................] - ETA: 2s - loss: 0.3956 - acc: 0.8229
4/7 [================>.............] - ETA: 1s - loss: 0.4223 - acc: 0.8047
5/7 [====================>.........] - ETA: 1s - loss: 0.4483 - acc: 0.7812
6/7 [========================>.....] - ETA: 0s - loss: 0.4325 - acc: 0.7917
7/7 [==============================] - 8s 1s/step - loss: 0.4095 - acc: 0.8089 - val_loss: 0.4722 - val_acc: 0.7700

Epoch 3/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2246 - acc: 0.9375
2/7 [=======>......................] - ETA: 3s - loss: 0.2167 - acc: 0.9375
3/7 [===========>..................] - ETA: 2s - loss: 0.2260 - acc: 0.9479
4/7 [================>.............] - ETA: 2s - loss: 0.2179 - acc: 0.9375
5/7 [====================>.........] - ETA: 1s - loss: 0.2356 - acc: 0.9313
6/7 [========================>.....] - ETA: 0s - loss: 0.2392 - acc: 0.9427
7/7 [==============================] - 8s 1s/step - loss: 0.2288 - acc: 0.9456 - val_loss: 0.4282 - val_acc: 0.7800

Epoch 4/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2183 - acc: 0.9688
2/7 [=======>......................] - ETA: 3s - loss: 0.1899 - acc: 0.9844
3/7 [===========>..................] - ETA: 2s - loss: 0.1887 - acc: 0.9792
4/7 [================>.............] - ETA: 1s - loss: 0.1995 - acc: 0.9531
5/7 [====================>.........] - ETA: 1s - loss: 0.1932 - acc: 0.9625
6/7 [========================>.....] - ETA: 0s - loss: 0.1819 - acc: 0.9688
7/7 [==============================] - 8s 1s/step - loss: 0.1743 - acc: 0.9747 - val_loss: 0.3778 - val_acc: 0.8400

Epoch 5/10
1/7 [===>..........................] - ETA: 3s - loss: 0.0973 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0828 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0851 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0897 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0928 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0936 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.1337 - acc: 0.9838 - val_loss: 0.3916 - val_acc: 0.8100

Epoch 6/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0747 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0852 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0812 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0831 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0779 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0766 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.0813 - acc: 1.0000 - val_loss: 0.3637 - val_acc: 0.8550

Epoch 7/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2478 - acc: 0.8750
2/7 [=======>......................] - ETA: 2s - loss: 0.1966 - acc: 0.9375
3/7 [===========>..................] - ETA: 2s - loss: 0.1528 - acc: 0.9583
4/7 [================>.............] - ETA: 1s - loss: 0.1300 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.1193 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.1196 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.1084 - acc: 0.9838 - val_loss: 0.3546 - val_acc: 0.8600

Epoch 8/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0539 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0900 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0815 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0740 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0700 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0701 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.0695 - acc: 1.0000 - val_loss: 0.3269 - val_acc: 0.8600

Epoch 9/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0306 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0377 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0898 - acc: 0.9583
4/7 [================>.............] - ETA: 1s - loss: 0.0773 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.0742 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.0708 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.0659 - acc: 0.9838 - val_loss: 0.3604 - val_acc: 0.8600

Epoch 10/10
1/7 [===>..........................] - ETA: 3s - loss: 0.0354 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0381 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0354 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0828 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.0791 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.0794 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.0704 - acc: 0.9838 - val_loss: 0.3615 - val_acc: 0.8600

DYNAMIC LEARNING_PHASE
[0.3614931714534759, 0.86]

STATIC LEARNING_PHASE = 0
[0.3614931714534759, 0.86]

STATIC LEARNING_PHASE = 1
[0.025861846953630446, 1.0]

Yukarıda görebileceğimiz gibi, eğitim sırasında model verileri çok iyi öğrenir ve eğitim setinde mükemmele yakın doğruluğa ulaşır. Yine de her yinelemenin sonunda, modeli aynı veri kümesi üzerinde değerlendirirken, kayıp ve doğruluk açısından önemli farklılıklar elde ediyoruz. Bunu anlamamamız gerektiğini unutmayın; Belirli veri kümesindeki modeli kasıtlı olarak aşırı donattık ve eğitim / doğrulama veri kümeleri aynı.

Eğitim tamamlandıktan sonra modeli 3 farklı learning_phase konfigürasyonu kullanarak değerlendiriyoruz: Dinamik, Statik = 0 (test modu) ve Statik = 1 (eğitim modu). Gördüğümüz gibi, ilk iki konfigürasyon, kayıp ve doğruluk açısından aynı sonuçları sağlayacak ve bunların değeri, son yinelemede doğrulama setinde modelin bildirilen doğruluğu ile eşleşecektir. Bununla birlikte, eğitim moduna geçtikten sonra, büyük bir tutarsızlık (gelişme) gözlemliyoruz. Neden öyle? Daha önce de söylediğimiz gibi, ağın ağırlıkları, eğitim verilerinin ortalama / varyansı ile ölçeklenen verileri almayı bekleyerek ayarlanır. Ne yazık ki, bu istatistikler BN katmanlarında saklananlardan farklıdır. BN katmanları dondurulduğu için bu istatistikler hiçbir zaman güncellenmedi. BN istatistiklerinin değerleri arasındaki bu tutarsızlık, çıkarım sırasında doğruluğun bozulmasına neden olur.

Bakalım uyguladıktan sonra ne olacak? yama:

Epoch 1/10
1/7 [===>..........................] - ETA: 26s - loss: 0.9992 - acc: 0.4375
2/7 [=======>......................] - ETA: 12s - loss: 1.0534 - acc: 0.4375
3/7 [===========>..................] - ETA: 7s - loss: 1.0592 - acc: 0.4479 
4/7 [================>.............] - ETA: 4s - loss: 0.9618 - acc: 0.5000
5/7 [====================>.........] - ETA: 2s - loss: 0.8933 - acc: 0.5250
6/7 [========================>.....] - ETA: 1s - loss: 0.8638 - acc: 0.5417
7/7 [==============================] - 13s 2s/step - loss: 0.8357 - acc: 0.5570 - val_loss: 0.2414 - val_acc: 0.9450

Epoch 2/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2331 - acc: 0.9688
2/7 [=======>......................] - ETA: 2s - loss: 0.3308 - acc: 0.8594
3/7 [===========>..................] - ETA: 2s - loss: 0.3986 - acc: 0.8125
4/7 [================>.............] - ETA: 1s - loss: 0.3721 - acc: 0.8281
5/7 [====================>.........] - ETA: 1s - loss: 0.3449 - acc: 0.8438
6/7 [========================>.....] - ETA: 0s - loss: 0.3168 - acc: 0.8646
7/7 [==============================] - 9s 1s/step - loss: 0.3165 - acc: 0.8633 - val_loss: 0.1167 - val_acc: 0.9950

Epoch 3/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2457 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.2592 - acc: 0.9688
3/7 [===========>..................] - ETA: 2s - loss: 0.2173 - acc: 0.9688
4/7 [================>.............] - ETA: 1s - loss: 0.2122 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.2003 - acc: 0.9688
6/7 [========================>.....] - ETA: 0s - loss: 0.1896 - acc: 0.9740
7/7 [==============================] - 9s 1s/step - loss: 0.1835 - acc: 0.9773 - val_loss: 0.0678 - val_acc: 1.0000

Epoch 4/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2051 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.1652 - acc: 0.9844
3/7 [===========>..................] - ETA: 2s - loss: 0.1423 - acc: 0.9896
4/7 [================>.............] - ETA: 1s - loss: 0.1289 - acc: 0.9922
5/7 [====================>.........] - ETA: 1s - loss: 0.1225 - acc: 0.9938
6/7 [========================>.....] - ETA: 0s - loss: 0.1149 - acc: 0.9948
7/7 [==============================] - 9s 1s/step - loss: 0.1060 - acc: 0.9955 - val_loss: 0.0455 - val_acc: 1.0000

Epoch 5/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0769 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0846 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0797 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0736 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0914 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0858 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0808 - acc: 1.0000 - val_loss: 0.0346 - val_acc: 1.0000

Epoch 6/10
1/7 [===>..........................] - ETA: 1s - loss: 0.1267 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.1039 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0893 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0780 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0758 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0789 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0738 - acc: 1.0000 - val_loss: 0.0248 - val_acc: 1.0000

Epoch 7/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0344 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0385 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0467 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0445 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0446 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0429 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0421 - acc: 1.0000 - val_loss: 0.0202 - val_acc: 1.0000

Epoch 8/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0319 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0300 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0320 - acc: 1.0000
4/7 [================>.............] - ETA: 2s - loss: 0.0307 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0303 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0291 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0358 - acc: 1.0000 - val_loss: 0.0167 - val_acc: 1.0000

Epoch 9/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0246 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0255 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0258 - acc: 1.0000
4/7 [================>.............] - ETA: 2s - loss: 0.0250 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0252 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0260 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0327 - acc: 1.0000 - val_loss: 0.0143 - val_acc: 1.0000

Epoch 10/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0251 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0228 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0217 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0249 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0244 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0239 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0290 - acc: 1.0000 - val_loss: 0.0127 - val_acc: 1.0000

DYNAMIC LEARNING_PHASE
[0.012697912137955427, 1.0]

STATIC LEARNING_PHASE = 0
[0.012697912137955427, 1.0]

STATIC LEARNING_PHASE = 1
[0.01744014158844948, 1.0]

Her şeyden önce, ağın önemli ölçüde daha hızlı birleştiğini ve mükemmel doğruluğa ulaştığını gözlemliyoruz. Ayrıca, farklı learning_phase değerleri arasında geçiş yaptığımızda artık doğruluk açısından bir tutarsızlık olmadığını da görüyoruz.

2.5 Yama, gerçek bir veri kümesinde nasıl performans gösterir?

Peki yama daha gerçekçi bir deneyde nasıl performans gösteriyor? Keras'ın önceden eğitilmiş ResNet50'sini (orijinal olarak imagenet'e uyar) kullanalım, üst sınıflandırma katmanını kaldıralım ve yama ile ve yama olmadan ince ayar yapıp sonuçları karşılaştıralım. Veriler için, CIFAR10'u (Keras tarafından sağlanan standart tren / test bölümü) kullanacağız ve resimleri ResNet224'nin giriş boyutuyla uyumlu hale getirmek için 224 × 50 olarak yeniden boyutlandıracağız.

RSMprop kullanarak üst sınıflandırma katmanını eğitmek için 10 dönem yapacağız ve ardından SGD (lr = 5e-139, momentum = 1) kullanarak 4. katmandan sonraki her şeyin ince ayarını yapmak için başka bir 0.9 yapacağız. Yama olmadan modelimiz% 87.44 doğruluk elde ediyor. Yamayı kullanarak neredeyse 92.36 puan daha yüksek olan% 5'lık bir doğruluk elde ediyoruz.

2.6 Aynı düzeltmeyi Dropout gibi diğer katmanlara da uygulamalı mıyız?

Toplu Normalleştirme, tren ve test modları arasında farklı şekilde çalışan tek katman değildir. Bırakma ve varyantları da aynı etkiye sahiptir. Tüm bu katmanlara aynı politikayı uygulamalı mıyız? İnanmıyorum (bu konudaki düşüncelerinizi duymak istesem bile). Bunun nedeni, Dropout'un aşırı uydurmayı önlemek için kullanılmasıdır, bu nedenle eğitim sırasında kalıcı olarak tahmin moduna kilitlenmesinin amacını bozacaktır. Sen ne düşünüyorsun?

Bu tutarsızlığın Keras'ta çözülmesi gerektiğine kuvvetle inanıyorum. Bu sorunun neden olduğu gerçek dünya uygulamalarında daha da derin etkiler (% 100'den% 50'ye kadar) gördüm. ben göndermeyi planlamak zaten gönderilmiş PR Keras'a düzeltme ile ve umarım kabul edilir.

Bu blog yayınını beğendiyseniz, lütfen Facebook veya Twitter'da paylaşmak için bir dakikanızı ayırın. 🙂

Zaman Damgası:

Den fazla Veri kutusu