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

Görüntüleri yükle

TensorFlow.org üzerinde görüntüle Google Colab'da yayınla Kaynağı GitHub'da görüntüle Not defterini indir

Bu eğitici, bir görüntü veri kümesinin iki şekilde nasıl yükleneceğini ve önişleneceğini gösterir. İlk olarak, üst düzey Keras ön işleme yardımcı programları ve katmanları kullanacaksınız. Daha sonra, tf.data kullanarak sıfırdan kendi giriş boru hattınızı yazacaksınız .

Kurmak

 import numpy as np
import os
import PIL
import PIL.Image
import tensorflow as tf
 
 print(tf.__version__)
 
2.3.0

Çiçekler veri kümesini indirin

Bu eğitimde binlerce çiçek fotoğrafı içeren bir veri kümesi kullanılmıştır. Çiçekler veri kümesi, sınıf başına bir tane olmak üzere 5 alt dizin içerir:

 flowers_photos/
  daisy/
  dandelion/
  roses/
  sunflowers/
  tulips/
 
 import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file(origin=dataset_url, 
                                   fname='flower_photos', 
                                   untar=True)
data_dir = pathlib.Path(data_dir)
 

İndirdikten sonra (218MB), artık çiçek fotoğraflarının bir kopyasına sahip olmalısınız. Toplam 3670 görüntü var:

 image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)
 
3670

Her dizin o tür çiçeğin görüntülerini içerir. İşte bazı güller:

 roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[0]))
 

png

 roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[1]))
 

png

Keras.preprocessing kullanarak yükleme

Bu görüntüleri image_dataset_from_directory kullanarak diskten yükleyelim .

Veri kümesi oluşturma

Yükleyici için bazı parametreler tanımlayın:

 batch_size = 32
img_height = 180
img_width = 180
 

Modelinizi geliştirirken bir doğrulama bölümü kullanmak iyi bir uygulamadır. Görüntülerin% 80'ini eğitim için ve% 20'sini doğrulama için kullanacağız.

 train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
 
Found 3670 files belonging to 5 classes.
Using 2936 files for training.

 val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
 
Found 3670 files belonging to 5 classes.
Using 734 files for validation.

Sınıf adlarını, bu veri kümelerindeki class_names özniteliğinde bulabilirsiniz.

 class_names = train_ds.class_names
print(class_names)
 
['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

Verileri görselleştirin

İşte eğitim veri kümesinden ilk 9 resim.

 import matplotlib.pyplot as plt

plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
  for i in range(9):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(images[i].numpy().astype("uint8"))
    plt.title(class_names[labels[i]])
    plt.axis("off")
 

png

Bir modeli, bu veri kümelerini kullanarak model.fit geçirerek model.fit (bu öğreticide daha sonra gösterilecektir). İsterseniz, veri kümesini manuel olarak yineleyebilir ve görüntü gruplarını alabilirsiniz:

 for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break
 
(32, 180, 180, 3)
(32,)

image_batch şeklin bir image_batch (32, 180, 180, 3) . Bu, 180x180x3 şeklindeki 32 görüntünün bulunduğu bir 180x180x3 (son boyut RGB renk kanallarını ifade eder). label_batch , şeklin (32,) bir label_batch , bunlar 32 görüntüye karşılık gelen etiketlerdir.

Verileri standartlaştırın

RGB kanalı değerleri [0, 255] aralığındadır. Bu, sinir ağı için ideal değildir; genel olarak girdi değerlerinizi küçük yapmaya çalışmalısınız. Burada, bir Yeniden Ölçeklendirme katmanı kullanarak [0, 1] içindeki değerleri standart hale getireceğiz.

 from tensorflow.keras import layers

normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)
 

Bu katmanı kullanmanın iki yolu vardır. Haritayı arayarak veri kümesine uygulayabilirsiniz:

 normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
print(np.min(first_image), np.max(first_image)) 
 
0.0 0.96902645

