Yeni bir veri kümesi oluşturmak için bu kılavuzu izleyin (TFDS'de veya kendi veri havuzunuzda).
İstediğiniz veri kümesinin zaten mevcut olup olmadığını görmek için veri kümeleri listemize bakın.
TL;DR
Yeni bir veri kümesi yazmanın en kolay yolu TFDS CLI'yi kullanmaktır:
cd path/to/my/project/datasets/
tfds new my_dataset # Create `my_dataset/my_dataset.py` template files
# [...] Manually modify `my_dataset/my_dataset_dataset_builder.py` to implement your dataset.
cd my_dataset/
tfds build # Download and prepare the dataset to `~/tensorflow_datasets/`
Yeni veri kümesini tfds.load('my_dataset') ile kullanmak için:
-
tfds.load~/tensorflow_datasets/my_dataset/dosyasında oluşturulan veri kümesini (örneğintfds buildtarafından) otomatik olarak algılayacak ve yükleyecektir. - Alternatif olarak, veri kümenizi kaydetmek için
import my.project.datasets.my_dataset:
import my.project.datasets.my_dataset # Register `my_dataset`
ds = tfds.load('my_dataset') # `my_dataset` registered
Genel Bakış
Veri kümeleri her türlü formatta ve her türlü yere dağıtılır ve her zaman makine öğrenimi hattına beslenmeye hazır bir formatta saklanmazlar. TFDS'ye girin.
TFDS, bu veri kümelerini standart bir formatta (harici veriler -> serileştirilmiş dosyalar) işler ve bu daha sonra makine öğrenimi ardışık düzeni (serileştirilmiş dosyalar -> tf.data.Dataset ) olarak yüklenebilmektedir. Serileştirme yalnızca bir kez yapılır. Sonraki erişim, önceden işlenmiş dosyalardan doğrudan okunacaktır.
Ön işlemenin çoğu otomatik olarak yapılır. Her veri kümesi, aşağıdakileri belirten bir tfds.core.DatasetBuilder alt sınıfını uygular:
- Verilerin nereden geldiği (yani URL'leri);
- Veri kümesinin neye benzediği (yani özellikleri);
- Verilerin nasıl bölünmesi gerektiği (örn.
TRAINveTEST); - ve veri kümesindeki bireysel örnekler.
Veri kümenizi yazın
Varsayılan şablon: tfds new
Gerekli şablon python dosyalarını oluşturmak için TFDS CLI'yi kullanın.
cd path/to/project/datasets/ # Or use `--dir=path/to/project/datasets/` below
tfds new my_dataset
Bu komut aşağıdaki yapıya sahip yeni bir my_dataset/ klasörü oluşturacaktır:
my_dataset/
__init__.py
README.md # Markdown description of the dataset.
CITATIONS.bib # Bibtex citation for the dataset.
TAGS.txt # List of tags describing the dataset.
my_dataset_dataset_builder.py # Dataset definition
my_dataset_dataset_builder_test.py # Test
dummy_data/ # (optional) Fake data (used for testing)
checksum.tsv # (optional) URL checksums (see `checksums` section).
Burada TODO(my_dataset) ifadesini arayın ve buna göre değişiklik yapın.
Veri kümesi örneği
Tüm veri kümeleri, çoğu standartla ilgilenen tfds.core.DatasetBuilder alt sınıfları tarafından uygulanır. Şunları destekler:
- Tek bir makinede oluşturulabilen küçük/orta ölçekli veri kümeleri (bu eğitim).
- Dağıtılmış üretim gerektiren çok büyük veri kümeleri ( Apache Beam kullanarak büyük veri kümesi kılavuzumuza bakın)
Burada tfds.core.GeneratorBasedBuilder tabanlı bir veri kümesi oluşturucunun minimal bir örneği verilmiştir:
class Builder(tfds.core.GeneratorBasedBuilder):
"""DatasetBuilder for my_dataset dataset."""
VERSION = tfds.core.Version('1.0.0')
RELEASE_NOTES = {
'1.0.0': 'Initial release.',
}
def _info(self) -> tfds.core.DatasetInfo:
"""Dataset metadata (homepage, citation,...)."""
return self.dataset_info_from_configs(
features=tfds.features.FeaturesDict({
'image': tfds.features.Image(shape=(256, 256, 3)),
'label': tfds.features.ClassLabel(
names=['no', 'yes'],
doc='Whether this is a picture of a cat'),
}),
)
def _split_generators(self, dl_manager: tfds.download.DownloadManager):
"""Download the data and define splits."""
extracted_path = dl_manager.download_and_extract('http://data.org/data.zip')
# dl_manager returns pathlib-like objects with `path.read_text()`,
# `path.iterdir()`,...
return {
'train': self._generate_examples(path=extracted_path / 'train_images'),
'test': self._generate_examples(path=extracted_path / 'test_images'),
}
def _generate_examples(self, path) -> Iterator[Tuple[Key, Example]]:
"""Generator of examples for each split."""
for img_path in path.glob('*.jpeg'):
# Yields (key, example)
yield img_path.name, {
'image': img_path,
'label': 'yes' if img_path.name.startswith('yes_') else 'no',
}
Bazı belirli veri formatları için, çoğu veri işleme işlemini üstlenecek kullanıma hazır veri kümesi oluşturucuları sağladığımızı unutmayın.
Üzerine yazmanın 3 soyut yöntemini ayrıntılı olarak görelim.
_info : veri kümesi meta verileri
_info veri kümesi meta verilerini içeren tfds.core.DatasetInfo dosyasını döndürür.
def _info(self):
# The `dataset_info_from_configs` base method will construct the
# `tfds.core.DatasetInfo` object using the passed-in parameters and
# adding: builder (self), description/citations/tags from the config
# files located in the same package.
return self.dataset_info_from_configs(
homepage='https://dataset-homepage.org',
features=tfds.features.FeaturesDict({
'image_description': tfds.features.Text(),
'image': tfds.features.Image(),
# Here, 'label' can be 0-4.
'label': tfds.features.ClassLabel(num_classes=5),
}),
# If there's a common `(input, target)` tuple from the features,
# specify them here. They'll be used if as_supervised=True in
# builder.as_dataset.
supervised_keys=('image', 'label'),
# Specify whether to disable shuffling on the examples. Set to False by default.
disable_shuffling=False,
)
Çoğu alan kendi kendini açıklayıcı olmalıdır. Bazı kesinlikler:
-
features: Bu, veri kümesi yapısını, şeklini belirtir... Karmaşık veri türlerini destekler (ses, video, iç içe diziler,...). Daha fazla bilgi için mevcut özelliklere veya özellik konektörü kılavuzuna bakın. -
disable_shuffling: Veri kümesi sırasını koruma bölümüne bakın.
BibText CITATIONS.bib dosyasının yazılması:
- Alıntı talimatları için veri kümesi web sitesinde arama yapın (bunu BibTex formatında kullanın).
- arXiv kağıtları için: makaleyi bulun ve sağ taraftaki
BibTextbağlantısını tıklayın. - Makaleyi Google Akademik'te bulun ve başlığın altındaki çift tırnak işaretini tıklayın ve açılır pencerede
BibTeXtıklayın. - İlişkili bir makale yoksa (örneğin, yalnızca bir web sitesi varsa), özel bir BibTeX girişi oluşturmak için BibTeX Çevrimiçi Düzenleyiciyi kullanabilirsiniz (açılır menüde
Onlinegiriş türü vardır).
TAGS.txt dosyasını güncelleme:
- İzin verilen tüm etiketler oluşturulan dosyaya önceden doldurulmuştur.
- Veri kümesi için geçerli olmayan tüm etiketleri kaldırın.
- Geçerli etiketler tensorflow_datasets/core/valid_tags.txt dosyasında listelenir.
- Bu listeye etiket eklemek için lütfen PR gönderin.
Veri kümesi sırasını koruyun
Varsayılan olarak, aynı sınıfa ait kayıtlar bitişik olduğundan, sınıfların veri kümesindeki dağılımını daha tekdüze hale getirmek için veri kümelerinin kayıtları saklanırken karıştırılır. Veri kümesinin _generate_examples tarafından sağlanan anahtara göre sıralanması gerektiğini belirtmek için, disable_shuffling alanı True olarak ayarlanmalıdır. Varsayılan olarak False olarak ayarlanmıştır.
def _info(self):
return self.dataset_info_from_configs(
# [...]
disable_shuffling=True,
# [...]
)
Parçalar artık paralel olarak okunamayacağından, karıştırmayı devre dışı bırakmanın performans üzerinde etkisi olacağını unutmayın.
_split_generators : verileri indirir ve böler
Kaynak verileri indirme ve çıkarma
Çoğu veri kümesinin web'den veri indirmesi gerekir. Bu, _split_generators tfds.download.DownloadManager giriş argümanı kullanılarak yapılır. dl_manager aşağıdaki yöntemlere sahiptir:
-
download:http(s)://,ftp(s)://destekler -
extract: şu anda.zip,.gzve.tardosyalarını desteklemektedir. -
download_and_extract:dl_manager.extract(dl_manager.download(urls))ile aynı
Tüm bu yöntemler, pathlib.Path benzeri nesneler olan tfds.core.Path ( epath.Path için takma adlar) döndürür.
Bu yöntemler, aşağıdaki gibi isteğe bağlı iç içe geçmiş yapıyı ( list , dict ) destekler:
extracted_paths = dl_manager.download_and_extract({
'foo': 'https://example.com/foo.zip',
'bar': 'https://example.com/bar.zip',
})
# This returns:
assert extracted_paths == {
'foo': Path('/path/to/extracted_foo/'),
'bar': Path('/path/extracted_bar/'),
}
Manuel indirme ve çıkarma
Bazı veriler otomatik olarak indirilemez (örn. oturum açma gerektirir), bu durumda kullanıcı kaynak verileri manuel olarak indirecek ve manual_dir/ dizinine yerleştirecektir (varsayılan olarak ~/tensorflow_datasets/downloads/manual/ ).
Dosyalara daha sonra dl_manager.manual_dir aracılığıyla erişilebilir:
class MyDataset(tfds.core.GeneratorBasedBuilder):
MANUAL_DOWNLOAD_INSTRUCTIONS = """
Register into https://example.org/login to get the data. Place the `data.zip`
file in the `manual_dir/`.
"""
def _split_generators(self, dl_manager):
# data_path is a pathlib-like `Path('<manual_dir>/data.zip')`
archive_path = dl_manager.manual_dir / 'data.zip'
# Extract the manually downloaded `data.zip`
extracted_path = dl_manager.extract(archive_path)
...
manual_dir konumu tfds build --manual_dir= ile veya tfds.download.DownloadConfig kullanılarak özelleştirilebilir.
Arşivi doğrudan oku
dl_manager.iter_archive arşivleri çıkarmadan sırayla okur. Bu, depolama alanından tasarruf sağlayabilir ve bazı dosya sistemlerinde performansı artırabilir.
for filename, fobj in dl_manager.iter_archive('path/to/archive.zip'):
...
fobj with open('rb') as fobj: (örn. fobj.read() )
Veri kümesi bölmelerini belirtme
Veri kümesi önceden tanımlanmış bölmelerle birlikte geliyorsa (örneğin, MNIST train ve test bölmeleri vardır), bunları saklayın. Aksi takdirde, yalnızca tek bir all bölme belirtin. Kullanıcılar, alt bölme API'si ile dinamik olarak kendi alt bölmelerini oluşturabilirler (örn split='train[80%:]' ). Yukarıda belirtilen all dışında herhangi bir alfabetik dizenin bölünmüş ad olarak kullanılabileceğini unutmayın.
def _split_generators(self, dl_manager):
# Download source data
extracted_path = dl_manager.download_and_extract(...)
# Specify the splits
return {
'train': self._generate_examples(
images_path=extracted_path / 'train_imgs',
label_path=extracted_path / 'train_labels.csv',
),
'test': self._generate_examples(
images_path=extracted_path / 'test_imgs',
label_path=extracted_path / 'test_labels.csv',
),
}
_generate_examples : Örnek oluşturucu
_generate_examples kaynak verilerden her bir bölünme için örnekler oluşturur.
Bu yöntem genellikle kaynak veri kümesi yapıtlarını (örneğin bir CSV dosyası) ve verim (key, feature_dict) tanımlamalarını okuyacaktır:
-
key: Örnek tanımlayıcı. Örneklerihash(key)kullanarak deterministik olarak karıştırmak veya karıştırma devre dışı bırakıldığında anahtara göre sıralamak için kullanılır (bkz. bölüm Veri kümesi sırasını koruma ). Olmalı:- benzersiz : İki örnek aynı anahtarı kullanıyorsa bir istisna ortaya çıkar.
- deterministik :
download_dir,os.path.listdirsırasına bağlı olmamalıdır... Verilerin iki kez oluşturulması aynı anahtarı vermelidir. - karşılaştırılabilir : Karıştırma devre dışı bırakılırsa, veri kümesini sıralamak için anahtar kullanılacaktır.
-
feature_dict: Örnek değerleri içeren birdict.- Yapı,
tfds.core.DatasetInfotanımlananfeatures=yapıyla eşleşmelidir. - Karmaşık veri türleri (resim, video, ses,...) otomatik olarak kodlanacaktır.
- Her özellik genellikle birden fazla giriş türünü kabul eder (örn. video kabul
/path/to/vid.mp4,np.array(shape=(l, h, w, c)),List[paths],List[np.array(shape=(h, w, c)],List[img_bytes],...) - Daha fazla bilgi için özellik konektörü kılavuzuna bakın.
- Yapı,
def _generate_examples(self, images_path, label_path):
# Read the input data out of the source files
with label_path.open() as f:
for row in csv.DictReader(f):
image_id = row['image_id']
# And yield (key, feature_dict)
yield image_id, {
'image_description': row['description'],
'image': images_path / f'{image_id}.jpeg',
'label': row['label'],
}
Dosya erişimi ve tf.io.gfile
Bulut depolama sistemlerini desteklemek için Python'un yerleşik G/Ç işlemlerini kullanmaktan kaçının.
Bunun yerine dl_manager , Google Cloud depolama alanıyla doğrudan uyumlu olan pathlib benzeri nesneleri döndürür:
path = dl_manager.download_and_extract('http://some-website/my_data.zip')
json_path = path / 'data/file.json'
json.loads(json_path.read_text())
Alternatif olarak, dosya işlemleri için yerleşik yerine tf.io.gfile API'sini kullanın:
-
open->tf.io.gfile.GFile -
os.rename->tf.io.gfile.rename - ...
Pathlib, tf.io.gfile yerine tercih edilmelidir ( bkz .
Ekstra bağımlılıklar
Bazı veri kümeleri yalnızca oluşturma sırasında ek Python bağımlılıkları gerektirir. Örneğin, SVHN veri kümesi bazı verileri yüklemek için scipy kullanır.
TFDS deposuna veri kümesi ekliyorsanız tensorflow-datasets paketini küçük tutmak için lütfen tfds.core.lazy_imports kullanın. Kullanıcılar yalnızca gerektiğinde ek bağımlılıklar yükleyecektir.
lazy_imports kullanmak için:
-
setup.pydosyasındakiDATASET_EXTRASiçine veri kümeniz için bir giriş ekleyin. Bu, kullanıcıların ekstra bağımlılıkları yüklemek için örneğinpip install 'tensorflow-datasets[svhn]'işlemini yapabilmesini sağlar. - İçe aktarma işleminiz için
LazyImporterveLazyImportsTestbir giriş ekleyin. -
DatasetBuilderbağımlılığa (örneğin,tfds.core.lazy_imports.scipy) erişmek içintfds.core.lazy_importskullanın.
Bozuk veriler
Bazı veri kümeleri tamamen temiz değildir ve bazı bozuk veriler içerir (örneğin, görüntüler JPEG dosyalarındadır ancak bazıları geçersiz JPEG'dir). Bu örnekler atlanmalıdır ancak veri kümesi açıklamasında kaç örneğin atlandığı ve bunun nedeni hakkında bir not bırakın.
Veri kümesi yapılandırması/varyantları (tfds.core.BuilderConfig)
Bazı veri kümelerinin, verilerin nasıl önceden işleneceğine ve diske nasıl yazılacağına ilişkin birden fazla çeşidi veya seçeneği olabilir. Örneğin, cycle_gan'ın nesne çifti başına bir yapılandırması vardır ( cycle_gan/horse2zebra , cycle_gan/monet2photo ,...).
Bu, tfds.core.BuilderConfig s aracılığıyla yapılır:
Yapılandırma nesnenizi
tfds.core.BuilderConfigöğesinin bir alt sınıfı olarak tanımlayın. Örneğin,MyDatasetConfig.@dataclasses.dataclass class MyDatasetConfig(tfds.core.BuilderConfig): img_size: Tuple[int, int] = (0, 0)MyDataset, veri kümesinin sunduğuMyDatasetConfiglisteleyenBUILDER_CONFIGS = []sınıf üyesini tanımlayın.class MyDataset(tfds.core.GeneratorBasedBuilder): VERSION = tfds.core.Version('1.0.0') # pytype: disable=wrong-keyword-args BUILDER_CONFIGS = [ # `name` (and optionally `description`) are required for each config MyDatasetConfig(name='small', description='Small ...', img_size=(8, 8)), MyDatasetConfig(name='big', description='Big ...', img_size=(32, 32)), ] # pytype: enable=wrong-keyword-argsVeri oluşturmayı yapılandırmak için
MyDatasetself.builder_configkullanın (örneğin,shape=self.builder_config.img_size). Bu_info()da farklı değerlerin ayarlanmasını veya indirme veri erişiminin değiştirilmesini içerebilir.
Notlar:
- Her yapılandırmanın benzersiz bir adı vardır. Bir yapılandırmanın tam adı
dataset_name/config_name(örn.coco/2017). - Belirtilmemişse,
BUILDER_CONFIGSiçindeki ilk yapılandırma kullanılacaktır (örn.tfds.load('c4')varsayılanıc4/en)
BuilderConfig s'yi kullanan bir veri kümesi örneği için anli bakın.
Sürüm
Sürüm iki farklı anlama gelebilir:
- "Harici" orijinal veri sürümü: örneğin COCO v2019, v2017,...
- "Dahili" TFDS kod sürümü: örneğin
tfds.features.FeaturesDictiçindeki bir özelliği yeniden adlandırın,_generate_examplesiçindeki bir hatayı düzeltin
Bir veri kümesini güncellemek için:
- "Harici" veri güncellemesi için: Birden fazla kullanıcı aynı anda belirli bir yıla/versiyona erişmek isteyebilir. Bu, sürüm başına bir
tfds.core.BuilderConfig(örneğincoco/2017,coco/2019) veya sürüm başına bir sınıf (örneğinVoc2007,Voc2012) kullanılarak yapılır. - "Dahili" kod güncellemesi için: Kullanıcılar yalnızca en yeni sürümü indirir. Herhangi bir kod güncellemesinin , anlamsal sürüm belirlemeyi takiben
VERSIONsınıfı özniteliğini (örneğin1.0.0VERSION = tfds.core.Version('2.0.0')) artırması gerekir.
Kayıt için içe aktarma ekleme
tfds.load , tfds.builder otomatik olarak kaydedilmesi için veri kümesi modülünü __init__ projenize aktarmayı unutmayın.
import my_project.datasets.my_dataset # Register MyDataset
ds = tfds.load('my_dataset') # MyDataset available
Örneğin, tensorflow/datasets katkıda bulunuyorsanız, modül içe aktarımını alt dizininin __init__.py dizinine ekleyin (örn. image/__init__.py .
Yaygın uygulama kazanımlarını kontrol edin
Lütfen ortak uygulama kazanımlarını kontrol edin.
Veri kümenizi test edin
İndirin ve hazırlayın: tfds build
Veri kümesini oluşturmak için my_dataset/ dizininden tfds build çalıştırın:
cd path/to/datasets/my_dataset/
tfds build --register_checksums
Geliştirme için bazı yararlı bayraklar:
-
--pdb: Bir istisna ortaya çıkarsa hata ayıklama moduna girin. -
--overwrite: Veri kümesi zaten oluşturulmuşsa mevcut dosyaları silin. -
--max_examples_per_split: Tam veri kümesi yerine yalnızca ilk X örneklerini (varsayılan olarak 1'dir) oluşturun. -
--register_checksums: İndirilen URL'lerin sağlama toplamlarını kaydedin. Yalnızca geliştirme aşamasında kullanılmalıdır.
İşaretlerin tam listesi için CLI belgelerine bakın.
Sağlama toplamları
Belirleyiciliği garanti etmek, dokümantasyona yardımcı olmak için veri kümelerinizin sağlama toplamlarını kaydetmeniz önerilir. Bu, --register_checksums ile veri kümesi oluşturularak yapılır (önceki bölüme bakın).
Veri kümelerinizi PyPI aracılığıyla yayınlıyorsanız checksums.tsv dosyalarını (örneğin setup.py dosyanızın package_data dosyasında) dışa aktarmayı unutmayın.
Veri kümenizde birim testi yapın
tfds.testing.DatasetBuilderTestCase , bir veri kümesini tam olarak kullanmaya yönelik temel bir TestCase . Kaynak veri kümesinin yapısını taklit eden test verileri olarak "kukla verileri" kullanır.
- Test verileri
my_dataset/dummy_data/dizinine yerleştirilmeli ve indirilen ve çıkarılan kaynak veri kümesi yapıtlarını taklit etmelidir. Bir komut dosyasıyla ( örnek komut dosyası ) manuel veya otomatik olarak oluşturulabilir. - Veri kümesi bölmeleriniz çakışırsa test başarısız olacağından, test veri bölmelerinizde farklı veriler kullandığınızdan emin olun.
- Test verileri telif hakkıyla korunan herhangi bir materyal içermemelidir . Şüpheniz varsa, verileri orijinal veri kümesindeki materyalleri kullanarak oluşturmayın.
import tensorflow_datasets as tfds
from . import my_dataset_dataset_builder
class MyDatasetTest(tfds.testing.DatasetBuilderTestCase):
"""Tests for my_dataset dataset."""
DATASET_CLASS = my_dataset_dataset_builder.Builder
SPLITS = {
'train': 3, # Number of fake train example
'test': 1, # Number of fake test example
}
# If you are calling `download/download_and_extract` with a dict, like:
# dl_manager.download({'some_key': 'http://a.org/out.txt', ...})
# then the tests needs to provide the fake output paths relative to the
# fake data directory
DL_EXTRACT_RESULT = {
'name1': 'path/to/file1', # Relative to my_dataset/dummy_data dir.
'name2': 'file2',
}
if __name__ == '__main__':
tfds.testing.test_main()
Veri kümesini test etmek için aşağıdaki komutu çalıştırın.
python my_dataset_test.py
Bize geri bildirim gönderin
Veri kümesi oluşturma iş akışını sürekli olarak iyileştirmeye çalışıyoruz ancak bunu yalnızca sorunların farkında olduğumuzda yapabiliriz. Veri kümesini oluştururken hangi sorunlarla veya hatalarla karşılaştınız? Kafa karıştırıcı olan veya ilk seferde çalışmayan bir kısım var mıydı?
Lütfen geri bildiriminizi GitHub'da paylaşın.