提交 f33a92d6 编写于 作者: M Megvii Engine Team

docs(mge): fix api docs of loss and tranform

GitOrigin-RevId: 4d4d32b3c4536c3d1ba993405fdde6bc5065af5b
上级 fd83e025
...@@ -33,16 +33,18 @@ class ImageNet(ImageFolder): ...@@ -33,16 +33,18 @@ class ImageNet(ImageFolder):
r""" r"""
Load ImageNet from raw files or folder, expected folder looks like Load ImageNet from raw files or folder, expected folder looks like
${root}/ .. code-block:: bash
| [REQUIRED TAR FILES]
|- ILSVRC2012_img_train.tar ${root}/
|- ILSVRC2012_img_val.tar | [REQUIRED TAR FILES]
|- ILSVRC2012_devkit_t12.tar.gz |- ILSVRC2012_img_train.tar
| [OPTIONAL IMAGE FOLDERS] |- ILSVRC2012_img_val.tar
|- train/cls/xxx.${img_ext} |- ILSVRC2012_devkit_t12.tar.gz
|- val/cls/xxx.${img_ext} | [OPTIONAL IMAGE FOLDERS]
|- ILSVRC2012_devkit_t12/data/meta.mat |- train/cls/xxx.${img_ext}
|- ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_ground_truth.txt |- val/cls/xxx.${img_ext}
|- ILSVRC2012_devkit_t12/data/meta.mat
|- ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_ground_truth.txt
If the image folders don't exist, raw tar files are required to get extracted and processed. If the image folders don't exist, raw tar files are required to get extracted and processed.
""" """
......
...@@ -159,7 +159,7 @@ class ToMode(VisionTransform): ...@@ -159,7 +159,7 @@ class ToMode(VisionTransform):
while the Neural Network might use CHW mode input tensor while the Neural Network might use CHW mode input tensor
:param mode: Output mode of input. Use "CHW" mode by default. :param mode: Output mode of input. Use "CHW" mode by default.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, mode="CHW", *, order=None): def __init__(self, mode="CHW", *, order=None):
...@@ -185,14 +185,14 @@ class Compose(VisionTransform): ...@@ -185,14 +185,14 @@ class Compose(VisionTransform):
r""" r"""
Composes several transforms together. Composes several transforms together.
:param transforms: List of ``VisionTransform`` to compose. :param transforms: List of :class:`VisionTransform` to compose.
:param batch_compose: Whether use shuffle_indices for batch data or not. :param batch_compose: Whether use shuffle_indices for batch data or not.
If True, use original input sequence. If True, use original input sequence.
Otherwise, the shuffle_indices will be used for transforms. Otherwise, the shuffle_indices will be used for transforms.
:param shuffle_indices: Indices used for random shuffle, start at 1. :param shuffle_indices: Indices used for random shuffle, start at 1.
For example, if shuffle_indices is [(1, 3), (2, 4)], then the 1st and 3rd transform For example, if shuffle_indices is [(1, 3), (2, 4)], then the 1st and 3rd transform
will be random shuffled, the 2nd and 4th transform will also be shuffled. will be random shuffled, the 2nd and 4th transform will also be shuffled.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
Example: Example:
...@@ -265,7 +265,7 @@ class TorchTransformCompose(VisionTransform): ...@@ -265,7 +265,7 @@ class TorchTransformCompose(VisionTransform):
such as Normalize and ToTensor in torchvision. such as Normalize and ToTensor in torchvision.
:param transforms: The same with ``Compose`` :param transforms: The same with ``Compose``
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, transforms, *, order=None): def __init__(self, transforms, *, order=None):
...@@ -312,7 +312,7 @@ class Pad(VisionTransform): ...@@ -312,7 +312,7 @@ class Pad(VisionTransform):
:param value: Padding value of image, could be a sequence of int or float. :param value: Padding value of image, could be a sequence of int or float.
if it's float value, the dtype of image will be casted to float32 also. if it's float value, the dtype of image will be casted to float32 also.
:param mask_value: Padding value of segmentation map. :param mask_value: Padding value of segmentation map.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, size=0, value=0, mask_value=0, *, order=None): def __init__(self, size=0, value=0, mask_value=0, *, order=None):
...@@ -358,7 +358,7 @@ class Resize(VisionTransform): ...@@ -358,7 +358,7 @@ class Resize(VisionTransform):
* cv2.INTER_AREA – resampling using pixel area relation. * cv2.INTER_AREA – resampling using pixel area relation.
* cv2.INTER_CUBIC – a bicubic interpolation over 4×4 pixel neighborhood. * cv2.INTER_CUBIC – a bicubic interpolation over 4×4 pixel neighborhood.
* cv2.INTER_LANCZOS4 – a Lanczos interpolation over 8×8 pixel neighborhood. * cv2.INTER_LANCZOS4 – a Lanczos interpolation over 8×8 pixel neighborhood.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, output_size, interpolation=cv2.INTER_LINEAR, *, order=None): def __init__(self, output_size, interpolation=cv2.INTER_LINEAR, *, order=None):
...@@ -477,7 +477,7 @@ class RandomResize(VisionTransform): ...@@ -477,7 +477,7 @@ class RandomResize(VisionTransform):
r"""Resize the input data randomly. r"""Resize the input data randomly.
:param scale_range: . :param scale_range: .
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, scale_range, interpolation=cv2.INTER_LINEAR, *, order=None): def __init__(self, scale_range, interpolation=cv2.INTER_LINEAR, *, order=None):
...@@ -525,7 +525,7 @@ class RandomCrop(VisionTransform): ...@@ -525,7 +525,7 @@ class RandomCrop(VisionTransform):
:param output_size: Target size of output image, with (height, width) shape. :param output_size: Target size of output image, with (height, width) shape.
:param padding_size: The same with `size` in ``Pad`` :param padding_size: The same with `size` in ``Pad``
:param padding_value: The same with `value` in ``Pad`` :param padding_value: The same with `value` in ``Pad``
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__( def __init__(
...@@ -583,7 +583,7 @@ class RandomResizedCrop(VisionTransform): ...@@ -583,7 +583,7 @@ class RandomResizedCrop(VisionTransform):
:param output_size: Target size of output image, with (height, width) shape. :param output_size: Target size of output image, with (height, width) shape.
:param scale_range: Range of size of the origin size cropped. Default: (0.08, 1.0) :param scale_range: Range of size of the origin size cropped. Default: (0.08, 1.0)
:param ratio_range: Range of aspect ratio of the origin aspect ratio cropped. Default: (0.75, 1.33) :param ratio_range: Range of aspect ratio of the origin aspect ratio cropped. Default: (0.75, 1.33)
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__( def __init__(
...@@ -667,7 +667,7 @@ class CenterCrop(VisionTransform): ...@@ -667,7 +667,7 @@ class CenterCrop(VisionTransform):
r"""Crops the given the input data at the center. r"""Crops the given the input data at the center.
:param output_size: Target size of output image, with (height, width) shape. :param output_size: Target size of output image, with (height, width) shape.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, output_size, *, order=None): def __init__(self, output_size, *, order=None):
...@@ -710,7 +710,7 @@ class RandomHorizontalFlip(VisionTransform): ...@@ -710,7 +710,7 @@ class RandomHorizontalFlip(VisionTransform):
r"""Horizontally flip the input data randomly with a given probability. r"""Horizontally flip the input data randomly with a given probability.
:param p: probability of the input data being flipped. Default: 0.5 :param p: probability of the input data being flipped. Default: 0.5
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, prob: float = 0.5, *, order=None): def __init__(self, prob: float = 0.5, *, order=None):
...@@ -742,7 +742,7 @@ class RandomVerticalFlip(VisionTransform): ...@@ -742,7 +742,7 @@ class RandomVerticalFlip(VisionTransform):
r"""Vertically flip the input data randomly with a given probability. r"""Vertically flip the input data randomly with a given probability.
:param p: probability of the input data being flipped. Default: 0.5 :param p: probability of the input data being flipped. Default: 0.5
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, prob: float = 0.5, *, order=None): def __init__(self, prob: float = 0.5, *, order=None):
...@@ -778,7 +778,7 @@ class Normalize(VisionTransform): ...@@ -778,7 +778,7 @@ class Normalize(VisionTransform):
:param mean: Sequence of means for each channel. :param mean: Sequence of means for each channel.
:param std: Sequence of standard deviations for each channel. :param std: Sequence of standard deviations for each channel.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, mean=0.0, std=1.0, *, order=None): def __init__(self, mean=0.0, std=1.0, *, order=None):
...@@ -802,7 +802,7 @@ class GaussianNoise(VisionTransform): ...@@ -802,7 +802,7 @@ class GaussianNoise(VisionTransform):
:param mean: Gaussian mean used to generate noise. :param mean: Gaussian mean used to generate noise.
:param std: Gaussian standard deviation used to generate noise. :param std: Gaussian standard deviation used to generate noise.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, mean=0.0, std=1.0, *, order=None): def __init__(self, mean=0.0, std=1.0, *, order=None):
...@@ -828,7 +828,7 @@ class BrightnessTransform(VisionTransform): ...@@ -828,7 +828,7 @@ class BrightnessTransform(VisionTransform):
:param value: How much to adjust the brightness. Can be any :param value: How much to adjust the brightness. Can be any
non negative number. 0 gives the original image non negative number. 0 gives the original image
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, value, *, order=None): def __init__(self, value, *, order=None):
...@@ -859,7 +859,7 @@ class ContrastTransform(VisionTransform): ...@@ -859,7 +859,7 @@ class ContrastTransform(VisionTransform):
:param value: How much to adjust the contrast. Can be any :param value: How much to adjust the contrast. Can be any
non negative number. 0 gives the original image non negative number. 0 gives the original image
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, value, *, order=None): def __init__(self, value, *, order=None):
...@@ -890,7 +890,7 @@ class SaturationTransform(VisionTransform): ...@@ -890,7 +890,7 @@ class SaturationTransform(VisionTransform):
:param value: How much to adjust the saturation. Can be any :param value: How much to adjust the saturation. Can be any
non negative number. 0 gives the original image non negative number. 0 gives the original image
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, value, *, order=None): def __init__(self, value, *, order=None):
...@@ -921,7 +921,7 @@ class HueTransform(VisionTransform): ...@@ -921,7 +921,7 @@ class HueTransform(VisionTransform):
:param value: How much to adjust the hue. Can be any number :param value: How much to adjust the hue. Can be any number
between 0 and 0.5, 0 gives the original image between 0 and 0.5, 0 gives the original image
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, value, *, order=None): def __init__(self, value, *, order=None):
...@@ -969,7 +969,7 @@ class ColorJitter(VisionTransform): ...@@ -969,7 +969,7 @@ class ColorJitter(VisionTransform):
:param hue: How much to jitter hue. :param hue: How much to jitter hue.
Chosen uniformly from [-hue, hue] or the given [min, max]. Chosen uniformly from [-hue, hue] or the given [min, max].
Should have 0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5. Should have 0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5.
:param order: The same with ``VisionTransform`` :param order: The same with :class:`VisionTransform`
""" """
def __init__(self, brightness=0, contrast=0, saturation=0, hue=0, *, order=None): def __init__(self, brightness=0, contrast=0, saturation=0, hue=0, *, order=None):
......
...@@ -21,12 +21,12 @@ def l1_loss(pred: Tensor, label: Tensor) -> Tensor: ...@@ -21,12 +21,12 @@ def l1_loss(pred: Tensor, label: Tensor) -> Tensor:
The mean absolute error can be described as: The mean absolute error can be described as:
.. math:: .. math:: \ell(x,y) = mean\left(L \right)
\ell(x,y) = mean\left(L \right)
where where
.. math:: .. math::
L = \{l_1,\dots,l_N\}, \quad L = \{l_1,\dots,l_N\}, \quad
l_n = \left| x_n - y_n \right|, l_n = \left| x_n - y_n \right|,
...@@ -36,11 +36,6 @@ def l1_loss(pred: Tensor, label: Tensor) -> Tensor: ...@@ -36,11 +36,6 @@ def l1_loss(pred: Tensor, label: Tensor) -> Tensor:
:param pred: The predicted result from model. :param pred: The predicted result from model.
:param label: The ground truth to compare. :param label: The ground truth to compare.
Shape:
- pred: :math:`(N, *)` where :math:`*` means any number of additional
dimensions
- label: :math:`(N, *)`. Same shape as ``pred``
Examples: Examples:
.. testcode:: .. testcode::
...@@ -72,12 +67,12 @@ def square_loss(pred: Tensor, label: Tensor) -> Tensor: ...@@ -72,12 +67,12 @@ def square_loss(pred: Tensor, label: Tensor) -> Tensor:
The mean squared error can be described as: The mean squared error can be described as:
.. math:: .. math:: \ell(x, y) = mean\left( L \right)
\ell(x, y) = mean\left( L \right)
where where
.. math:: .. math::
L = \{l_1,\dots,l_N\}, \quad L = \{l_1,\dots,l_N\}, \quad
l_n = \left( x_n - y_n \right)^2, l_n = \left( x_n - y_n \right)^2,
...@@ -100,10 +95,10 @@ def square_loss(pred: Tensor, label: Tensor) -> Tensor: ...@@ -100,10 +95,10 @@ def square_loss(pred: Tensor, label: Tensor) -> Tensor:
def cross_entropy( def cross_entropy(
inp: Tensor, target: Tensor, axis: int = 1, ignore_index: int = -1 inp: Tensor, target: Tensor, axis: int = 1, ignore_index: int = -1
) -> Tensor: ) -> Tensor:
r"""Returns the cross entropy loss in a classification problem. r"""
Returns the cross entropy loss in a classification problem.
.. math:: .. math:: \textrm{CrossEntropy}(x, y) = - \sum_{i} y_i\log(x_i)
\textrm{CrossEntropy}(x, y) = - \sum_{i} y_i\log(x_i)
:param inp: The input tensor representing the predicted probability. :param inp: The input tensor representing the predicted probability.
:param label: The input tensor representing the classification label. :param label: The input tensor representing the classification label.
...@@ -118,17 +113,19 @@ def cross_entropy( ...@@ -118,17 +113,19 @@ def cross_entropy(
from megengine import tensor from megengine import tensor
import megengine.functional as F import megengine.functional as F
data_shape = (1, 2) data_shape = (1, 2)
label_shape = (1, ) label_shape = (1, )
pred = tensor( pred = tensor(np.array([0.5, 0.5], dtype=np.float32).reshape(data_shape))
np.array([0.5, 0.5], dtype=np.float32).reshape(data_shape) label = tensor(np.ones(label_shape, dtype=np.int32))
)
label = tensor(
np.ones(label_shape, dtype=np.int32)
)
loss = F.cross_entropy(pred, label) loss = F.cross_entropy(pred, label)
print(loss.numpy())
Outputs:
.. testoutput::
[0.69]
""" """
n0 = inp.ndim n0 = inp.ndim
...@@ -157,8 +154,7 @@ def cross_entropy_with_softmax( ...@@ -157,8 +154,7 @@ def cross_entropy_with_softmax(
When using label smoothing, the label distribution is as follows: When using label smoothing, the label distribution is as follows:
.. math:: .. math:: y^{LS}_{k}=y_{k}\left(1-\alpha\right)+\alpha/K
y^{LS}_{k}=y_{k}\left(1-\alpha\right)+\alpha/K
where :math:`y^{LS}` and :math:`y` are new label distribution and origin label distribution respectively. where :math:`y^{LS}` and :math:`y` are new label distribution and origin label distribution respectively.
k is the index of label distribution. :math:`\alpha` is label_smooth and :math:`K` is the number of classes. k is the index of label distribution. :math:`\alpha` is label_smooth and :math:`K` is the number of classes.
...@@ -199,6 +195,7 @@ def triplet_margin_loss( ...@@ -199,6 +195,7 @@ def triplet_margin_loss(
Creates a criterion that measures the triplet loss given an input tensors. Creates a criterion that measures the triplet loss given an input tensors.
.. math:: .. math::
L(a, p, n) = max\left\{d\left(a_{i},p_{i}\right)-d\left(a_{i}, n_{i}\right)+margin, 0\right\},\ L(a, p, n) = max\left\{d\left(a_{i},p_{i}\right)-d\left(a_{i}, n_{i}\right)+margin, 0\right\},\
d\left(x_{i},y_{i}\right)=\left\|x_{i}-y_{i}\right\|_{p} d\left(x_{i},y_{i}\right)=\left\|x_{i}-y_{i}\right\|_{p}
...@@ -256,18 +253,16 @@ def nll_loss( ...@@ -256,18 +253,16 @@ def nll_loss(
r""" r"""
The negative log likelihood loss. The negative log likelihood loss.
Shape: :param pred: The predicted result from model.
- pred: :math:`(N, *)` where :math:`*` means any number of additional :param label: The ground truth to compare.
dimensions
- label: :math:`(N, *)`. Same shape as ``pred``
Examples: Examples:
.. testcode:: .. testcode::
import numpy as np import numpy as np
from megengine import tensor from megengine import tensor
import megengine.functional as F import megengine.functional as F
from megengine.test.utils import assertTensorClose
data_shape = (2, 2) data_shape = (2, 2)
label_shape = (2, ) label_shape = (2, )
...@@ -280,7 +275,14 @@ def nll_loss( ...@@ -280,7 +275,14 @@ def nll_loss(
pred = F.log(F.softmax(data)) pred = F.log(F.softmax(data))
loss1 = F.nll_loss(pred, label) loss1 = F.nll_loss(pred, label)
loss2 = F.cross_entropy_with_softmax(data, label) loss2 = F.cross_entropy_with_softmax(data, label)
assertTensorClose(loss1.numpy(), loss2.numpy(), max_err=5e-6) print(loss1.numpy(), loss2.numpy())
Outputs:
.. testoutput::
[0.6576154] [0.6576154]
""" """
n0 = pred.ndim n0 = pred.ndim
n1 = label.ndim n1 = label.ndim
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册