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ế:
-
tf.train.SequenceExample
không được hỗ trợ, chỉ cótf.train.Example
. - Bạn cần có khả năng diễn đạt
tf.train.Example
theotfds.features
(xem phần bên dưới).
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ủatf.train.Example
, bạn có thể gọifeatures.get_serialized_info()
. - Để nhận thông số
FixedLenFeature
, ... chính xác được chuyển đếntf.io.parse_single_example
, bạn có thể sử dụngspec = 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ớitfds.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/')