optimizes the documentation of chinese API of Sort,Split,Stack,etc.

This commit is contained in:
zhangfanghe 2022-03-02 17:17:31 +08:00
parent 5b360e39fb
commit 96d6ea83e6
18 changed files with 506 additions and 0 deletions

View File

@ -0,0 +1,26 @@
mindspore.ops.Sort
===================
.. py:class:: mindspore.ops.Sort(axis=-1, descending=False)
根据指定的维度对输入Tensor的元素进行排序。默认为升序排序。
**参数:**
- **axis** (int) - 指定排序的轴。默认值:-1。
- **descending** (bool) - 指定排序方式。如果descending为True则根据value对元素进行升序排序。默认值False。
**输入:**
- **x** (Tensor) - Sort的输入任意维度的Tensor数据类型为float16或float32。
**输出:**
- **y1** (Tensor) - Tensor其值为排序后的值shape和数据类型与输入相同。
- **y2** (Tensor) - 输入Tensor其元素的索引。数据类型为int32。
**异常:**
- **TypeError** - `axis` 不是int。
- **TypeError** - `descending` 不是bool。
- **TypeError** - `x` 的数据类型既不是float16也不是float32。

View File

@ -0,0 +1,26 @@
mindspore.ops.Split
====================
.. py:class:: mindspore.ops.Split(axis=0, output_num=1)
根据指定的轴和分割数量对输入Tensor进行分割。
`input_x` Tensor将被分割为相同shape的子Tensor且要求 `input_x.shape(axis)` 可被 `output_num` 整除。
**参数:**
- **axis** (int) - 指定分割轴。默认值0。
- **output_num** (int) - 指定分割数量。其值为正整数。默认值1。
**输入:**
- **input_x** (Tensor) - Tensor的shape为 :math:`(x_1, x_2, ..., x_R)`
**输出:**
tuple[Tensor]每个输出Tensor的shape相同:math:`(y_1, y_2, ..., y_S)` 。数据类型与 `input_x` 的相同。
**异常:**
- **TypeError** - `axis``output_num` 不是int。
- **ValueError** - `axis` 超出[-len(`input_x.shape`), len(`input_x.shape`))范围。或 `output_num` 小于或等于0。

View File

@ -0,0 +1,21 @@
mindspore.ops.Sqrt
===================
.. py:class:: mindspore.ops.Sqrt
计算输入Tensor的平方根。
.. math::
out_{i} = \sqrt{x_{i}}
**输入:**
- **x** (Tensor) - Sqrt的输入任意维度的Tensor其秩应小于8数据类型为Number。
**输出:**
Tensorshape和数据类型与输入 `x` 相同。
**异常:**
- **TypeError** - `x` 不是Tensor。

View File

