타사 도구로 생성된 tf.train.Example
proto( .tfrecord
, .riegeli
,... 내부)가 있고 tfds API로 직접 로드하려는 경우 이 페이지가 적합합니다.
.tfrecord
파일을 로드하려면 다음만 수행하면 됩니다.
- TFDS 명명 규칙을 따릅니다.
- tfrecord 파일을 따라 메타데이터 파일(
dataset_info.json
,features.json
)을 추가합니다.
제한사항:
-
tf.train.SequenceExample
은 지원되지 않으며,tf.train.Example
만 지원됩니다. -
tfds.features
측면에서tf.train.Example
표현할 수 있어야 합니다(아래 섹션 참조).
파일 명명 규칙
TFDS는 파일 이름에 대한 템플릿 정의를 지원하므로 다양한 파일 이름 지정 체계를 사용할 수 있는 유연성을 제공합니다. 템플릿은 tfds.core.ShardedFileTemplate
으로 표시되며 {DATASET}
, {SPLIT}
, {FILEFORMAT}
, {SHARD_INDEX}
, {NUM_SHARDS}
및 {SHARD_X_OF_Y}
변수를 지원합니다. 예를 들어 TFDS의 기본 파일 명명 체계는 {DATASET}-{SPLIT}.{FILEFORMAT}-{SHARD_X_OF_Y}
입니다. MNIST의 경우 이는 파일 이름이 다음과 같다는 것을 의미합니다.
-
mnist-test.tfrecord-00000-of-00001
-
mnist-train.tfrecord-00000-of-00001
메타데이터 추가
기능 구조 제공
TFDS가 tf.train.Example
proto를 디코딩할 수 있으려면 사양과 일치하는 tfds.features
구조를 제공해야 합니다. 예를 들어:
features = tfds.features.FeaturesDict({
'image':
tfds.features.Image(
shape=(256, 256, 3),
doc='Picture taken by smartphone, downscaled.'),
'label':
tfds.features.ClassLabel(names=['dog', 'cat']),
'objects':
tfds.features.Sequence({
'camera/K': tfds.features.Tensor(shape=(3,), dtype=tf.float32),
}),
})
다음 tf.train.Example
사양에 해당합니다.
{
'image': tf.io.FixedLenFeature(shape=(), dtype=tf.string),
'label': tf.io.FixedLenFeature(shape=(), dtype=tf.int64),
'objects/camera/K': tf.io.FixedLenSequenceFeature(shape=(3,), dtype=tf.int64),
}
기능을 지정하면 TFDS가 이미지, 비디오 등을 자동으로 디코딩할 수 있습니다. 다른 TFDS 데이터세트와 마찬가지로 기능 메타데이터(예: 라벨 이름...)가 사용자에게 노출됩니다(예: info.features['label'].names
).
생성 파이프라인을 제어하는 경우
TFDS 외부에서 데이터 세트를 생성하지만 여전히 생성 파이프라인을 제어하는 경우 tfds.features.FeatureConnector.serialize_example
사용하여 dict[np.ndarray]
에서 tf.train.Example
proto bytes
로 데이터를 인코딩할 수 있습니다.
with tf.io.TFRecordWriter('path/to/file.tfrecord') as writer:
for ex in all_exs:
ex_bytes = features.serialize_example(data)
writer.write(ex_bytes)
이렇게 하면 TFDS와의 기능 호환성이 보장됩니다.
마찬가지로, proto를 디코딩하기 위해 feature.deserialize_example
이 존재합니다( 예 ).
생성 파이프라인을 제어하지 않는 경우
tfds.features
tf.train.Example
에서 어떻게 표현되는지 확인하려면 colab에서 이를 검토할 수 있습니다.
-
tfds.features
사람이 읽을 수 있는tf.train.Example
구조로 변환하려면features.get_serialized_info()
호출하면 됩니다. -
tf.io.parse_single_example
에 전달된 정확한FixedLenFeature
,... 사양을 얻으려면spec = features.tf_example_spec
사용할 수 있습니다.
분할에 대한 통계 얻기
TFDS는 각 샤드 내의 정확한 예시 수를 알아야 합니다. 이는 len(ds)
또는 subplit API ( split='train[75%:]'
와 같은 기능에 필요합니다.
이 정보가 있으면
tfds.core.SplitInfo
목록을 명시적으로 생성하고 다음 섹션으로 건너뛸 수 있습니다.split_infos = [ tfds.core.SplitInfo( name='train', shard_lengths=[1024, ...], # Num of examples in shard0, shard1,... num_bytes=0, # Total size of your dataset (if unknown, set to 0) ), tfds.core.SplitInfo(name='test', ...), ]
이 정보를 모르는 경우
compute_split_info.py
스크립트를 사용하여(또는tfds.folder_dataset.compute_split_info
를 사용하여 자체 스크립트에서) 계산할 수 있습니다. 지정된 디렉터리의 모든 샤드를 읽고 정보를 계산하는 빔 파이프라인을 시작합니다.
메타데이터 파일 추가
데이터세트에 적절한 메타데이터 파일을 자동으로 추가하려면 tfds.folder_dataset.write_metadata
사용하세요.
tfds.folder_dataset.write_metadata(
data_dir='/path/to/my/dataset/1.0.0/',
features=features,
# Pass the `out_dir` argument of compute_split_info (see section above)
# You can also explicitly pass a list of `tfds.core.SplitInfo`.
split_infos='/path/to/my/dataset/1.0.0/',
# Pass a custom file name template or use None for the default TFDS
# file name template.
filename_template='{SPLIT}-{SHARD_X_OF_Y}.{FILEFORMAT}',
# Optionally, additional DatasetInfo metadata can be provided
# See:
# https://www.tensorflow.org/datasets/api_docs/python/tfds/core/DatasetInfo
description="""Multi-line description."""
homepage='http://my-project.org',
supervised_keys=('image', 'label'),
citation="""BibTex citation.""",
)
데이터세트 디렉터리에서 함수가 한 번 호출되면 메타데이터 파일( dataset_info.json
,...)이 추가되고 데이터세트를 TFDS로 로드할 준비가 됩니다(다음 섹션 참조).
TFDS로 데이터 세트 로드
폴더에서 직접
메타데이터가 생성되면 표준 TFDS API(예: tfds.builder
)를 사용하여 tfds.core.DatasetBuilder
를 반환하는 tfds.builder_from_directory
사용하여 데이터세트를 로드할 수 있습니다.
builder = tfds.builder_from_directory('~/path/to/my_dataset/3.0.0/')
# Metadata are available as usual
builder.info.splits['train'].num_examples
# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
...
여러 폴더에서 직접
여러 폴더에서 데이터를 로드하는 것도 가능합니다. 예를 들어 강화 학습에서 여러 에이전트가 각각 별도의 데이터 세트를 생성하고 이를 모두 함께 로드하려는 경우 이런 일이 발생할 수 있습니다. 다른 사용 사례는 정기적으로 새 데이터 세트가 생성되는 경우(예: 매일 새 데이터 세트)이며 특정 날짜 범위의 데이터를 로드하려는 경우입니다.
여러 폴더에서 데이터를 로드하려면 표준 TFDS API(예: tfds.builder
)를 사용하여 tfds.core.DatasetBuilder
를 반환하는 tfds.builder_from_directories
사용하세요.
builder = tfds.builder_from_directories(builder_dirs=[
'~/path/my_dataset/agent1/1.0.0/',
'~/path/my_dataset/agent2/1.0.0/',
'~/path/my_dataset/agent3/1.0.0/',
])
# Metadata are available as usual
builder.info.splits['train'].num_examples
# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
...
폴더 구조(선택사항)
TFDS와의 호환성을 높이기 위해 데이터를 <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version>
으로 구성할 수 있습니다. 예를 들어:
data_dir/
dataset0/
1.0.0/
1.0.1/
dataset1/
config0/
2.0.0/
config1/
2.0.0/
이렇게 하면 간단히 data_dir/
제공하여 데이터 세트가 tfds.load
/ tfds.builder
API와 호환되게 됩니다.
ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')