gluoncv.data.batchify

Batchify 函数可用于将数据集转换为可以高效处理的 mini-batch。

在计算机视觉任务中,图像/标签通常具有不同的形状。GluonCV 提供了一系列方便的 batchify 函数,适用于各种情况。

Batch 加载器

Stack

堆叠输入数据样本以构建 batch。

Pad

沿指定的填充轴填充输入 ndarrays 并将其堆叠以获得输出。函数的输入将是 N 个样本。每个样本应包含一个单一元素,可以是 1) numpy.ndarray, 2) mxnet.nd.NDArray, 3) 数字列表。你可以设置 axispad_val 来确定填充轴和值。数组将在 axis 处被填充到最大维度,然后堆叠形成最终输出。此外,如果 ret_length 打开,函数将在 axis 处输出原始维度。:param axis: 用于填充数组的轴。数组将在 pad_axis 处填充到最大维度。例如,假设输入数组的形状为 (10, 8, 5), (6, 8, 5), (3, 8, 5),pad_axis 为 0。每个输入将被填充到 (10, 8, 5),然后堆叠形成最终输出。:type axis: int 或 tuple, 默认 0 :param pad_val: 填充值。:type pad_val: float 或 int, 默认 0 :param num_shards: 要创建的分片数。每个分片独立填充。:type num_shards: int, 默认 1 :param ret_length: 是否在输出中返回有效长度。:type ret_length: bool, 默认 False。

Append

松散地返回输入数据样本列表。

Tuple

包装多个 batchify 函数,形成一个函数,分别应用于每个输入字段的每个输入函数。

API 参考

Batchify 函数。它们可以在 Gluon 数据加载器中使用,以帮助将单个样本组合成 batch 进行快速处理。

class gluoncv.data.batchify.Append(expand=True, batch_axis=0)[source]

松散地返回输入数据样本列表。对任何输入样本的形状都没有限制,但是,由于输出具有不同的形状,你只能应用单个 batch 操作。

示例

>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6]
>>> c = [8, 2]
>>> batchify.Append()([a, b, c])
[
[[1. 2. 3. 4.]]
<NDArray 1x4 @cpu_shared(0)>,
[[4. 5. 6.]]
<NDArray 1x3 @cpu_shared(0)>,
[[8. 2.]]
<NDArray 1x2 @cpu_shared(0)>
]
class gluoncv.data.batchify.FasterRCNNTrainBatchify(net, num_shards=1)[source]

Batchify 包含 5 个元素的 FasterRCNN 数据:img, bbox, rpn_cls_targets, rpn_box_targets 和 rpn_box_masks :param net: 用于推断输出形状的 faster-rcnn 网络。:type net: mxnet.gluon.HybridBlock. :param num_shards: 分片数。每个分片对应一个设备。:type num_shards: int, 默认 1

class gluoncv.data.batchify.Pad(axis=0, pad_val=0, num_shards=1, ret_length=False)[source]

沿指定的填充轴填充输入 ndarrays 并将其堆叠以获得输出。函数的输入将是 N 个样本。每个样本应包含一个单一元素,可以是 1) numpy.ndarray, 2) mxnet.nd.NDArray, 3) 数字列表。你可以设置 axispad_val 来确定填充轴和值。数组将在 axis 处填充到最大维度,然后堆叠形成最终输出。此外,如果 ret_length 打开,函数将在 axis 处输出原始维度。:param axis: 用于填充数组的轴。数组将在

pad_axis 处填充到最大维度。例如,假设输入数组的形状为 (10, 8, 5), (6, 8, 5), (3, 8, 5),pad_axis 为 0。每个输入将被填充到 (10, 8, 5),然后堆叠形成最终输出。

参数
  • pad_val (floatint, 默认 0) – 填充值。

  • num_shards (int, 默认 1) – 要创建的分片数。每个分片独立填充。

  • ret_length (bool, 默认 False) – 是否在输出中返回有效长度。

示例

>>> from gluoncv.data import batchify
>>> # Inputs are multiple lists
>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6]
>>> c = [8, 2]
>>> batchify.Pad()([a, b, c])
[[ 1  2  3  4]
 [ 4  5  6  0]
 [ 8  2  0  0]]
<NDArray 3x4 @cpu(0)>
>>> # Also output the lengths
>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6]
>>> c = [8, 2]
>>> batchify.Pad(ret_length=True)([a, b, c])
(
 [[1 2 3 4]
  [4 5 6 0]
  [8 2 0 0]]
 <NDArray 3x4 @cpu(0)>,
 [4 3 2]
 <NDArray 3 @cpu(0)>)