@ -0,0 +1,27 @@
mindspore.ops.Stack
====================
.. py:class:: mindspore.ops.Stack(axis=0)
根据指定轴对输入Tensor序列进行堆叠运算。
输入秩为 `R` 的Tensor序列且输出秩为 `(R+1)` 的Tensor。
给定输入Tensor的shape为 :math:`(x_1, x_2, ..., x_R)` 。将输入Tensor的数量设为 `N` 。如果存在 :math:`0 \le axis` 则输出Tensor的shape为 :math:`(x_1, x_2, ..., x_{axis}, N, x_{axis+1}, ..., x_R)`
**参数:**
- **axis** (int) - 指定堆叠运算的轴。取值范围为[-(R+1), R+1)。默认值0。
**输入:**
- **input_x** (Union[tuple, list]) - 输入多个Tensor对象组成的tuple或list每个Tensor具有相同shape和数据类型。
**输出:**
堆叠运算后的Tensor数据类型和 `input_x` 的相同。
**异常:**
- **TypeError** - `input_x` 中元素的数据类型不相同。
- **ValueError** - `input_x` 的长度不大于1或axis不在[-(R+1),R+1)范围中,或 input_x` 中元素的shape不相同。

View File

@ -0,0 +1,64 @@
mindspore.ops.StridedSlice
===========================
.. py:class:: mindspore.ops.StridedSlice(begin_mask=0, end_mask=0, ellipsis_mask=0, new_axis_mask=0, shrink_axis_mask=0)
输入Tensor根据步长和索引进行切片提取。
给定一个输入Tensor此操作会插入长度为1的维度。从给定的'input_tensor'中提取大小为(end-begin)/stride的片段。从起始位置开始根据步长和索引进行提取直到所有维度都不小于结束位置为止。
给定一个 `input_x[m1, m2, ...、mn]``begin``end``strides` 是长度为n的向量。
在每个掩码字段中(`begin_mask``end_mask``ellipsis_mask``new_axis_mask``shrink_ax_mask`)第i位将对应于第i个m。
如果设置了 `begin_mask` 的第i位则忽略 `begin[i]` ,而使用该维度中最有可能的取值范围。除了结尾的取值范围, `end_mask` 是类似的。
对于5*6*7的Tensor `x[2:,:3,:]` 等同于 `x[2:5,0:3,0:7]`
如果设置了 `elipsis_mask` 的第i位则将在其他维度之间插入所需的任意数量的未指定维度。 `ellipsis_mask` 中只允许一个非零位。
对于5*6*7*8的Tensor `x[2:,...,:6]` 等同于 `x[2:5,:,:,0:6]``x[2:,...]` 等同于 `x[2:5,:,:,:]`
如果设置了 `new_ax_mask` 的第i位则忽略 `begin``end``strides` 并在输出Tensor的指定位置添加新的长度为1的维度。
对于5*6*7的Tensor `x[:2, newaxis, :6]` 将产生一个shape为(2, 1, 7)的Tensor。
如果设置了 `shrink_ax_mask` 的第i位则第i个大小将维度收缩1并忽略 `begin[i]``end[i]``strides[i]` 索引处的值。
对于5*6*7的Tensor `x[:, 5, :]` 将使得 `shrink_axis_mask` 等于4。
.. note::
步长可能为负值,这会导致反向切片。 `begin``end``strides` 的shape必须相同。 `begin``end` 是零索引。 `strides` 的元素必须非零。
**参数:**
- **begin_mask** (int) - 表示切片的起始索引。使用二进制flag对输入Tensor不同维度进行标志第i位设置为1则begin[i]参数对应的第i维度设置无效表示该维度的起始索引从0开始。默认值0。
- **end_mask** (int) - 表示切片的结束索引。功能类似begin_mask。使用二进制flag对输入Tensor不同维度进行标志第i位设置为1则end参数对应的该维度设置无效表示该维度切分的结束索引到列表最后即切分到尽可能大的维度。默认值0。
- **ellipsis_mask** (int) - 不为0的维度不需要进行切片操作。为int型掩码。默认值0。
- **new_axis_mask** (int) - 如果第i位出现1则begin、end、stride对所有维度参数无效并在第1位上增加一个大小为1的维度。为int型掩码。默认值0。
- **shrink_axis_mask** (int) - 如果第i位设置为1则意味着第i维度缩小为1。为int型掩码。默认值0。
**输入:**
- **input_x** (Tensor) - 需要切片处理的输入Tensor。
- **begin** (tuple[int]) - 指定开始切片的索引。输入为一个tuple仅支持常量值。
- **end** (tuple[int]) - 指定结束切片的索引。输入为一个tuple仅支持常量值。
- **strides** (tuple[int]) - tuple指定各维度切片的步长。仅支持常量值。
**输出:**
Tensor。以下内容介绍了输出。
在第0个维度中begin为1end为2stride为1因为 :math:`1+1=2\geq2` 且interval为 :math:`[1,2)` 。因此在第0个维度中返回具有 :math:`index = 1` 的元素,例如[[3, 3, 3][4, 4, 4]]。
同样在第一个维度中interval为 :math:`[0,1)` 。根据第0个维度的返回值返回具有 :math:`index = 0` 的元素,例如[3, 3, 3]。
同样在第二个维度中interval为 :math:`[0,3)` 。根据第1个维度的返回值返回具有 :math:`index = 0,1,2` 的元素,例如[3, 3, 3]。
最后,输出为[3, 3, 3]。
**异常:**
- **TypeError** - `begin_mask``end_mask``ellipsis_mask``new_ax_mask``shrink_ax_mask` 不是int。
- **TypeError** - `begin``end``strides` 不是tuple。
- **ValueError** - `begin_mask``end_mask``ellipsis_mask``new_axis_mask``shrink_axis_mask` 小于0。

View File

@ -0,0 +1,26 @@
mindspore.ops.Tanh
===================
.. py:class:: mindspore.ops.Tanh
Tanh激活函数。
按元素计算输入元素的双曲正切。Tanh函数定义为
.. math::
tanh(x_i) = \frac{\exp(x_i) - \exp(-x_i)}{\exp(x_i) + \exp(-x_i)} = \frac{\exp(2x_i) - 1}{\exp(2x_i) + 1},
其中 :math:`x_i` 是输入Tensor的元素。
**输入:**
- **input_x** (Tensor) - Tanh的输入任意维度的Tensor其数据类型为float16或float32。
**输出:**
Tensor数据类型和shape与 `input_x` 相同。
**异常:**
- **TypeError** - `input_x` 的数据类型既不是float16也不是float32。
- **TypeError** - `input_x` 不是Tensor。

View File

@ -0,0 +1,26 @@
mindspore.ops.TensorScatterAdd
===============================
.. py:class:: mindspore.ops.TensorScatterAdd
根据指定的更新值和输入索引通过相加运算更新输入Tensor的值。当同一索引有不同值时更新的结果将是所有值的总和。此操作与ScatterNdAdd类似只是更新后的结果是通过算子output返回而不是直接原地更新input。
`indices` 的最后一个轴是每个索引向量的深度。对于每个索引向量, `updates` 中必须有相应的值。 `updates` 的shape应该等于 `input_x[indices]` 的shape。有关更多详细信息请参见使用用例。
.. note::
如果 `indices` 的某些值超出范围,则相应的 `updates` 不会更新为 `input_x` ,而不是抛出索引错误。
**输入:**
- **input_x** (Tensor) - 输入Tensor。input_x的维度必须不小于indices.shape[-1]。
- **indices** (Tensor) - 输入Tensor的索引数据类型为int32或int64的。其rank必须至少为2。
- **updates** (Tensor) - 指定与 `input_x` 相加操作的Tensor其数据类型与输入相同。updates.shape应等于indices.shape[:-1] + input_x.shape[indices.shape[-1]:]。
**输出:**
Tensorshape和数据类型与输入 `input_x` 相同。
**异常:**
- **TypeError** - `indices` 的数据类型既不是int32也不是int64。
- **ValueError** - `input_x` 的shape长度小于 `indices` 的shape的最后一个维度。

View File

@ -0,0 +1,26 @@
mindspore.ops.TensorScatterMax
===============================
.. py:class:: mindspore.ops.TensorScatterMax
根据指定的更新值和输入索引通过最大值运算更新输入Tensor的值。
索引的最后一个轴是每个索引向量的深度。对于每个索引向量, `updates` 中必须有相应的值。 `updates` 的shape应该等于input_x[indices]的shape。有关更多详细信息请参见使用用例。
.. note::
如果 `indices` 的某些值超出范围,则相应的 `updates` 不会更新为 `input_x` ,而不是抛出索引错误。
**输入:**
- **input_x** (Tensor) - 输入Tensor。input_x的维度必须不小于indices.shape[-1]。
- **indices** (Tensor) - 输入Tensor的索引数据类型为int32或int64的。其rank必须至少为2。
- **updates** (Tensor) - 指定与 `input_x` 取最大值操作的Tensor其数据类型与输入相同。updates.shape应等于indices.shape[:-1] + input_x.shape[indices.shape[-1]:]。
**输出:**
Tensorshape和数据类型与输入 `input_x` 相同。
**异常:**
- **TypeError** - `indices` 的数据类型既不是int32也不是int64。
- **ValueError** - `input_x` 的shape长度小于 `indices` 的shape的最后一个维度。

View File

@ -0,0 +1,27 @@
mindspore.ops.TensorScatterMin
===============================
.. py:class:: mindspore.ops.TensorScatterMin
根据指定的更新值和输入索引通过最小值运算更新输入Tensor的值。
索引的最后一个轴是每个索引向量的深度。对于每个索引向量, `updates` 中必须有相应的值。 `updates` 的shape应该等于input_x[indices]的shape。
有关更多详细信息,请参见使用用例。
.. note::
如果 `indices` 的某些值超出范围,则相应的 `updates` 不会更新为 `input_x` ,而不是抛出索引错误。
**输入:**
- **input_x** (Tensor) - 输入Tensor。input_x的维度必须不小于indices.shape[-1]。
- **indices** (Tensor) - 输入Tensor的索引数据类型为int32或int64。其rank必须至少为2。
- **updates** (Tensor) - 指定与 `input_x` 取最小值操作的Tensor其数据类型与输入相同。updates.shape应该等于indices.shape[:-1] + input_x.shape[indices.shape[-1]:]。
**输出:**
Tensorshape和数据类型与输入 `input_x` 相同。
**异常:**
- **TypeError** - `indices` 的数据类型既不是int32也不是int64。
- **ValueError** - `input_x` 的shape长度小于 `indices` 的shape的最后一个维度。

View File

@ -0,0 +1,27 @@
mindspore.ops.TensorScatterSub
===============================
.. py:class:: mindspore.ops.TensorScatterSub
根据指定的更新值和输入索引通过减法运算更新输入Tensor的值。当同一个索引有多个不同值时更新的结果将分别减去这些值。此操作几乎等同于使用ScatterNdSub只是更新后的结果是通过算子output返回而不是直接原地更新input。
`indices` 的最后一个轴是每个索引向量的深度。对于每个索引向量, `updates` 中必须有相应的值。`updates` 的shape应该等于 `input_x[indices]` 的shape。有关更多详细信息请参见使用用例。
.. note::
如果 `indices` 的某些值超出范围,则相应的 `updates` 不会更新为 `input_x` ,而不是抛出索引错误。
**输入:**
- **input_x** (Tensor) - 输入Tensor。input_x的维度必须不小于indices.shape[-1]。
- **indices** (Tensor) - 输入Tensor的索引数据类型为int32或int64的其rank必须至少为2。
- **updates** (Tensor) - 指定与 `input_x` 相减操作的Tensor其数据类型与输入相同。updates.shape应等于indices.shape[:-1] + input_x.shape[indices.shape[-1]:]。
**输出:**
Tensorshape和数据类型与输入 `input_x` 相同。
**异常:**
- **TypeError** - `indices` 的数据类型既不是int32也不是int64。
- **ValueError** - `input_x` 的shape长度小于 `indices` 的shape的最后一个维度。

View File

@ -0,0 +1,26 @@
mindspore.ops.TensorScatterUpdate
==================================
.. py:class:: mindspore.ops.TensorScatterUpdate
根据指定的更新值和输入索引通过更新操作更新输入Tensor的值。此操作几乎等同于使用ScatterNd只是更新操作应用到 `input_x` Tensor而不是0。
`indices` 的rank至少要为2最后一个轴表示每个索引向量的深度。对于每个索引向量 `update` 中必须有相应的值。如果每个索引Tensor的深度与 `input_x` 的rank匹配则每个索引向量对应于 `input_x` 中的Scalar并且每次更新都会更新一个Scalar。如果每个索引Tensor的深度小于 `input_x` 的rank则每个索引向量对应于 `input_x` 中的切片,并且每次更新都会更新一个切片。
更新的顺序是不确定的,这意味着如果 `indices` 中有多个索引向量对应于同一位置,则输出中该位置值是不确定的。
**输入:**
- **input_x** (Tensor) - TensorScatterUpdate的输入任意维度的Tensor。其数据类型为Number。input_x的维度必须不小于indices.shape[-1]。
- **indices** (Tensor) - 输入Tensor的索引数据类型为int32或int64。其rank必须至少为2。
- **update** (Tensor) - 指定与 `input_x` 做更新操作的Tensor其数据类型与输入相同。update.shape应等于indices.shape[:-1] + input_x.shape[indices.shape[-1]:]。
**输出:**
Tensorshape和数据类型与输入 `input_x` 相同。
**异常:**
- **TypeError** - `indices` 的数据类型既不是int32也不是int64。
- **ValueError** - `input_x` 的shape长度小于 `indices` 的shape的最后一个维度。
- **ValueError** - `input_x` 的值与输入 `indices` 不匹配。

View File

@ -0,0 +1,23 @@
mindspore.ops.Transpose
=======================
.. py:class:: mindspore.ops.Transpose
根据指定的排列对输入的Tensor进行数据重排。
此函数对于一维数组转置后不产生变化。对于一维数组转为二维列向量,请参照: :class:`mindspore.ops.ExpandDims` 。对于二维数组可以看做是标准的矩阵转置。对于n维数组根据指定的轴进行排列。如果没有指定轴并且a.shape为 :math:`(i[0], i[1], ... i[n-2], i[n-1])` 那么a.transpose().shape为 :math:`(i[n-1], i[n-2], ... i[1], i[0])`
**输入:**
- **input_x** (Tensor) - 输入Tensor其shape是 :math:`(x_1, x_2, ..., x_R)`
- **input_perm** (tuple[int]) - 指定排列。 `input_perm` 中的元素由 `input_x` 的每个维度的索引组成。 `input_perm` 的长度和 `input_x` 的shape相同。只支持常量值。其范围在[0rank(input_x))内。
**输出:**
Tensor输出Tensor的数据类型与 `input_x` 相同输出Tensor的shape由 `input_x` 的shape和 `input_perm` 的值决定。
**异常:**
- **TypeError** - `input_perm` 不是tuple。
- **ValueError** - `input_x` 的shape长度不等于 `input_perm` 的shape长度。
- **ValueError** - `input_perm` 中存在相同的元素。

View File

@ -0,0 +1,21 @@
mindspore.ops.TupleToArray
===========================
.. py:class:: mindspore.ops.TupleToArray
将tuple转换为Tensor。
如果tuple中第一个Number的数据类型为整数则输出Tensor的数据类型为int。否则输出Tensor的数据类型为float。
**输入:**
- **input_x** (tuple) - Number组成的tuple。这些Number具有相同的类型。仅支持常量值。shape为 :math:`(N,*)` ,其中 :math:`*` 表示任意数量的附加维度。
**输出:**
Tensor。如果输入tuple包含 `N` 个Number则输出Tensor的shape为(N,)。
**异常:**
- **TypeError** - `input_x` 不是tuple。
- **ValueError** - `input_x` 的长度小于或等于0。

View File

@ -0,0 +1,35 @@
mindspore.ops.UniformCandidateSampler
======================================
.. py:class:: mindspore.ops.UniformCandidateSampler(num_true, num_sampled, unique, range_max, seed=0, remove_accidental_hits=False)
使用均匀分布对一组类进行采样。
此函数在均匀分布的基础上从[0, range_max-1]中采样一组类sampled_candidates。如果unique=True则候选采样没有重复如果unique=False则有重复。
**参数:**
- **num_true** (int) - 每个训练样本的目标类数。
- **num_sampled** (int) - 随机采样的类数。sampled_candidates的shape将为num_sampled。如果unique=True则num_sampled必须小于或等于range_max。
- **unique** (bool) - 表示一个batch中的所有采样类是否唯一。
- **range_max** (int) - 可能的类数,该值必须是非负的。
- **seed** (int) - 随机种子该值必须是非负的。如果seed的值为0则seed的值将被随机生成的值替换。默认值0。
- **remove_accidental_hits** (bool) - 表示是否移除accidental hit。默认值False。
**输入:**
- **true_classes** (Tensor) - 输入Tensor目标类其shape为(batch_size, num_true)。
**输出:**
- **sampled_candidates** (Tensor) - 候选采样与目标类之间不存在联系其shape为(num_sampled, )。
- **true_expected_count** (Tensor) - 在每组目标类的采样分布下的预期计数。Shape为(batch_size, num_true)。
- **sampled_expected_count** (Tensor) - 每个候选采样分布下的预期计数。Shape为(num_sampled, )。
**异常:**
- **TypeError** - `num_true``num_sampled` 都不是int。
- **TypeError** - `uique``remo_acidental_hits` 都不是bool。
- **TypeError** - `range_max``seed` 都不是int。
- **TypeError** - `true_classes` 不是Tensor。

View File

@ -0,0 +1,28 @@
mindspore.ops.Unstack
=======================
.. py:class:: mindspore.ops.Unstack(axis=0)
根据指定轴对输入矩阵进行分解。
在指定轴上矩阵分解的rank为 `R` 的Tensor输出rank为 `(R-1)` 的Tensor。
给定一个shape为 :math:`(x_1, x_2, ..., x_R)` 的Tensor。如果存在 :math:`0 \le axis` 则输出Tensor的shape为 :math:`(x_1, x_2, ..., x_{axis}, x_{axis+2}, ..., x_R)`
与Stack函数操作相反。
**参数:**
- **axis** (int) - 指定矩阵分解的轴。取值范围为[-R,R)默认值0。
**输入:**
- **input_x** (Tensor) - 输入Tensor其shape为 :math:`(x_1, x_2, ..., x_R)` 。rank必须大于0。
**输出:**
Tensor对象组成的tuple。每个Tensor对象的shape相同。
**异常:**
- **ValueError** - axis超出[-len(input_x.shape), len(input_x.shape))范围。

View File

@ -0,0 +1,22 @@
mindspore.ops.Zeros
====================
.. py:class:: mindspore.ops.Zeros
创建一个值全为0的Tensor。
第一个参数指定Tensor的shape第二个参数指定填充值的数据类型。
**输入:**
- **shape** (Union[tuple[int], int]) - 指定输出Tensor的shape只能是正整数常量。
- **type** (mindspore.dtype) - 指定输出Tensor的数据类型只能是常量值。
**输出:**
Tensor数据类型和shape与输入shape相同。
**异常:**
- **TypeError** - `shape` 既不是int也不是tuple。
- **TypeError** - `shape` 是tuple其元素并非全部是int。

View File

@ -0,0 +1,27 @@
mindspore.ops.tensor_dot
=========================
.. py:function:: mindspore.ops.tensor_dot(x1, x2, axes)
在任意轴上对Tensor `a``b` 进行点乘操作。
点乘操作可以在指定轴上计算 `a``b` 元素的乘积和。轴数量必须由x1和x2指定并且该值必须在 `a``b` 的维度数量的范围内。
在两个输入中的选定维度且相互匹配。
axes = 0为外积。axes = 1为普通矩阵乘法输入是2维的。axes = 1与axes = ((1,),(0,)相同,其中 `a``b` 都是2维的。axes = 2与axes = ((1,2),(0,1))相同,其中 `a``b` 都是3维的。
**输入:**
- **x1** (Tensor) - tensor_dot的第一个输入Tensor其数据类型为float16或float32。
- **x2** (Tensor) - tensor_dot的第二个输入Tensor其数据类型为float16或float32。
- **axes** (Union[int, tuple(int), tuple(tuple(int)), list(list(int))]) - 指定 `a``b` 计算轴可为单个值也可为长度为2的tuple或list。如果传递了单个值 `N` ,则自动从输入 `a` 的shape中获取最后N个维度从输入 `b` 的shape中获取前N个维度分别作为每个维度的轴。
**输出:**
Tensor输出Tensor的shape为 :math:`(N + M)` 。其中 :math:`N`:math:`M` 在两个输入中没有计算,是自由轴。
**异常:**
- **TypeError** - `x1``x2` 不是Tensor。
- **TypeError** - `axes` 不是int、tuple或list。

View File

@ -0,0 +1,28 @@
mindspore.ops.uniform
=======================
.. py:function:: mindspore.ops.uniform(shape, minval, maxval, seed=None, dtype=mstype.float32)
生成服从均匀分布的随机数。
.. note::
广播后任意位置上Tensor的最小值都必须小于最大值。
**参数:**
- **shape** (tuple) - 指定输出shape任意维度的Tensor。 其 :math:`(N,*)` 的长度应小于8。
- **minval** (Tensor) - 指定生成随机值的最小值其数据类型为int32或float32。如果数据类型为int32则只允许输入一个数字。
- **maxval** (Tensor) - 指定生成随机值的最大值其数据类型为int32或float32。如果数据类型为int32则只允许输入一个数字。
- **seed** (int) - 指定随机种子用于随机数生成器生成伪随机数。随机数为非负数。默认值None将被视为0
- **dtype** (mindspore.dtype) - 指定输入的数据类型。如果数据类型为int32则从离散型均匀分布中生成Number如果数据类型是float32则从连续型均匀分布中生成Number。仅支持这两种数据类型。默认值mindspore.float32。
**返回:**
Tensorshape等于输入 `shape``minval``maxval` 广播后的shape。数据类型由输入 `dtype` 决定。
**异常:**
- **TypeError** - `shape` 不是tuple。
- **TypeError** - `minval``maxval` 的数据类型既不是int32也不是float32并且 `minval` 的数据类型与 `maxval` 的不同。
- **TypeError** - `seed` 不是int。
- **TypeError** - `dtype` 既不是int32也不是float32。