TensorFlow ile bir bilgisayar görüşü modeli oluşturma

1. Başlamadan önce

Bu codelab'de, TensorFlow ile giyim ürünlerini tanıyabilen bir bilgisayar görüş modeli oluşturacaksınız.

Ön koşullar

  • Python'a dair engin bilgi birikimi
  • Temel programlama becerileri

Neler öğreneceksiniz?

Bu codelab'de:

  • Bir nöral ağı, giyim ürünlerini tanıması için eğitin
  • Ağın farklı katmanlarıyla ilgili denemeler yaparken size yol gösterecek bir dizi alıştırma yapın

Geliştireceğiniz uygulama

  • Giyim ürünlerini tanımlayan bir nöral ağ

Gerekenler

TensorFlow ile hiçbir zaman bilgisayar görüşü için nöral bir ağ oluşturmadıysanız tüm gerekli bağımlılıkları içeren tarayıcı tabanlı bir ortam olan Colaboratory'yi kullanabilirsiniz. Colab'da çalışan codelab'in geri kalanının kodunu bulabilirsiniz.

Aksi takdirde, eğitim modelleri için kullanacağınız ana dil Python'dur. Bu nedenle, dili yüklemeniz gerekir. Buna ek olarak, TensorFlow ve NumPy kitaplığına da ihtiyacınız olacaktır. TensorFlow'u buradan yükleyebilir ve daha fazla bilgi edinebilirsiniz. NumPy'yi buraya yükleyin.

2. Kodlamaya başla

Önce yürütilebilir Colab not defterini inceleyin.

TensorFlow'u içe aktararak başlayın.

import tensorflow as tf
print(tf.__version__)

Bir nöral ağı, Fashion MNIST adlı ortak bir veri kümesindeki giyim ürünlerini tanıması için eğitirsiniz. 10 farklı kategoride 70.000 giyim öğesi içeriyor. Her kıyafet öğesi 28x28 gri tonlamalı bir resimde yer alır. Burada birkaç örnek görebilirsiniz:

cab89ecf27462a95.png

Veri kümesiyle ilişkili etiketler şunlardır:

Etiket

Açıklama

0

Tişört/tişört

1

Pantolon

2

Beşik

3

Elbise

4

Kaban

5

Sandalet

6

Tişört

7

Spor ayakkabısı

8

Çanta

9

Yarım bot

Fashion MNIST verileri tf.keras.datasets API'sinde mevcuttur. Şöyle yükleyin:

mnist = tf.keras.datasets.fashion_mnist

Bu nesnede load_data çağrılması size iki liste grubu sağlar: eğitim değerleri ve kıyafet öğelerini ve etiketlerini gösteren grafikleri temsil eden test değerleri.

(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

Bu değerler nasıl görünür? Gösterilecek eğitim resmini ve eğitim etiketini yazdırın. Dizideki farklı dizinlerle deneme yapabilirsiniz.

import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])

0 öğesine ait verilerin baskısı şu şekilde görünür:

2da84dc57109b11a.png

Tüm değerlerin 0 ile 255 arasında bir tam sayı olduğunu fark edeceksiniz. Bir nöral ağ eğitilirken tüm değerleri 0 ile 1 arasında ele almak daha kolaydır. Bu, normalleştirme adı verilen bir işlemdir. Neyse ki Python, döngüye girmeden böyle bir listeyi normalleştirmenin kolay bir yolunu sunuyor.

training_images  = training_images / 255.0
test_images = test_images / 255.0

Dizin 0'dakinden farklı bir bot olan 42'ye de bakmak isteyebilirsiniz.

Şimdi de neden iki veri kümesi olduğunu merak ediyor olabilirsiniz: eğitim ve test.

Amaç, modelin değerleri ne kadar iyi sınıflandırabileceğini görmek için eğitim için bir veri kümesi ve henüz karşılaşmadığı başka bir veri kümesi elde etmektir. Sonuçta, işiniz bittiğinde modeli daha önce hiç görmediğiniz verilerle kullanmak istersiniz. Ayrıca, ayrı test verileri olmadan ağın, bilgilerini genelleştirmeden yalnızca eğitim verilerini ezberleme riskiyle karşılaşırsınız.

3. Modeli tasarlama

