Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Temel sınıflandırma: Giysi resimlerini sınıflandırın

TensorFlow.org'da görüntüleyin Google Colab'de çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin

Bu kılavuz, spor ayakkabı ve gömlek gibi giysi resimlerini sınıflandırmak için bir sinir ağı modeli eğitiyor. Tüm detayları anlamıyorsanız sorun değil; bu, ilerledikçe açıklanan ayrıntılarla eksiksiz bir TensorFlow programının hızlı tempolu bir özetidir.

Bu kılavuz, TensorFlow'da modeller oluşturmak ve eğitmek için üst düzey bir API olan tf.keras'ı kullanır.

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
2.3.0

Fashion MNIST veri kümesini içe aktarın

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Veri kümesini yüklemek dört NumPy dizisi döndürür:

  • train_images ve train_labels dizileri eğitim setidir — modelin öğrenmek için kullandığı veriler.
  • Model, test seti , test_images ve test_labels dizileri ile test edilir.

Görüntüler, piksel değerleri 0 ile 255 arasında değişen 28x28 NumPy dizileridir. Etiketler , 0 ile 9 arasında değişen bir tamsayı dizisidir. Bunlar, görüntünün temsil ettiği giysi sınıfına karşılık gelir:

Etiket Sınıf
0 T-shirt / üst
1 Pantolon
2 Kenara çekmek
3 Elbise
4 Ceket
5 Sandalet
6 Gömlek
7 Spor ayakkabı
8 Sırt çantası
9 Bilek boyu bot

Her görüntü tek bir etiketle eşleştirilir. Sınıf adları veri kümesine dahil edilmediğinden, daha sonra görüntüleri çizerken kullanmak için burada saklayın:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

Verileri keşfedin

Modeli eğitmeden önce veri kümesinin formatını inceleyelim. Aşağıda, eğitim setinde her biri 28 x 28 piksel olarak temsil edilen 60.000 resim gösterilmektedir:

train_images.shape
(60000, 28, 28)

Aynı şekilde eğitim setinde de 60.000 etiket var:

len(train_labels)
60000

Her etiket, 0 ile 9 arasında bir tam sayıdır:

train_labels
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

Test setinde 10.000 görüntü var. Yine, her görüntü 28 x 28 piksel olarak temsil edilir:

test_images.shape
(10000, 28, 28)

Ve test seti 10.000 resim etiketi içerir:

len(test_labels)
10000

Verileri önceden işleyin

Ağı eğitmeden önce veriler önceden işlenmelidir. Eğitim setindeki ilk resmi incelerseniz piksel değerlerinin 0 ile 255 aralığında olduğunu göreceksiniz:

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

png

Bu değerleri sinir ağı modeline beslemeden önce 0 ila 1 aralığında ölçekleyin. Bunu yapmak için değerleri 255'e bölün. Eğitim seti ve test setinin aynı şekilde ön işlemden geçirilmesi önemlidir:

train_images = train_images / 255.0

test_images = test_images / 255.0

Verilerin doğru biçimde olduğunu ve ağı oluşturmaya ve eğitmeye hazır olduğunuzu doğrulamak için eğitim setinden ilk 25 görüntüyü gösterelim ve her görüntünün altında sınıf adını gösterelim.

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

png

Modeli oluşturun

Sinir ağını oluşturmak, modelin katmanlarını yapılandırmayı ve ardından modeli derlemeyi gerektirir.

Katmanları ayarlayın

Bir sinir ağının temel yapı taşı katmandır . Katmanlar, kendilerine beslenen verilerden temsilleri çıkarır. Umarım, bu temsiller eldeki sorun için anlamlıdır.

Derin öğrenmenin çoğu, basit katmanları birbirine zincirlemekten oluşur. tf.keras.layers.Dense gibi çoğu katman, eğitim sırasında öğrenilen parametrelere sahiptir.

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10)
])

Bu ağdaki ilk katman olan tf.keras.layers.Flatten , görüntülerin formatını iki boyutlu bir diziden (28 x 28 piksel) tek boyutlu bir diziye (28 * 28 = 784 piksel) dönüştürür. Bu katmanı, görüntüdeki üst üste dizilmiş piksel sıraları olarak düşünün ve bunları sıralayın. Bu katmanda öğrenilecek parametre yoktur; yalnızca verileri yeniden biçimlendirir.

