Yardım Kaggle üzerinde TensorFlow ile Büyük Bariyer Resifi korumak Meydan Üyelik

Temel sınıflandırma: Giysi görüntülerini sınıflandırın

TensorFlow.org'da görüntüleyin Kaynağı GitHub'da görüntüleyin Not defterini indir

Bu kılavuz, spor ayakkabı ve gömlek gibi giysi görüntülerini sınıflandırmak için bir sinir ağı modeli eğitir. Tüm detayları anlamadıysanız sorun değil; bu, ilerledikçe açıklanan ayrıntılarla birlikte eksiksiz bir TensorFlow programına hızlı bir genel bakıştır.

Bu kılavuz kullanan tf.keras , TensorFlow içinde inşa ve tren modellere üst düzey bir API.

# TensorFlow and tf.keras
import tensorflow as tf

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

print(tf.__version__)
2.5.0

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

Bu kılavuz kullanan Moda MNIST 10 kategoride 70.000 gri tonlama görüntüleri içeren veri kümesi. Görüntüler, burada görüldüğü gibi düşük çözünürlükte (28 x 28 piksel) tek tek giyim eşyalarını göstermektedir:

Moda MNIST sprite
Şekil 1. moda-MNIST numuneleri (Zalando MİT lisans ile).

Moda MNIST bir damla-in yerine klasik gelince tasarlanmıştır MNIST veri kümesi-sıklıkla bilgisayar vizyonu için makine öğrenim programlarının "Merhaba, Dünya" olarak kullanılır. MNIST veri kümesi, burada kullanacağınız giyim eşyalarının formatı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 çünkü bu, normal MNIST'ten biraz daha zorlayıcı bir problemdir. 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ır. Fashion MNIST'e doğrudan TensorFlow'dan erişebilirsiniz. İthalat ve Moda MNIST verilerini yüklemek TensorFlow doğrudan:

fashion_mnist = tf.keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

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

  • train_images ve train_labels diziler modeli kullanır öğrenmek için -the verileri ayarlayın eğitim vardır.
  • Model test kümesi, karşı test edilir test_images ve test_labels diziler.

Görüntü 0 ile 9 arasında resim temsil giyim sınıfına Bu tekabül kadar, 0 dan etiket 255 kadar piksel değerleri, tamsayı dizisi 28x28 NumPy diziler vardır:

Etiket Sınıf
0 Tişört/üst
1 pantolon
2 Kenara çekmek
3 Elbise
4 Ceket
5 Sandalet
6 Gömlek
7 Spor ayakkabı
8 Çanta
9 Bilek boyu bot

Her görüntü tek bir etikete eşlenir. Sınıf adları veri kümesi dahil olmadığını beri görüntüleri çizdirirken sonra kullanmak için onları buraya saklamak:

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 biçimini inceleyelim. Aşağıdakiler, eğitim setinde her bir görüntünün 28 x 28 piksel olarak temsil edildiği 60.000 görüntü olduğunu göstermektedir:

train_images.shape
(60000, 28, 28)

Aynı şekilde eğitim setinde 60.000 adet etiket bulunmaktadır:

len(train_labels)
60000

Her etiket 0 ile 9 arasında bir tamsayıdır:

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

Test setinde 10.000 adet görsel bulunmaktadır. Yine, her görüntü 28 x 28 piksel olarak temsil edilir:

test_images.shape
(10000, 28, 28)

Test seti 10.000 görüntü etiketi içerir:

len(test_labels)
10000

Verileri önceden işleyin

Veriler, ağı eğitmeden önce ön işleme tabi tutulmalıdır. Eğitim setindeki ilk görüntüyü 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

Sinir ağı modeline beslemeden önce bu değerleri 0 ile 1 aralığında ölçeklendirin. Bu eğitim seti ve test seti aynı şekilde Önişlenmiş edilmesi önemlidir 255 değerleri bölmek Bunu yapmak için:

train_images = train_images / 255.0

test_images = test_images / 255.0

Verilerin doğru biçimde ve yapı için hazırsınız ve ağ yetiştirmek olduğunu doğrulamak için, eğitim setinden ilk 25 resimleri görüntülemek izin vermedi ve her resmin altında sınıf adını görüntüler.

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ın oluşturulması, modelin katmanlarının yapılandırılmasını ve ardından modelin derlenmesini gerektirir.

Katmanları ayarlayın

Bir sinir ağının temel taşıdır tabaka . 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. Gibi çoğu katmanları, tf.keras.layers.Dense , eğitim sırasında öğrenilir parametreleri var.

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

Bu ağ, birinci tabaka tf.keras.layers.Flatten , (28 * 28 = 784 piksel) tek boyutlu bir diziye (28 28 piksel), iki boyutlu bir dizi görüntü formatı dönüştürür. Bu katmanı, görüntüdeki piksel sıralarını kaldırmak ve bunları hizalamak olarak düşünün. Bu katmanın öğrenilecek parametresi yoktur; yalnızca verileri yeniden biçimlendirir.

