MLコミュニティデーは11月9日です! TensorFlow、JAXからの更新のために私たちに参加し、より多くの詳細をご覧ください

TFDSを使用して外部tfrecordをロードします

あなたが持っている場合はtf.train.Exampleプロト(内部.tfrecord.riegeliサードパーティのツールによって生成された、...)、、あなたは直接のTFD APIをロードしたいと、このページはあなたのためです。

ごロードするために.tfrecordファイルを、あなただけに必要です:

  • TFDSの命名規則に従ってください。
  • メタデータファイル(追加dataset_info.jsonfeatures.jsonごtfrecordファイルに沿って)。

制限:

ファイル名の規則

あなたのためには.tfrecord TFDSによって検出されるファイル、彼らは次の命名規則に従ってくださいする必要があります<dataset_name>-<split_name>.<file-extension>-xxxxx-of-yyyyy

例えば、MNISTがあり、次のファイルを

  • mnist-test.tfrecord-00000-of-00001
  • mnist-train.tfrecord-00000-of-00001

メタデータを追加する

素性構造を提供する

TFDSが解読できるようにするにはtf.train.Exampleプロトを、あなたが提供する必要がありtfds.featuresあなたの仕様に一致するsturcture。例えば:

features = tfds.features.FeaturesDict({
    'image': tfds.features.Image(shape=(256, 256, 3)),
    '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.featuresに変換tf.train.Example 、あなたがコラボで試すことができます:

  • 翻訳するためにtfds.featuresの人間が読める構造にtf.train.Example 、あなたが呼び出すことができますfeatures.get_serialized_info()
  • 正確な取得するにはFixedLenFeature 、...に渡される仕様tf.io.parse_single_example 、次のコードスニペットを使用することができます。

    example_specs = features.get_serialized_info()
    parser = tfds.core.example_parser.ExampleParser(example_specs)
    nested_feature_specs = parser._build_feature_specs()
    feature_specs = tfds.core.utils.flatten_nest_dict(nested_feature_specs)
    

分割に関する統計を取得する

TFDSでは、各シャード内の例の正確な数を知る必要があります。これは、のような機能のために必要とされlen(ds)またはsubplitのAPIsplit='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.core.write_metadata

tfds.folder_dataset.write_metadata(
    builder_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/',

    # 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.core.builder_from_directory返しtfds.core.DatasetBuilder (のような標準TFDSのAPIでtfds.builder ):

builder = tfds.core.builder_from_directory('~/path/to/my_dataset/3.0.0/')

# Metadata are avalailable 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/

これは、との互換性があなたのデータセットになりますtfds.load / tfds.builder単純に提供することで、APIを、 data_dir/

ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')