<commit_before># 自定义特征解码

- [用法示例](#usage-examples)
    - [跳过图像解码](#skipping-the-image-decoding)
    - [在解码图像之前筛选数据集/打乱数据集顺序](#filtershuffle-dataset-before-images-get-decoded)
    - [同时裁剪和解码](#cropping-and-decoding-at-the-same-time)
    - [自定义视频解码](#customizing-video-decoding)

使用 `tfds.decode` API，您可以重写默认特征解码。主要用例是跳过图像解码以获得更高的性能。

警告：此 API 支持访问磁盘上的低级别 `tf.train.Example` 格式（由 `FeatureConnector` 定义）。此 API 面向希望在图像方面获得更高读取性能的高级用户。

## 用法示例

### 跳过图像解码

为了完全控制解码流水线，或者在对图像进行解码之前应用筛选器（以获得更高的性能），您可以完全跳过图像解码。这适用于 `tfds.features.Image` 和 `tfds.features.Video`。

```python
ds = tfds.load('imagenet2012', split='train', decoders={
    'image': tfds.decode.SkipDecoding(),
})

for example in ds.take(1):
  assert example['image'].dtype == tf.string  # Images are not decoded
```

### 在解码图像之前筛选数据集/打乱数据集顺序

与上一个示例类似，您可以在解码图像之前使用 `tfds.decode.SkipDecoding()` 以插入其他 `tf.data` 流水线自定义。这样，筛选的图像将不会被解码，您可以使用更大的随机缓冲区。

```python
# Load the base dataset without decoding
ds, ds_info = tfds.load(
    'imagenet2012',
    split='train',
    decoders={
        'image': tfds.decode.SkipDecoding(),  # Image won't be decoded here
    },
    as_supervised=True,
    with_info=True,
)
# Apply filter and shuffle
ds = ds.filter(lambda image, label: label != 10)
ds = ds.shuffle(10000)
# Then decode with ds_info.features['image']
ds = ds.map(
    lambda image, label: ds_info.features['image'].decode_example(image), label)

```

### 同时裁剪和解码

要重写默认的 `tf.io.decode_image` 运算，您可以使用 `tfds.decode.make_decoder()` 装饰器创建新的 `tfds.decode.Decoder` 对象。

```python
@tfds.decode.make_decoder()
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=feature.feature.shape[-1],
  )

ds = tfds.load('imagenet2012', split='train', decoders={
    # With video, decoders are applied to individual frames
    'image': decode_example(),
})
```

等效于：

```python
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,<commit_msg>Translate decode.md via GitLocalize<commit_after># 自定义特征解码

- [用法示例](#usage-examples)
    - [跳过图像解码](#skipping-the-image-decoding)
    - [在解码图像之前筛选数据集/打乱数据集顺序](#filtershuffle-dataset-before-images-get-decoded)
    - [同时裁剪和解码](#cropping-and-decoding-at-the-same-time)
    - [自定义视频解码](#customizing-video-decoding)

使用 `tfds.decode` API，您可以重写默认特征解码。主要用例是跳过图像解码以获得更高的性能。

警告：此 API 支持访问磁盘上的低级别 `tf.train.Example` 格式（由 `FeatureConnector` 定义）。此 API 面向希望在图像方面获得更高读取性能的高级用户。

## 用法示例

### 跳过图像解码

为了完全控制解码流水线，或者在对图像进行解码之前应用筛选器（以获得更高的性能），您可以完全跳过图像解码。这适用于 `tfds.features.Image` 和 `tfds.features.Video`。

```python
ds = tfds.load('imagenet2012', split='train', decoders={
    'image': tfds.decode.SkipDecoding(),
})

for example in ds.take(1):
  assert example['image'].dtype == tf.string  # Images are not decoded
```

### 在解码图像之前筛选数据集/打乱数据集顺序

与上一个示例类似，您可以在解码图像之前使用 `tfds.decode.SkipDecoding()` 以插入其他 `tf.data` 流水线自定义。这样，筛选的图像将不会被解码，您可以使用更大的随机缓冲区。

```python
# Load the base dataset without decoding
ds, ds_info = tfds.load(
    'imagenet2012',
    split='train',
    decoders={
        'image': tfds.decode.SkipDecoding(),  # Image won't be decoded here
    },
    as_supervised=True,
    with_info=True,
)
# Apply filter and shuffle
ds = ds.filter(lambda image, label: label != 10)
ds = ds.shuffle(10000)
# Then decode with ds_info.features['image']
ds = ds.map(
    lambda image, label: ds_info.features['image'].decode_example(image), label)
```

### 同时裁剪和解码

要重写默认的 `tf.io.decode_image` 运算，您可以使用 `tfds.decode.make_decoder()` 装饰器创建新的 `tfds.decode.Decoder` 对象。

```python
@tfds.decode.make_decoder()
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=feature.feature.shape[-1],
  )

ds = tfds.load('imagenet2012', split='train', decoders={
    # With video, decoders are applied to individual frames
    'image': decode_example(),
})
```

等效于：

```python
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
{'fraction_non_alphanumeric': 0.14546700159853848, 'fraction_numerical': 0.016898835350536653, 'mean_word_length': 4.887096774193548, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1757467', 'n_tokens_mistral': 2098, 'n_tokens_neox': 2095, 'n_words': 308}