Veya, dağıtımı basitleştirmek için katmanı model tanımınızın içine dahil edebilirsiniz. Burada ikinci yaklaşımı kullanacağız.

Veri kümesini performans için yapılandırma

G / Ç engelleme olmadan diskten veri sağlayabilmemiz için tamponlu ön getirmeyi kullandığınızdan emin olalım. Bunlar veri yüklerken kullanmanız gereken iki önemli yöntemdir.

.cache() , ilk çağda görüntüleri diskten yüklendikten sonra bellekte tutar. Bu, modelinizi eğitirken veri kümesinin bir darboğaz haline gelmemesini sağlayacaktır. Veri kümeniz belleğe sığmayacak kadar büyükse, performans gösteren bir disk önbelleği oluşturmak için de bu yöntemi kullanabilirsiniz.

.prefetch() , eğitim sırasında veri önişleme ve model yürütme ile çakışır.

İlgilenen okuyucular, her iki yöntem hakkında ve veri performans kılavuzunda verilerin diske nasıl önbelleğe alınacağı hakkında daha fazla bilgi edinebilir.

 AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
 

Bir model eğitin

Tamlık için, hazırladığımız veri kümelerini kullanarak basit bir modelin nasıl eğitileceğini göstereceğiz. Bu model herhangi bir şekilde ayarlanmamıştır - amaç, az önce oluşturduğunuz veri kümelerini kullanarak mekaniği göstermektir. Görüntü sınıflandırması hakkında daha fazla bilgi edinmek için bu öğreticiyi ziyaret edin.

 num_classes = 5

model = tf.keras.Sequential([
  layers.experimental.preprocessing.Rescaling(1./255),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
 
 model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])
 
 model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
 
Epoch 1/3
92/92 [==============================] - 6s 66ms/step - loss: 1.3282 - accuracy: 0.4240 - val_loss: 1.1035 - val_accuracy: 0.5804
Epoch 2/3
92/92 [==============================] - 1s 11ms/step - loss: 1.0304 - accuracy: 0.5913 - val_loss: 0.9515 - val_accuracy: 0.6267
Epoch 3/3
92/92 [==============================] - 1s 11ms/step - loss: 0.8712 - accuracy: 0.6689 - val_loss: 0.9268 - val_accuracy: 0.6471

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

Doğrulama doğruluğunun, eğitim doğruluğuna kıyasla düşük olduğunu fark edebilirsiniz, bu da modelimizin aşırı uyduğunu gösterir. Bu derste aşırı sığdırma ve nasıl azaltılacağı hakkında daha fazla bilgi edinebilirsiniz.

Daha ince kontrol için tf.data kullanma

Yukarıdaki keras.preprocessing yardımcı programları, bir resim dizininden tf.data.Dataset oluşturmanın kullanışlı bir yoludur. Daha ince tane kontrolü için, tf.data kullanarak kendi giriş boru tf.data . Bu bölüm, daha önce indirdiğimiz zip dosyasındaki dosya yollarından başlayarak bunun nasıl yapılacağını gösterir.

 list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)
 
 for f in list_ds.take(5):
  print(f.numpy())
 
b'/home/kbuilder/.keras/datasets/flower_photos/roses/1445228333_59a07e0801.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/dandelion/14128835667_b6a916222c.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/roses/7551637034_55ae047756_n.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/dandelion/4574736702_b15ecf97d0_m.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/roses/6867597533_d65d1c39fb_n.jpg'

