Bilgisayar görüşünü iyileştirmek için evrişimli nöral ağlar (CNN'ler) oluşturma

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.

6c9109bcc640a1ec.png

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.