Tải tfrecord bên ngoài bằng TFDS

Nếu bạn có một proto tf.train.Example (bên trong .tfrecord , .riegeli , ...), được tạo bởi các công cụ của bên thứ ba, mà bạn muốn tải trực tiếp bằng API tfds, thì trang này là dành cho bạn.

Để tải các tệp .tfrecord của bạn, bạn chỉ cần:

  • Tuân theo quy ước đặt tên TFDS.
  • Thêm tệp siêu dữ liệu ( dataset_info.json , features.json ) cùng với tệp tfrecord của bạn.

Hạn chế:

Quy ước đặt tên tệp

Để TFDS phát hiện các tệp .tfrecord của bạn, chúng cần tuân theo quy ước đặt tên sau: <dataset_name>-<split_name>.<file-extension>-xxxxx-of-yyyyy

Ví dụ: MNIST có các tệp sau :

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

Thêm siêu dữ liệu

Cung cấp cấu trúc tính năng

Để TFDS có thể giải mã proto tf.train.Example , bạn cần cung cấp cấu trúc tfds.features phù hợp với thông số kỹ thuật của bạn. Ví dụ:

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),
        }),
})

Tương ứng với thông số kỹ thuật tf.train.Example sau:

{
    '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),
}

Việc chỉ định các tính năng cho phép TFDS tự động giải mã hình ảnh, video, ... Giống như bất kỳ bộ dữ liệu TFDS nào khác, siêu dữ liệu tính năng (ví dụ: tên nhãn, ...) sẽ được hiển thị cho người dùng (ví dụ: info.features['label'].names ).

Nếu bạn kiểm soát quá trình tạo

Nếu bạn tạo tập dữ liệu bên ngoài TFDS nhưng vẫn kiểm soát đường dẫn tạo, bạn có thể sử dụng tfds.features.FeatureConnector.serialize_example để mã hóa dữ liệu của bạn từ dict[np.ndarray] thành tf.train.Example : bytes proto:

with tf.io.TFRecordWriter('path/to/file.tfrecord') as writer:
  for ex in all_exs:
    ex_bytes = features.serialize_example(data)
    f.write(ex_bytes)

Điều này sẽ đảm bảo tính tương thích của tính năng với TFDS.

Tương tự, một feature.deserialize_example tồn tại để giải mã proto ( ví dụ )

Nếu bạn không kiểm soát quá trình tạo

Nếu bạn muốn xem tfds.features được biểu diễn như thế nào trong tf.train.Example . Ví dụ, bạn có thể kiểm tra điều này trong colab:

  • Để dịch tfds.features thành cấu trúc có thể đọc được của con người của tf.train.Example , bạn có thể gọi features.get_serialized_info() .
  • Để nhận thông số FixedLenFeature , ... chính xác được chuyển đến tf.io.parse_single_example , bạn có thể sử dụng spec = features.tf_example_spec

Nhận thống kê về sự phân chia

TFDS yêu cầu biết chính xác số lượng ví dụ trong mỗi phân đoạn. Điều này là bắt buộc đối với các tính năng như len(ds) hoặc API subplit : split='train[75%:]' .

  • Nếu bạn có thông tin này, bạn có thể tạo danh sách tfds.core.SplitInfo một cách rõ ràng và bỏ qua phần tiếp theo:

    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', ...),
    ]
    
  • Nếu bạn không biết thông tin này, bạn có thể tính toán nó bằng cách sử dụng tập lệnh compute_split_info.py (hoặc trong tập lệnh của riêng bạn với tfds.folder_dataset.compute_split_info ). Nó sẽ khởi chạy một đường ống chùm sẽ đọc tất cả các phân đoạn trên thư mục nhất định và tính toán thông tin.

Thêm tệp siêu dữ liệu

Để tự động thêm các tệp siêu dữ liệu thích hợp dọc theo tập dữ liệu của bạn, hãy sử dụng 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/',

    # 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.""",
)

Khi hàm đã được gọi một lần trên thư mục tập dữ liệu của bạn, các tệp siêu dữ liệu ( dataset_info.json , ...) đã được thêm vào và các tập dữ liệu của bạn đã sẵn sàng để tải với TFDS (xem phần tiếp theo).

Tải tập dữ liệu với TFDS

Trực tiếp từ thư mục

Sau khi siêu dữ liệu đã được tạo, các tập dữ liệu có thể được tải bằng cách sử dụng tfds.builder_from_directory , trả về tfds.core.DatasetBuilder với API TFDS tiêu chuẩn (như tfds.builder ):

builder = tfds.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:
  ...

Trực tiếp từ nhiều thư mục

Cũng có thể tải dữ liệu từ nhiều thư mục. Điều này có thể xảy ra, ví dụ, trong học tập củng cố khi nhiều tác nhân tạo ra một tập dữ liệu riêng biệt và bạn muốn tải tất cả chúng cùng nhau. Các trường hợp sử dụng khác là khi một tập dữ liệu mới được tạo ra một cách thường xuyên, chẳng hạn như một tập dữ liệu mới mỗi ngày và bạn muốn tải dữ liệu từ một phạm vi ngày.

Để tải dữ liệu từ nhiều thư mục, hãy sử dụng tfds.builder_from_directories , trả về tfds.core.DatasetBuilder với API TFDS tiêu chuẩn (như tfds.builder ):

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 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:
  ...

Cấu trúc thư mục (tùy chọn)

Để tương thích tốt hơn với TFDS, bạn có thể tổ chức dữ liệu của mình dưới dạng <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version> . Ví dụ:

data_dir/
    dataset0/
        1.0.0/
        1.0.1/
    dataset1/
        config0/
            2.0.0/
        config1/
            2.0.0/

Điều này sẽ làm cho các tập dữ liệu của bạn tương thích với API tfds.load / tfds.builder , chỉ đơn giản bằng cách cung cấp data_dir/ :

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