Pikseller düzleştirildikten sonra ağ, iki tf.keras.layers.Dense katman tf.keras.layers.Dense oluşur. Bunlar yoğun şekilde bağlı veya tamamen bağlantılı sinir katmanlarıdır. İlk Dense katman 128 düğüme (veya nöron) sahiptir. İkinci (ve son) katman, 10 uzunluğunda bir logits dizisi döndürür. Her düğüm, geçerli görüntünün 10 sınıftan birine ait olduğunu gösteren bir puan içerir.

Modeli derleyin

Model eğitime hazır olmadan önce birkaç ayara daha ihtiyaç duyar. Bunlar, modelin derleme adımı sırasında eklenir:

  • Kayıp işlevi — Bu, modelin eğitim sırasında ne kadar doğru olduğunu ölçer. Modeli doğru yöne "yönlendirmek" için bu işlevi en aza indirmek istiyorsunuz.
  • Optimizer — Model, gördüğü verilere ve kayıp işlevine göre nasıl güncellenir.
  • Metrikler - Eğitim ve test adımlarını izlemek için kullanılır. Aşağıdaki örnek, doğru şekilde sınıflandırılan görüntülerin oranı olan doğruluğu kullanır.
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

Modeli eğitin

Sinir ağı modelini eğitmek aşağıdaki adımları gerektirir:

  1. Eğitim verilerini modele aktarın. Bu örnekte, eğitim verileri train_images ve train_labels dizilerindedir.
  2. Model, görüntüleri ve etiketleri ilişkilendirmeyi öğrenir.
  3. Modelden bir test seti (bu örnekte test_images dizisi) hakkında tahminlerde bulunmasını test_images .
  4. Tahminlerin test_labels dizisindeki etiketlerle eşleştiğini doğrulayın.

Modeli besle

Eğitime başlamak için model.fit yöntemini çağırın - buna modeli eğitim verilerine "uyması" nedeniyle denir:

model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.5007 - accuracy: 0.8232
Epoch 2/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3743 - accuracy: 0.8654
Epoch 3/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3358 - accuracy: 0.8778
Epoch 4/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3119 - accuracy: 0.8849
Epoch 5/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2957 - accuracy: 0.8911
Epoch 6/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2802 - accuracy: 0.8963
Epoch 7/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2674 - accuracy: 0.9008
Epoch 8/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2571 - accuracy: 0.9045
Epoch 9/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2491 - accuracy: 0.9086
Epoch 10/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2380 - accuracy: 0.9110

<tensorflow.python.keras.callbacks.History at 0x7f29ebf31518>

Model eğitildikçe, kayıp ve doğruluk ölçümleri görüntülenir. Bu model, eğitim verilerinde yaklaşık 0,91 (veya% 91) doğruluğa ulaşır.

Doğruluğu değerlendirin

Ardından, modelin test veri kümesinde nasıl performans gösterdiğini karşılaştırın:

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)
313/313 - 0s - loss: 0.3312 - accuracy: 0.8832

Test accuracy: 0.8831999897956848

Test veri setindeki doğruluğun, eğitim veri setindeki doğruluktan biraz daha az olduğu ortaya çıktı. Eğitim doğruluğu ve test doğruluğu arasındaki bu boşluk, aşırı uyumu temsil eder. Aşırı uyum, bir makine öğrenimi modeli yeni, daha önce görülmemiş girdilerde eğitim verilerinde olduğundan daha kötü performans gösterdiğinde gerçekleşir. Aşırı uyarlanmış bir model, eğitim veri setindeki gürültüyü ve ayrıntıları, modelin performansını yeni veriler üzerinde olumsuz olarak etkileyecek bir noktaya kadar "ezberler". Daha fazla bilgi için aşağıdakilere bakın:

Tahmin yap

Eğitilen model ile bazı görüntüler hakkında tahminlerde bulunmak için kullanabilirsiniz. Modelin doğrusal çıktıları, günlükler . Logitleri, yorumlanması daha kolay olan olasılıklara dönüştürmek için bir softmax katmanı ekleyin.

