Bilgisayar görüşünü iyileştirmek için evrişimli nöral ağlar (CNN'ler) oluşturma
Bu codelab hakkında
1. Başlamadan önce
Bu codelab'de, görüntü sınıflandırma modellerinizi iyileştirmek için CNN'ler kullanmayı öğreneceksiniz.
Ön koşullar
Bu codelab'de, daha önce kullandığınız iki taksitle tamamlanan bir bilgisayar görüşü modeli oluşturma çalışmaları temel alınmıştır. Burada kullanacağınız kodun bir kısmını sunuyoruz. Evrimleri ve biriktirme işlemlerini de kullanıma sunduğumuz laboratuvarlar ve havuz işleri gerçekleştirin.
Neler öğreneceksiniz?
- Evrişimlerle bilgisayar görüşünü ve doğruluğunu iyileştirme
Geliştireceğiniz uygulama
- Nöral ağınızı geliştiren katmanlar
Gerekenler
Colab'da çalışan codelab'in geri kalanının kodunu bulabilirsiniz.
Ayrıca TensorFlow'un ve önceki codelab'de yüklediğiniz kitaplıkların bulunması gerekir.
2. Evrişimlerle bilgisayar görüşünün doğruluğunu iyileştirin
Artık üç katmanı içeren bir Derin Nöral Ağ (DNN) kullanarak modanın görüntü tanımayı nasıl yapacağınızı biliyorsunuz: giriş katmanı (giriş verilerinin biçiminde), çıkış katmanı (istenen çıkış biçiminde) ve gizli bir katman. Gizli katmanların farklı boyutları ve eğitim dönemlerinin sayısı gibi nihai doğruluğu etkileyen çeşitli parametrelerle denemeler yaptınız.
Kolaylık olması açısından, kodun tamamını burada bulabilirsiniz. Bu kodu çalıştırın ve son kısmında yer alan test doğruluğunu not edin.
import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))
Doğruluk oranınız muhtemelen eğitimde% 89 ve doğrulamada% 87 olacaktır. Bunu, belirli ve farklı ayrıntılara odaklanmak için resmin içeriğini daraltan evrimleri kullanarak daha da iyi hale getirebilirsiniz.
Daha önce bir filtre kullanarak resim işleme işlemi yaptıysanız evrenler çok tanıdık gelecektir.
Kısaca, (genellikle 3x3 veya 5x5) bir dizi alır ve resmin üzerine geçirirsiniz. Söz konusu matristeki formüle dayalı olarak temel pikselleri değiştirerek kenar algılama gibi işlemler gerçekleştirebilirsiniz. Örneğin, kenar algılaması için orta hücrenin 8 olduğu ve tüm komşuları ise -1 olduğu bir 3x3 değeri tanımlanır. Bu durumda, her bir pikselin değerini 8 ile çarpar ve ardından her komşunun değerini çıkarırsınız. Bunu her piksel için yapın. Böylece, kenarları geliştirilmiş yeni bir görsel elde edeceksiniz.
Kenarlar gibi özelliklerin iyileştirilmesi, bilgisayarın bir öğeyi diğerinden ayırt etmesine yardımcı olduğundan, bilgisayar görüşü için mükemmeldir. Daha da iyisi, yalnızca öne çıkan özellikleri eğiteceğiniz için gereken bilgi miktarı çok daha az olacaktır.
Evrişimli Nöral Ağlar kavramı budur. Yoğun katmanlara geçmeden önce evrilmek için birkaç katman ekleyin. Ardından, yoğun katmanlara giden bilgiler daha iyi odaklanmış ve muhtemelen daha doğru hale gelir.
3. Kodu deneyin
Aşağıdaki kodu çalıştırın. Öncekiyle aynı nöral ağdır, ancak bu kez önce evrişim katmanları eklenmişti. Bu işlem uzun sürer, ancak doğruluğun etkisine bakın:
import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))
Muhtemelen eğitim verilerinde% 93'e, doğrulama verilerinde ise% 91'e çıkıyor.
Şimdi bunu daha fazla zaman aralığı için (ör. 20 civarında) çalıştırmayı deneyerek sonuçları keşfedin. Eğitim sonuçları gerçekten iyi görünse de, doğrulama sonuçları eşleşme olarak adlandırılan bir olgu nedeniyle düşebilir.
Ağın eğitim kümesinden alınan verileri çok iyi öğrenmesi durumunda aşırı sığınma oluşur. Bu nedenle, ağ yalnızca bu verileri tanımak için uzmanlaşmıştır ve bunun sonucunda diğer veriler daha genel durumlarda daha az etkili olur. Örneğin, yalnızca topuklu ayakkabı eğittiyseniz ağ, topukları tanımlama konusunda çok iyi olabilir ancak spor ayakkabılar karışıklığa yol açabilir.
Koda tekrar bakın ve evrimlerin nasıl oluşturulduğunu adım adım inceleyin.
4. Verileri toplama
İlk adım, verileri toplamaktır.
Burada bir değişiklik olduğunu ve eğitim verilerinin yeniden düzenlenmesi gerektiğini fark edeceksiniz. Bunun nedeni, ilk evrimin her şeyi içeren tek bir tensör olmasını beklemesidir. Bu nedenle, bir listedeki 60.000 28x28x1 öğe yerine 60.000x28x28x1 boyutunda ve test resimleri için aynı olan tek bir 4D listeniz olur. Bunu yapmazsanız eğitim sırasında bir hata alırsınız, çünkü kıvrımlar şekli tanımaz.
import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images = training_images/255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images = test_images/255.0
5. Modeli tanımlayın
Ardından, modelinizi tanımlayın. En üstteki giriş katmanı yerine bir kıvrımlı katman ekleyeceksiniz. Parametreler aşağıda belirtilmiştir:
- Oluşturmak istediğiniz evrişlerin sayısı. 32 gibi bir değer iyi bir başlangıç noktasıdır.
- Evrişim matrisinin boyutu. Bu örnekte 3x3 ızgara.
- Kullanılacak etkinleştirme işlevi. Bu durumda
relu
kullanın. - İlk katmanda, giriş verilerinin şekli.
Evrişin takip edilmesinde, resmin sıkıştırılması için tasarlanan ve evrimin ön plana çıkardığı özellikleri barındıran bir maksimum havuz katmanı bulunur. Maksimum havuzlama için (2,2) belirtildiğinde etki, resmin boyutunu 4 kat küçültmektir. 2x2 piksel dizisi oluşturur ve en büyük piksel değerini seçerek 4 pikseli 1'e dönüştürür. Bu hesaplamayı resim üzerinde tekrarlar. Böylece yatay piksel sayısını ve dikey piksel sayısını yarıya böler.
Ağın boyutunu ve şeklini görmek için model.summary()
numaralı telefonu arayabilirsiniz. Her havuzlama katmanından sonra resim boyutunun aşağıdaki şekilde küçüldüğüne dikkat edin:
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_2 (Conv2D) (None, 26, 26, 64) 640 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 13, 13, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 11, 11, 64) 36928 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64) 0 _________________________________________________________________ flatten_2 (Flatten) (None, 1600) 0 _________________________________________________________________ dense_4 (Dense) (None, 128) 204928 _________________________________________________________________ dense_5 (Dense) (None, 10) 1290 =================================================================
CNN'in tam kodunu aşağıda bulabilirsiniz:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
#Add another convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
#Now flatten the output. After this you'll just have the same DNN structure as the non convolutional version
tf.keras.layers.Flatten(),
#The same 128 dense layers, and 10 output layers as in the pre-convolution example:
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
6. Modeli derleme ve eğitme
Modeli oluşturun, eğitimi yapmak için uygun yöntemi arayın, test grubundan kayıp ve doğruluğu değerlendirin.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_acc*100))
7. Evrimleri ve havuzları görselleştirme
Bu kod, sapmaları grafik olarak gösterir. print (test_labels[:100])
, test grubundaki ilk 100 etiketi gösterir. Dizin 0, dizin 23 ve dizin 28 etiketlerindeki etiketlerin aynı değerde (9) olduğunu görebilirsiniz. Hepsi ayakkabı. Bu evrişimlerin her birinin üzerinde çalıştığı sonucuna bir göz atıp aralarındaki yaygın özellikleri görmeye başlayacaksınız. DNN bu veriler üzerinde eğitim verdiğinde çok daha az bilgiyle çalışıyor ve belki de bu kıvrım ve havuz kombinasyonuna göre ayakkabılar arasında bir ortak kullanım buluyor.
print(test_labels[:100])
[9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 4 8 0 2 5 7 9 1 4 6 0 9 3 8 8 3 3 8 0 7 5 7 9 6 1 3 7 6 7 2 1 2 2 4 4 5 8 2 2 8 4 8 0 7 7 8 5 1 1 2 3 9 8 7 0 2 6 2 3 1 2 8 4 1 8 5 9 5 0 3 2 0 6 5 3 6 7 1 8 0 1 4 2]
Artık bu etiketlere karşılık gelen resimlerden bazılarını seçebilir ve konturlama aşamasında nasıl görünürler? Dolayısıyla, aşağıdaki kodda FIRST_IMAGE
, SECOND_IMAGE
ve THIRD_IMAGE
değeri 9 değeri olan ayak bileği botu dizinleridir.
import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=23
THIRD_IMAGE=28
CONVOLUTION_NUMBER = 6
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
axarr[0,x].grid(False)
f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
axarr[1,x].grid(False)
f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
axarr[2,x].grid(False)
Aşağıdakine benzer bir kıvrım göreceksiniz. Bu örnekte, ayakkabıda kullanılan ayakkabının özünde bu değişiklik tüm ayakkabılar için ortak bir özellik olarak görülüyor.
8. Egzersizler
1. Egzersiz
Evrimleri düzenlemeyi deneyin. 32 olan evrim sayısını 16 veya 64 olarak değiştirin. Bu durum, doğruluğu ve eğitim süresini nasıl etkiler?
2. Egzersiz
Son evrimi kaldırın. Bu durum, doğruluk ve eğitim süresini nasıl etkiler?
3. Egzersiz
Daha fazla evriş ekleyin. Bunun etkisi nedir?
4. Alıştırma
İlki dışındaki tüm evrimleri kaldırın. Bunun etkisi nedir? Deneme yapın.
9. Tebrikler
İlk CNN'nizi oluşturdunuz! Bilgisayarınızın görüş modellerini daha da iyileştirmeyi öğrenmek için Karmaşık görüntülerle kıvrımlı nöral ağlar (CNN'ler) kullanma konusuna gidin.