Dosyaların ağaç yapısı bir class_names listesi derlemek için kullanılabilir.

 class_names = np.array(sorted([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"]))
print(class_names)
 
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']

Veri kümesini tren ve doğrulamaya ayırın:

 val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)
 

Her veri kümesinin uzunluğunu aşağıdaki gibi görebilirsiniz:

 print(tf.data.experimental.cardinality(train_ds).numpy())
print(tf.data.experimental.cardinality(val_ds).numpy())
 
2936
734

Bir dosya yolunu (img, label) çiftine dönüştüren kısa bir işlev yazın:

 def get_label(file_path):
  # convert the path to a list of path components
  parts = tf.strings.split(file_path, os.path.sep)
  # The second to last is the class-directory
  one_hot = parts[-2] == class_names
  # Integer encode the label
  return tf.argmax(one_hot)
 
 def decode_img(img):
  # convert the compressed string to a 3D uint8 tensor
  img = tf.image.decode_jpeg(img, channels=3)
  # resize the image to the desired size
  return tf.image.resize(img, [img_height, img_width])
 
 def process_path(file_path):
  label = get_label(file_path)
  # load the raw data from the file as a string
  img = tf.io.read_file(file_path)
  img = decode_img(img)
  return img, label
 

Bir image, label veri kümesi image, label çiftleri oluşturmak için Dataset.map kullanın:

 # Set `num_parallel_calls` so multiple images are loaded/processed in parallel.
train_ds = train_ds.map(process_path, num_parallel_calls=AUTOTUNE)
val_ds = val_ds.map(process_path, num_parallel_calls=AUTOTUNE)
 
 for image, label in train_ds.take(1):
  print("Image shape: ", image.numpy().shape)
  print("Label: ", label.numpy())
 
Image shape:  (180, 180, 3)
Label:  2

Veri kümesini performans için yapılandırma

Bu veri kümesiyle bir model eğitmek için verileri isteyeceksiniz:

  • İyi karıştırılmak.
  • Yığınlanacak.
  • Partiler mümkün olan en kısa sürede hazır olacaktır.

Bu özellikler tf.data API'sı kullanılarak eklenebilir. Daha fazla ayrıntı için Giriş Boru Hattı Performansı kılavuzuna bakın.

 def configure_for_performance(ds):
  ds = ds.cache()
  ds = ds.shuffle(buffer_size=1000)
  ds = ds.batch(batch_size)
  ds = ds.prefetch(buffer_size=AUTOTUNE)
  return ds

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)
 

Verileri görselleştirin

Bu veri kümesini daha önce oluşturduğunuza benzer şekilde görselleştirebilirsiniz.

 image_batch, label_batch = next(iter(train_ds))

plt.figure(figsize=(10, 10))
for i in range(9):
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(image_batch[i].numpy().astype("uint8"))
  label = label_batch[i]
  plt.title(class_names[label])
  plt.axis("off")
 

png

Modeli eğitmeye devam et

Şimdi, yukarıda keras.preprocessing tarafından oluşturulana benzer bir tf.data.Dataset oluşturdunuz. Modeli onunla eğitmeye devam edebilirsiniz. Daha önce olduğu gibi, çalışma süresini kısa tutmak için sadece birkaç dönem eğiteceğiz.

 model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
 
Epoch 1/3
92/92 [==============================] - 2s 19ms/step - loss: 0.7267 - accuracy: 0.7272 - val_loss: 0.7963 - val_accuracy: 0.7098
Epoch 2/3
92/92 [==============================] - 1s 11ms/step - loss: 0.5384 - accuracy: 0.7987 - val_loss: 0.8067 - val_accuracy: 0.6894
Epoch 3/3
92/92 [==============================] - 1s 11ms/step - loss: 0.3382 - accuracy: 0.8770 - val_loss: 1.0317 - val_accuracy: 0.6662

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

Sonraki adımlar

Bu eğitimde görüntüleri diskten yüklemenin iki yolu gösterildi. İlk olarak, Keras önişleme katmanlarını ve yardımcı programlarını kullanarak bir görüntü veri kümesini nasıl yükleyeceğinizi ve önişlemeyi öğrendiniz. Sonra, tf.data kullanarak sıfırdan bir giriş boru hattı yazmayı öğrendiniz. Bir sonraki adım olarak, bu eğiticiyi ziyaret ederek veri artırmayı nasıl ekleyeceğinizi öğrenebilirsiniz. Tf.data hakkında daha fazla bilgi edinmek için bu kılavuzu ziyaret edebilirsiniz.