Veri setleri

Birçok makine öğrenimi modelinde, özellikle denetimli öğrenmede, veri kümeleri eğitim sürecinin hayati bir parçasıdır. TensorFlow için Swift, model deposundaki Veri Kümeleri modülünde çeşitli ortak veri kümeleri için sarmalayıcılar sağlar. Bu sarmalayıcılar, Swift tabanlı modellerle ortak veri kümelerinin kullanımını kolaylaştırır ve Swift for TensorFlow'un genelleştirilmiş eğitim döngüsüyle iyi bir şekilde bütünleşir.

Sağlanan veri kümesi sarmalayıcıları

Bunlar, model deposunda şu anda sağlanan veri kümesi sarmalayıcılarıdır:

Bu veri kümesi sarmalayıcılarından birini bir Swift projesinde kullanmak için Datasets Swift hedefinize bağımlılık olarak ekleyin ve modülü içe aktarın:

import Datasets

Çoğu veri kümesi sarmalayıcı, rastgele karıştırılmış etiketli veri yığınları üretmek üzere tasarlanmıştır. Örneğin, CIFAR-10 veri kümesini kullanmak için öncelikle onu istenen toplu iş boyutuyla başlatırsınız:

let dataset = CIFAR10(batchSize: 100)

İlk kullanımda, Swift for TensorFlow veri kümesi sarmalayıcıları sizin için orijinal veri kümesini otomatik olarak indirecek, ilgili tüm arşivleri çıkaracak ve ayrıştıracak ve ardından işlenen veri kümesini kullanıcının yerel önbellek dizininde depolayacaktır. Aynı veri kümesinin sonraki kullanımları doğrudan yerel önbellekten yüklenecektir.

Bu veri kümesini içeren manuel bir eğitim döngüsü oluşturmak için aşağıdakine benzer bir şey kullanırsınız:

for (epoch, epochBatches) in dataset.training.prefix(100).enumerated() {
  Context.local.learningPhase = .training
  ...
  for batch in epochBatches {
    let (images, labels) = (batch.data, batch.label)
    ...
  }
}

Yukarıdakiler, 100 dönem ( .prefix(100) ) boyunca bir yineleyici ayarlar ve geçerli çağın sayısal indeksini ve o dönemi oluşturan karıştırılmış gruplar üzerinde tembel eşlenmiş bir diziyi döndürür. Her eğitim döneminde gruplar yinelenir ve işlenmek üzere çıkarılır. CIFAR10 veri kümesi sarmalayıcısı durumunda, her toplu iş bir LabeledImage ve bu toplu işteki tüm görüntüleri içeren bir Tensor<Float> ve eşleşen etiketleriyle birlikte bir Tensor<Int32> sağlar.

CIFAR-10 durumunda tüm veri seti küçüktür ve belleğe tek seferde yüklenebilmektedir, ancak diğer büyük veri kümelerinde gruplar diskten yavaş bir şekilde yüklenir ve her bir grubun elde edildiği noktada işlenir. Bu, daha büyük veri kümelerinde belleğin tükenmesini önler.

Epochs API'si

Bu veri kümesi sarmalayıcılarının çoğu, Epochs API adını verdiğimiz paylaşılan bir altyapı üzerine kuruludur. Epochs, metinden görsellere ve daha fazlasına kadar çok çeşitli veri kümesi türlerini desteklemeyi amaçlayan esnek bileşenler sağlar.

Kendi Swift veri kümesi sarmalayıcınızı oluşturmak istiyorsanız büyük olasılıkla bunu yapmak için Epochs API'yi kullanmak isteyeceksiniz. Ancak görüntü sınıflandırma veri kümeleri gibi yaygın durumlarda, mevcut veri kümesi paketleyicilerinden birini temel alan bir şablonla başlamanızı ve bunu özel ihtiyaçlarınızı karşılayacak şekilde değiştirmenizi kesinlikle öneririz.