Şimdi modeli tasarlayın. Üç katmanınız olacak. Bu kartları tek tek inceleyin ve her biri için kullanılan farklı katman türlerini ve parametrelerini keşfedin.

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), 
                                    tf.keras.layers.Dense(128, activation=tf.nn.relu), 
                                    tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  • Sequential, nöral ağdaki bir katman sırasını tanımlar.
  • Flatten, bir kareyi alır ve tek boyutlu bir vektöre dönüştürür.
  • Dense bir nöron katmanı ekler.
  • Activation işlevleri, her bir nöron katmanına ne yapılacağını bildirir. Çok sayıda seçenek olsa da şimdilik bunları kullanın:
  • Relu, X'in 0'dan büyük olması durumunda X'in döndürülmesi, 0'ın döndürülmesi anlamına gelir. Yalnızca 0 veya daha büyük değerler ağdaki bir sonraki katmana iletilir.
  • Softmax bir değer grubu alır ve en büyük olanı etkili bir şekilde seçer. Örneğin, son katmanın sonucu [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05] gibiyse, en yüksek değere göre sıralama yapmak zorunda kalmaz ve [0,0,0,0,1,0,0,0,0] değerini döndürür.

4. Modeli derleme ve eğitme

Model tanımlandığına göre sonraki adım, modeli oluşturmaktır. Önce bir optimizer ve loss işleviyle derleyerek bir model oluşturun, ardından bu modeli eğitim verileriniz ve etiketleriniz hakkında eğitin. Amaç, modelin eğitim verileri ile eğitim etiketleri arasındaki ilişkiyi anlamasını sağlamaktır. Daha sonra, modelinizin eğitim verilerinize benzeyen verileri görmesini ve bu verilerin nasıl görünmesi gerektiğine dair bir tahminde bulunmasını istersiniz.

Parametre olarak metrics= kullanımına dikkat edin. Bu parametre, TensorFlow'un, bilinen sonuçları (etiketler) ile tahmin edilen sonuçları kontrol ederek eğitimin doğruluğu hakkında rapor oluşturmasına olanak tanır.