Piksel düzleştirilmiş sonra, ağ, iki bir dizi oluşur tf.keras.layers.Dense tabakaları. Bunlar yoğun şekilde bağlı veya tamamen bağlı sinir katmanlarıdır. İlk Dense tabaka 128 düğümleri (veya nöronlar) 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 ihtiyacı var. Bunlar modelin sırasında eklenen derleme adımı:

  • Zarar fonksiyonu modeli eğitim sırasında ne kadar doğru tedbirleri -Bu. Modeli doğru yöne "yönlendirmek" için bu işlevi en aza indirmek istiyorsunuz.
  • Doktoru -Bu modeli görür veri ve onun kayıp fonksiyonuna bağlı olarak güncellenir nasıl.
  • Metrik eğitim ve test aşamaları izlemek için -kullanılmış. Aşağıdaki örnek, doğruluk, düzgün sınıflandırılır görüntü kısmını kullanır.
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

Modeli eğit

Sinir ağı modelinin eğitimi aşağıdaki adımları gerektirir:

  1. Eğitim verilerini modele besleyin. Bu örnekte, eğitim verileri ise train_images ve train_labels diziler.
  2. Model, görüntüleri ve etiketleri ilişkilendirmeyi öğrenir.
  3. Bir deney seti-in bu örnekte, ilgili öngörülerde bulunmak modeli sormak test_images dizisi.
  4. Tahminler etiketleri eşleştiğini doğrulayın test_labels dizisi.

Modeli besle

Antrenman başlatmak için çağrı model.fit yöntemi-sözde çünkü "uyan" eğitim verilerine modeli:

model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4982 - accuracy: 0.8256
Epoch 2/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3747 - accuracy: 0.8658
Epoch 3/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3356 - accuracy: 0.8770
Epoch 4/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3112 - accuracy: 0.8856
Epoch 5/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2941 - accuracy: 0.8915
Epoch 6/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2776 - accuracy: 0.8972
Epoch 7/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2678 - accuracy: 0.9000
Epoch 8/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2564 - accuracy: 0.9049
Epoch 9/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2467 - accuracy: 0.9083
Epoch 10/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2399 - accuracy: 0.9103
<tensorflow.python.keras.callbacks.History at 0x7fe108a0c150>

Model ilerlerken, kayıp ve doğruluk metrikleri 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.3413 - accuracy: 0.8814

Test accuracy: 0.8813999891281128

Test veri setindeki doğruluğun, eğitim veri setindeki doğruluktan biraz daha az olduğu ortaya çıktı. Eğitim doğruluk ve test doğruluk arasındaki bu boşluk overfitting temsil. Bir makine öğrenimi modeli, yeni, daha önce görülmemiş girdilerde eğitim verilerinde olduğundan daha kötü performans gösterdiğinde, aşırı uyum gerçekleşir. Fazla takılan bir model, eğitim veri kümesindeki gürültüyü ve ayrıntıları, modelin yeni veriler üzerindeki performansını olumsuz yönde etkileyeceği bir noktaya "belleğe alır". Daha fazla bilgi için aşağıdakilere bakın:

tahminlerde bulunun

Eğitilen model ile bazı görüntüler hakkında tahminler yapmak için kullanabilirsiniz. Modelin doğrusal çıkış, logits . 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.9212106e-07, 1.6208847e-10, 1.3363140e-08, 2.7341349e-09,
       5.5379962e-10, 4.5457238e-04, 4.2226111e-06, 4.4925120e-03,
       5.8868943e-07, 9.9504781e-01], dtype=float32)

Tahmin, 10 sayıdan oluşan bir dizidir. Modelin, görüntünün 10 farklı giysi parçası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

Yani, modeli Bu resmi bir bilek çizme olrnası en emindir class_names[9] . 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ğrula

Eğitilen model ile bazı görüntüler hakkında tahminler yapmak 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 etiketin yüzdesini (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 birlikte birkaç resim çizelim. Modelin kendinden çok emin olsa bile 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 tahminde bulunmak için eğitilmiş modeli kullanın.

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

print(img.shape)
(28, 28)

tf.keras modelleri kerede örneklerin toplu olarak tahminler, veya koleksiyon yapmak için optimize edilmiştir. Buna göre, tek bir görsel kullanıyor olsanız bile onu bir listeye eklemeniz gerekiyor:

# 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)
[[8.8914348e-05 1.3264636e-13 9.9108773e-01 1.2658383e-10 8.1463791e-03
  1.6905785e-08 6.7695131e-04 2.7492119e-17 5.1699739e-10 7.1339325e-17]]
plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
plt.show()

png

tf.keras.Model.predict veri gruptaki her bir görüntü için listeler-on listesinin bir listesini verir. Gruptaki (yalnızca) resmimiz için tahminleri alın:

np.argmax(predictions_single[0])
2

Ve model beklendiği gibi bir etiket öngörüyor.

# MIT License
#
# 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.