>>> # Inputs are multiple ndarrays
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = np.array([[5, 8], [1, 2]])
>>> batchify.Pad(axis=1, pad_val=-1)([a, b])
[[[ 1  2  3  4]
  [ 5  6  7  8]]
 [[ 5  8 -1 -1]
  [ 1  2 -1 -1]]]
<NDArray 2x2x4 @cpu(0)>
>>> # Inputs are multiple NDArrays
>>> import mxnet as mx
>>> a = mx.nd.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = mx.nd.array([[5, 8], [1, 2]])
>>> batchify.Pad(axis=1, pad_val=-1)([a, b])
[[[ 1.  2.  3.  4.]
  [ 5.  6.  7.  8.]]
 [[ 5.  8. -1. -1.]
  [ 1.  2. -1. -1.]]]
<NDArray 2x2x4 @cpu(0)>
class gluoncv.data.batchify.Stack[source]

堆叠输入数据样本以构建 batch。N 个输入样本必须具有相同的形状/长度,并将被堆叠以构建一个 batch。.. rubric:: 示例

>>> from gluoncv.data import batchify
>>> # Stack multiple lists
>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6, 8]
>>> c = [8, 9, 1, 2]
>>> batchify.Stack()([a, b, c])
[[1. 2. 3. 4.]
 [4. 5. 6. 8.]
 [8. 9. 1. 2.]]
<NDArray 3x4 @cpu(0)>
>>> # Stack multiple numpy.ndarrays
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = np.array([[5, 6, 7, 8], [1, 2, 3, 4]])
>>> batchify.Stack()([a, b])
[[[1. 2. 3. 4.]
  [5. 6. 7. 8.]]
 [[5. 6. 7. 8.]
  [1. 2. 3. 4.]]]
<NDArray 2x2x4 @cpu(0)>
>>> # Stack multiple NDArrays
>>> import mxnet as mx
>>> a = mx.nd.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = mx.nd.array([[5, 6, 7, 8], [1, 2, 3, 4]])
>>> batchify.Stack()([a, b])
[[[1. 2. 3. 4.]
  [5. 6. 7. 8.]]
 [[5. 6. 7. 8.]
  [1. 2. 3. 4.]]]
<NDArray 2x2x4 @cpu(0)>
class gluoncv.data.batchify.Tuple(fn, *args)[source]

包装多个 batchify 函数,形成一个函数,分别应用于每个输入字段的每个输入函数。每个数据样本应该是一个列表或元组,包含多个属性。存储在 Tuple 中的第 i 个 batchify 函数将应用于第 i 个属性。例如,每个数据样本是 (nd_data, label)。你可以使用 Wrap(DataBatchify, LabelBatchify) 包装两个 batchify 函数,以分别 batchify nd_data 和 label。:param fn: 要包装的 batchify 函数。:type fn: list 或 tuple 或 callable :param *args: 要包装的附加 batchify 函数。:type *args: tuple of callable

示例

>>> from gluoncv.data import batchify
>>> a = ([1, 2, 3, 4], 0)
>>> b = ([5, 7], 1)
>>> c = ([1, 2, 3, 4, 5, 6, 7], 0)
>>> batchify.Tuple(batchify.Pad(), batchify.Stack())([a, b])
(
 [[1 2 3 4]
  [5 7 0 0]]
 <NDArray 2x4 @cpu(0)>,
 [0. 1.]
 <NDArray 2 @cpu(0)>)
>>> # Input can also be a list
>>> batchify.Tuple([batchify.Pad(), batchify.Stack()])([a, b])
(
 [[1 2 3 4]
  [5 7 0 0]]
 <NDArray 2x4 @cpu(0)>,
 [0. 1.]
 <NDArray 2 @cpu(0)>)
>>> # Another example
>>> a = ([1, 2, 3, 4], [5, 6], 1)
>>> b = ([1, 2], [3, 4, 5, 6], 0)
>>> c = ([1], [2, 3, 4, 5, 6], 0)
>>> batchify.Tuple(batchify.Pad(), batchify.Pad(), batchify.Stack())([a, b, c])
(
 [[1 2 3 4]
  [1 2 0 0]
  [1 0 0 0]]
 <NDArray 3x4 @cpu(0)>,
 [[5 6 0 0 0]
  [3 4 5 6 0]
  [2 3 4 5 6]]
 <NDArray 3x5 @cpu(0)>,
 [1. 0. 0.]
 <NDArray 3 @cpu(0)>)