model.compile(optimizer = tf.keras.optimizers.Adam(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5)

model.fit yürütüldüğünde kayıp ve doğruluk şunları görürsünüz:

Epoch 1/5
60000/60000 [=======] - 6s 101us/sample - loss: 0.4964 - acc: 0.8247
Epoch 2/5
60000/60000 [=======] - 5s 86us/sample - loss: 0.3720 - acc: 0.8656
Epoch 3/5
60000/60000 [=======] - 5s 85us/sample - loss: 0.3335 - acc: 0.8780
Epoch 4/5
60000/60000 [=======] - 6s 103us/sample - loss: 0.3134 - acc: 0.8844
Epoch 5/5
60000/60000 [=======] - 6s 94us/sample - loss: 0.2931 - acc: 0.8926

Model eğitimi tamamladığında, son dönemin sonunda bir doğruluk değeri görürsünüz. Yukarıdaki gibi 0,8926 gibi görünebilir. Bu, eğitim verilerinin sınıflandırılmasında nöral ağınızın yaklaşık% 89 doğru olduğunu gösterir. Başka bir deyişle, %89 oranında işe yarayan resim ile etiketler arasında bir kalıp eşleşmesi bulmuştur. Pek iyi değil ama yalnızca beş dönem için eğitilmiş ve hızlı bir şekilde yapılmış olması kötü bir şey değil.

5. Modeli test edin

Model, görmediği verilerde nasıl performans gösterir? Bu nedenle test grubunu oluşturdunuz. model.evaluate öğesini arayıp iki grubu geçirirsiniz ve her biri için kayıp kaybı bildirilir. Deneyin:

model.evaluate(test_images, test_labels)

Çıkışı da aşağıda görebilirsiniz:

10000/10000 [=====] - 1s 56us/sample - loss: 0.3365 - acc: 0.8789
[0.33648381242752073, 0.8789]

Bu örnekte 0, 8789 doğru sonuç verilmiştir .Yani doğruluk oranı yaklaşık% 88'dir. (Değerleriniz biraz farklı olabilir.)

Beklendiği gibi, model, eğitildiği verilerle aynı şekilde bilinmeyen verilerle doğru değildir. TensorFlow hakkında daha fazla bilgi edindikçe bunu geliştirmenin yollarını bulursunuz.

Daha ayrıntılı bilgi edinmek için bir sonraki adımda alıştırmaları deneyin.

6. Keşif alıştırmaları

1. Egzersiz

İlk alıştırma için aşağıdaki kodu çalıştırın:

classifications = model.predict(test_images)
print(classifications[0])

Test görüntülerinin her biri için bir sınıflandırma kümesi oluşturur ve ardından sınıflandırmadaki ilk girişi yazdırır. Çalıştırdıktan sonra çıkış, bir sayı listesidir. Neden bunun olduğunu düşünüyorsunuz ve bu sayılar neyi temsil ediyor?

print(test_labels[0]) çalıştırmayı denediğinizde 9 kazanırsınız. Listenin neden bu şekilde göründüğünü anlamanıza yardımcı oluyor mu?

Modelin sonucu, 10 sayının listesidir. Bu sayılar, sınıflandırılmakta olan değerin karşılık gelen etiket olma olasılığıdır. Örneğin, listedeki ilk değer kıyafetin 0. sınıf, diğerinin 1. sınıf olma olasılığıdır. 1 tanesi dışındaki tüm olasılıkların çok düşük olduğuna dikkat edin. Ayrıca, Softmax nedeniyle listedeki tüm olasılıkların toplamı 1,0'dır.

Liste ve etiketler 0'a dayanmaktadır. Bu nedenle yarım bot'un 9 numaralı etiketi, bu 10 sınıfın 10. günüdür. 10. öğenin en yüksek değere sahip olduğu liste, nöral ağın sınıflandırdığı öğenin büyük olasılıkla ayak bileği botu olduğunu tahmin ettiği anlamına gelir.

2. Egzersiz

Modelinizdeki katmanları inceleyin. 512 nöronla yoğun katman için farklı değerlerle denemeler yapın.

Kayıp ve eğitim süresiyle ilgili hangi farklı sonuçları elde edersiniz? Neden böyle olduğunu düşünüyorsunuz?

Örneğin, 1.024 nörona çıkarırsanız daha fazla hesaplama yapmanız ve süreci yavaşlatmanız gerekir. Ancak bu durumda model daha doğru olduğu için iyi bir etkiye sahiptirler. Yani her zaman daha iyisi olamaz. İadeleri azaltma yasasına hızlıca ulaşabilirsiniz.

3. Egzersiz

Flatten() katmanını kaldırırsanız ne olur? Neden böyle olduğunu düşünüyorsunuz?

Verilerin şekli hakkında bir hata alırsınız. Hatanın ayrıntıları şu anda belirsiz görünebilir, ancak ağınızdaki ilk katmanın verilerinizle aynı şekil olması gerektiği konusunda kural bulunur. Şu anda verileriniz 28x28 resimlerden oluşmaktadır ve 28 28 nörondan oluşan katmanlar mümkün değildir. Bu nedenle, 28,28 değerini 784x1 olarak sabitlemek daha mantıklıdır.

Tüm kodu yazmak yerine, başa Flatten() katmanı ekleyin. Diziler daha sonra modele yüklendiğinde bunlar sizin için otomatik olarak birleştirilir.

4. Egzersiz

Son (çıkış) katmanları dikkate alın. Neden 10 tane var? 10'dan farklı bir tutara sahip olsaydınız ne olurdu?

Ağı 5 ile eğitmeyi deneyin. Beklenmeyen bir değer bulur bulmaz bir hata alırsınız. Başka bir genel kural: Son katmandaki nöron sayısı, sınıflandırma yaptığınız sınıf sayısıyla eşleşmelidir. Bu durumda, 0'dan 9'a kadarki basamaklar 10'dur. Bu nedenle, son katmanınızda 10 nöron olması gerekir.

5. Egzersiz

Ağdaki ek katmanların etkilerini göz önünde bulundurun. 512 içeren katman ile 10 içeren son katman arasında başka bir katman eklerseniz ne olur?

Bunun basit bir veri olması nedeniyle önemli bir etkisi yoktur. Çok daha karmaşık veriler için genellikle ek katmanlar gerekir.

6. Egzersiz

Eğitmeden önce, 0 ile 255 arasındaki değerlerden 0 ile 1 arasındaki değerlere kadar verileri normalleştirdiniz. Bunun kaldırılmasının nasıl bir etkisi olur? Denemek için gereken tam kodu burada bulabilirsiniz (verileri normalleştiren iki satırın yorumlandığını unutmayın).

Neden farklı sonuçlar aldığınızı düşünüyorsunuz? Stack Overflow'da mükemmel bir yanıt bulabilirsiniz.

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/255.0
#test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5)
model.evaluate(test_images, test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

7. Geri çağırmaları keşfedin

Daha önce, ek dönemler için eğitim verdiğinizde kayıplarınızın değişebileceği bir sorun yaşamıştınız. Eğitimin tamamlanması için biraz beklemeniz gerekebilir ve% 95 doğruluk gibi istenen bir değere ulaştığınızda eğitimin durdurulmasının iyi bir fikir olduğunu düşünebilirsiniz. 3 dönemin ardından ona ulaşırsan neden daha fazla dönemin tamamlanmasını bekleyebilirsin?

Diğer programlarda olduğu gibi sizin de geri aramalarınız var. Nasıl yapıldığını görün:

import tensorflow as tf

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('accuracy')>0.95):
      print("\nReached 95% accuracy so cancelling training!")
      self.model.stop_training = True

callbacks = myCallback()
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(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])

8. Tebrikler

İlk bilgisayar görüşü modelinizi oluşturdunuz. Bilgisayarınızın görüş modellerini nasıl geliştireceğinizi öğrenmek için Yığma oluşturma ve havuz yapma bölümüne gidin.