Örnek olarak CIFAR-10 veri seti sarmalayıcısını ve nasıl çalıştığını inceleyelim. Eğitim veri kümesinin çekirdeği burada tanımlanır:

let trainingSamples = loadCIFARTrainingFiles(in: localStorageDirectory)
training = TrainingEpochs(samples: trainingSamples, batchSize: batchSize, entropy: entropy)
  .lazy.map { (batches: Batches) -> LazyMapSequence<Batches, LabeledImage> in
    return batches.lazy.map{
      makeBatch(samples: $0, mean: mean, standardDeviation: standardDeviation, device: device)
  }
}

loadCIFARTrainingFiles() işlevinin sonucu, eğitim veri kümesindeki her görüntü için bir (data: [UInt8], label: Int32) tuple dizisidir. Bu daha sonra, batchSize kümeleriyle sonsuz bir dönem dizisi oluşturmak için TrainingEpochs(samples:batchSize:entropy:) işlevine sağlanır. Belirleyici toplu işlem davranışı isteyebileceğiniz durumlarda kendi rastgele sayı oluşturucunuzu sağlayabilirsiniz, ancak varsayılan olarak SystemRandomNumberGenerator kullanılır.

Buradan, gruplar üzerindeki tembel haritalar makeBatch(samples:mean:standardDeviation:device:) işleviyle sonuçlanır. Bu, CIFAR-10 veri kümesi için gerçek görüntü işleme hattının bulunduğu özel bir işlevdir; hadi şuna bir göz atalım:

fileprivate func makeBatch<BatchSamples: Collection>(
  samples: BatchSamples, mean: Tensor<Float>?, standardDeviation: Tensor<Float>?, device: Device
) -> LabeledImage where BatchSamples.Element == (data: [UInt8], label: Int32) {
  let bytes = samples.lazy.map(\.data).reduce(into: [], +=)
  let images = Tensor<UInt8>(shape: [samples.count, 3, 32, 32], scalars: bytes, on: device)

  var imageTensor = Tensor<Float>(images.transposed(permutation: [0, 2, 3, 1]))
  imageTensor /= 255.0
  if let mean = mean, let standardDeviation = standardDeviation {
    imageTensor = (imageTensor - mean) / standardDeviation
  }

  let labels = Tensor<Int32>(samples.map(\.label), on: device)
  return LabeledImage(data: imageTensor, label: labels)
}

Bu işlevin iki satırı, gelen BatchSamples gelen tüm data baytlarını, ham CIFAR-10 veri kümesi içindeki görüntülerin bayt düzeniyle eşleşen bir Tensor<UInt8> de birleştirir. Daha sonra, görüntü kanalları, standart görüntü sınıflandırma modellerimizde beklenenlerle eşleşecek şekilde yeniden düzenlenir ve görüntü verileri, model tüketimi için bir Tensor<Float> a yeniden dönüştürülür.

Birçok görüntü sınıflandırma modelini eğitirken yaygın olarak kullanılan bir işlem olan görüntü kanalı değerlerini daha da ayarlamak için isteğe bağlı normalleştirme parametreleri sağlanabilir. Normalleştirme parametresi Tensor veri kümesi başlatılırken bir kez oluşturulur ve daha sonra aynı değerlere sahip küçük geçici tensörlerin tekrar tekrar oluşturulmasını önlemek için bir optimizasyon olarak makeBatch() a aktarılır.

Son olarak, tamsayı etiketleri bir Tensor<Int32> içine yerleştirilir ve görüntü/etiket tensör çifti bir LabeledImage içinde döndürülür. LabeledImage , Eppch API'nin Collatable protokolüne uygun veri ve etiketlere sahip bir yapı olan LabeledData özel bir durumudur.

Farklı veri kümesi türlerindeki Epochs API'nin daha fazla örneği için model deposundaki diğer veri kümesi sarmalayıcılarını inceleyebilirsiniz.