probability_model = tf.keras.Sequential([model, 
                                         tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)

Burada model, test setindeki her görüntü için etiketi tahmin etmiştir. İlk tahmine bir göz atalım:

predictions[0]
array([2.3710859e-08, 3.1721327e-11, 1.4305586e-11, 1.3425981e-09,
       3.3166289e-10, 1.6982469e-04, 4.0853692e-07, 9.2678880e-03,
       9.4139558e-08, 9.9056178e-01], dtype=float32)

Tahmin, 10 sayılık bir dizidir. Modelin, görüntünün 10 farklı giyim eşyasının her birine karşılık geldiğine dair "güvenini" temsil ediyorlar. Hangi etiketin en yüksek güven değerine sahip olduğunu görebilirsiniz:

np.argmax(predictions[0])
9

Bu nedenle model, bu görüntünün ayak bileği botu veya class_names[9] olduğundan en çok emindir. Test etiketinin incelenmesi, bu sınıflandırmanın doğru olduğunu gösterir:

test_labels[0]
9

10 sınıf tahmininin tamamına bakmak için bunun grafiğini çizin.

def plot_image(i, predictions_array, true_label, img):
  true_label, img = true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  true_label = true_label[i]
  plt.grid(False)
  plt.xticks(range(10))
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

Tahminleri doğrulayın

Eğitilen model ile bazı görüntüler hakkında tahminlerde bulunmak için kullanabilirsiniz.

0. görüntüye, tahminlere ve tahmin dizisine bakalım. Doğru tahmin etiketleri mavidir ve yanlış tahmin etiketleri kırmızıdır. Sayı, tahmin edilen etiket için yüzdeyi (100 üzerinden) verir.

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

png

i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

png

Tahminleriyle birkaç görüntüyü çizelim. Kendinden çok emin olsa bile modelin yanlış olabileceğini unutmayın.

# Plot the first X test images, their predicted labels, and the true labels.
# Color correct predictions in blue and incorrect predictions in red.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions[i], test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

png

Eğitimli modeli kullanın

Son olarak, tek bir görüntü hakkında bir tahmin yapmak için eğitimli modeli kullanın.

# Grab an image from the test dataset.
img = test_images[1]

print(img.shape)
(28, 28)

tf.keras modelleri, bir seferde örneklerin toplu işi veya koleksiyonu üzerinde tahminler yapmak için optimize edilmiştir. Buna göre, tek bir resim kullanıyor olsanız bile, onu bir listeye eklemeniz gerekir:

# Add the image to a batch where it's the only member.
img = (np.expand_dims(img,0))

print(img.shape)
(1, 28, 28)

Şimdi bu görüntü için doğru etiketi tahmin edin:

predictions_single = probability_model.predict(img)

print(predictions_single)
[[3.8163576e-05 7.6493567e-14 9.9756038e-01 2.8972957e-09 7.7012519e-04
  1.9186120e-12 1.6312959e-03 2.7591241e-17 4.4947028e-12 4.1419238e-15]]

plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)

png

keras.Model.predict , veri toplu keras.Model.predict her görüntü için bir liste olmak üzere bir liste listesi döndürür. Toplu işteki (yalnızca) görselimiz için tahminleri alın:

np.argmax(predictions_single[0])
2

Ve model beklendiği gibi bir etiketi tahmin ediyor.


#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

Bu kılavuz, 10 kategoride 70.000 gri tonlamalı görüntü içeren Fashion MNIST veri kümesini kullanır. Görüntüler, aşağıda görüldüğü gibi düşük çözünürlükte (28 x 28 piksel) ayrı giyim eşyalarını göstermektedir:

Fashion MNIST sprite
Şekil 1. Fashion-MNIST örnekleri (Zalando, MIT Lisansı ile).

Fashion MNIST, klasik MNIST veri kümesinin yerine geçmesi için tasarlanmıştır ve genellikle bilgisayarla görü için makine öğrenimi programlarının "Merhaba, Dünya" olarak kullanılır. MNIST veri kümesi, burada kullanacağınız giyim eşyalarına benzer bir biçimde el yazısı rakamların (0, 1, 2 vb.) Görüntülerini içerir.

Bu kılavuz, Fashion MNIST'i çeşitlilik için kullanır ve normal MNIST'ten biraz daha zor bir problem olduğu için. Her iki veri kümesi de nispeten küçüktür ve bir algoritmanın beklendiği gibi çalıştığını doğrulamak için kullanılır. Kodu test etmek ve hata ayıklamak için iyi başlangıç ​​noktalarıdır.

Burada, ağı eğitmek için 60.000 görüntü ve ağın görüntüleri sınıflandırmayı ne kadar doğru öğrendiğini değerlendirmek için 10.000 görüntü kullanılıyor. Fashion MNIST'e doğrudan TensorFlow'dan erişebilirsiniz. Fashion MNIST verilerini doğrudan TensorFlow'dan içe aktarın ve yükleyin: