GitOrigin-RevId: 5e6ff1a372
tags/v1.0.0-rc1
| @@ -1226,7 +1226,7 @@ def dropout(inp: Tensor, drop_prob: float, training: bool = True) -> Tensor: | |||||
| """ | """ | ||||
| assert 0 <= drop_prob < 1 | assert 0 <= drop_prob < 1 | ||||
| rv = uniform(inp.shape) | |||||
| rv = uniform(size=inp.shape) | |||||
| mask = rv > drop_prob | mask = rv > drop_prob | ||||
| inp *= mask.astype(inp.dtype) | inp *= mask.astype(inp.dtype) | ||||
| if training: | if training: | ||||
| @@ -25,6 +25,6 @@ class Dropout(Module): | |||||
| def forward(self, inputs): | def forward(self, inputs): | ||||
| if self.training: | if self.training: | ||||
| return dropout(inputs, self.drop_prob, rescale=True) | |||||
| return dropout(inputs, self.drop_prob, training=True) | |||||
| else: | else: | ||||
| return inputs | return inputs | ||||
| @@ -1,56 +0,0 @@ | |||||
| # -*- coding: utf-8 -*- | |||||
| # MegEngine is Licensed under the Apache License, Version 2.0 (the "License") | |||||
| # | |||||
| # Copyright (c) 2014-2020 Megvii Inc. All rights reserved. | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, | |||||
| # software distributed under the License is distributed on an | |||||
| # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| import numpy as np | |||||
| from ..functional import cambricon_subgraph, extern_opr_subgraph | |||||
| from .module import Module | |||||
| class CambriconSubgraph(Module): | |||||
| r"""Load a serialized Cambricon subgraph. | |||||
| See :func:`~.cambricon_subgraph` for more details. | |||||
| """ | |||||
| def __init__( | |||||
| self, data, symbol, tensor_dim_mutable, | |||||
| ): | |||||
| super(CambriconSubgraph, self).__init__() | |||||
| self._data = data | |||||
| self.symbol = symbol | |||||
| self.tensor_dim_mutable = tensor_dim_mutable | |||||
| @property | |||||
| def data(self): | |||||
| return self._data.tobytes() | |||||
| @data.setter | |||||
| def data(self, val): | |||||
| self._data = np.frombuffer(val, dtype=np.uint8) | |||||
| def forward(self, inputs): | |||||
| outputs = cambricon_subgraph( | |||||
| inputs, self._data, self.symbol, self.tensor_dim_mutable, | |||||
| ) | |||||
| return outputs | |||||
| class ExternOprSubgraph(Module): | |||||
| r"""Load a serialized extern opr subgraph. | |||||
| """ | |||||
| def __init__(self, data, name, output_shapes): | |||||
| super(ExternOprSubgraph, self).__init__() | |||||
| self.data = data | |||||
| self.name = name | |||||
| self.output_shapes = output_shapes | |||||
| def forward(self, inputs): | |||||
| outputs = extern_opr_subgraph(inputs, self.output_shapes, self.name, self.data,) | |||||
| return outputs | |||||
| @@ -113,6 +113,52 @@ def test_where(): | |||||
| opr_test(cases, F.where, ref_fn=np.where) | opr_test(cases, F.where, ref_fn=np.where) | ||||
| def test_dropout(): | |||||
| data = tensor(np.ones(10, dtype=np.float32)) | |||||
| out = F.dropout(data, 1.0 / 3.0, training=False) | |||||
| assert out.numpy().sum() >= 0.0 | |||||
| def test_matmul(): | |||||
| shape1 = 3 | |||||
| shape2 = 3 | |||||
| shape3 = (3, 5) | |||||
| shape4 = (5, 6) | |||||
| data1 = np.random.random(shape1).astype("float32") | |||||
| data2 = np.random.random(shape2).astype("float32") | |||||
| data3 = np.random.random(shape3).astype("float32") | |||||
| data4 = np.random.random(shape4).astype("float32") | |||||
| cases = [ | |||||
| {"input": [data1, data2]}, | |||||
| {"input": [data2, data3]}, | |||||
| {"input": [data3, data4]}, | |||||
| ] | |||||
| opr_test(cases, F.matmul, ref_fn=np.matmul) | |||||
| batch_size = 10 | |||||
| shape1 = (batch_size, 2, 3) | |||||
| shape2 = (batch_size, 3, 4) | |||||
| shape3 = (batch_size, 10, 4, 5) | |||||
| data1 = np.random.random(shape1).astype("float32") | |||||
| data2 = np.random.random(shape2).astype("float32") | |||||
| data3 = np.random.random(shape3).astype("float32") | |||||
| cases = [{"input": [data1, data2]}, {"input": [data2, data3]}] | |||||
| for i in range(0, batch_size): | |||||
| def compare_fn(x, y): | |||||
| x.numpy()[i, ...] == y | |||||
| opr_test( | |||||
| cases, | |||||
| F.matmul, | |||||
| compare_fn=compare_fn, | |||||
| ref_fn=lambda x, y: np.matmul(x[i, ...], y[i, ...]), | |||||
| ) | |||||
| def test_interpolate(): | def test_interpolate(): | ||||
| def linear_interpolate(): | def linear_interpolate(): | ||||
| inp = tensor(np.arange(1, 3, dtype=np.float32).reshape(1, 1, 2)) | inp = tensor(np.arange(1, 3, dtype=np.float32).reshape(1, 1, 2)) | ||||
| @@ -281,48 +327,6 @@ def test_add_update_params(): | |||||
| assertTensorClose(res.numpy(), b + 1) | assertTensorClose(res.numpy(), b + 1) | ||||
| # def test_cross_entropy_with_softmax(): | |||||
| # data1_shape = (1, 2) | |||||
| # label1_shape = (1,) | |||||
| # data2_shape = (1, 3) | |||||
| # label2_shape = (1,) | |||||
| # data1 = np.array([1, 0.5], dtype=np.float32).reshape(data1_shape) | |||||
| # label1 = np.array([1], dtype=np.int32).reshape(label1_shape) | |||||
| # expect1 = F.cross_entropy(F.softmax(tensor(data1)), tensor(label1)).numpy() | |||||
| # data2 = np.array([0.3, 0.4, 0.3], dtype=np.float32).reshape(data2_shape) | |||||
| # label2 = np.array([1], dtype=np.int32).reshape(label2_shape) | |||||
| # expect2 = F.cross_entropy(F.softmax(tensor(data2)), tensor(label2)).numpy() | |||||
| # cases = [ | |||||
| # {"input": [data1, label1], "output": expect1,}, | |||||
| # {"input": [data2, label2], "output": expect2,}, | |||||
| # ] | |||||
| # opr_test(cases, F.cross_entropy_with_softmax) | |||||
| # def test_cross_entropy(): | |||||
| # data1_shape = (1, 2) | |||||
| # label1_shape = (1,) | |||||
| # data2_shape = (1, 3) | |||||
| # label2_shape = (1,) | |||||
| # data1 = np.array([0.5, 0.5], dtype=np.float32).reshape(data1_shape) | |||||
| # label1 = np.array([1], dtype=np.int32).reshape(label1_shape) | |||||
| # expect1 = np.array([-np.log(0.5)], dtype=np.float32) | |||||
| # data2 = np.array([0.3, 0.4, 0.3], dtype=np.float32).reshape(data2_shape) | |||||
| # label2 = np.array([1], dtype=np.int32).reshape(label2_shape) | |||||
| # expect2 = np.array([-np.log(0.4)], dtype=np.float32) | |||||
| # cases = [ | |||||
| # {"input": [data1, label1], "output": expect1,}, | |||||
| # {"input": [data2, label2], "output": expect2,}, | |||||
| # ] | |||||
| # opr_test(cases, F.cross_entropy) | |||||
| def test_binary_cross_entropy(): | def test_binary_cross_entropy(): | ||||
| data1_shape = (2, 2) | data1_shape = (2, 2) | ||||
| label1_shape = (2, 2) | label1_shape = (2, 2) | ||||
| @@ -413,19 +417,6 @@ def test_batched_nms(): | |||||
| np.testing.assert_equal(results.numpy(), np.array([1, 4, 5], dtype=np.int32)) | np.testing.assert_equal(results.numpy(), np.array([1, 4, 5], dtype=np.int32)) | ||||
| # def test_smooth_l1_loss(): | |||||
| # np.random.seed(123) | |||||
| # cases = [] | |||||
| # for shape in [(2, 2), (2, 3)]: | |||||
| # data = np.random.uniform(size=shape).astype(np.float32) | |||||
| # label = np.random.uniform(size=shape).astype(np.float32) | |||||
| # diff = np.abs(data - label) | |||||
| # expect = np.where(diff < 1, 0.5 * diff ** 2, diff - 0.5).mean() | |||||
| # cases.append({"input": [data, label], "output": tensor(expect)}) | |||||
| # opr_test(cases, F.smooth_l1_loss) | |||||
| def test_conv_bias(): | def test_conv_bias(): | ||||
| inp_scale = 1.5 | inp_scale = 1.5 | ||||
| w_scale = 2.5 | w_scale = 2.5 | ||||
| @@ -203,93 +203,3 @@ def test_normalize(): | |||||
| cases[0]["input"][0, 0, 0, :] = 0 | cases[0]["input"][0, 0, 0, :] = 0 | ||||
| cases[1]["input"][0, 0, 0, :] = 0 | cases[1]["input"][0, 0, 0, :] = 0 | ||||
| opr_test(cases, partial(F.normalize, axis=3), ref_fn=partial(np_normalize, axis=3)) | opr_test(cases, partial(F.normalize, axis=3), ref_fn=partial(np_normalize, axis=3)) | ||||
| def test_matmul(): | |||||
| shape1 = 3 | |||||
| shape2 = 3 | |||||
| shape3 = (3, 5) | |||||
| shape4 = (5, 6) | |||||
| data1 = np.random.random(shape1).astype("float32") | |||||
| data2 = np.random.random(shape2).astype("float32") | |||||
| data3 = np.random.random(shape3).astype("float32") | |||||
| data4 = np.random.random(shape4).astype("float32") | |||||
| cases = [ | |||||
| {"input": [data1, data2]}, | |||||
| {"input": [data2, data3]}, | |||||
| {"input": [data3, data4]}, | |||||
| ] | |||||
| opr_test(cases, F.matmul, ref_fn=np.matmul) | |||||
| batch_size = 10 | |||||
| shape1 = (batch_size, 2, 3) | |||||
| shape2 = (batch_size, 3, 4) | |||||
| shape3 = (batch_size, 10, 4, 5) | |||||
| data1 = np.random.random(shape1).astype("float32") | |||||
| data2 = np.random.random(shape2).astype("float32") | |||||
| data3 = np.random.random(shape3).astype("float32") | |||||
| cases = [{"input": [data1, data2]}, {"input": [data2, data3]}] | |||||
| for i in range(0, batch_size): | |||||
| def compare_fn(x, y): | |||||
| x.numpy()[i, ...] == y | |||||
| opr_test( | |||||
| cases, | |||||
| F.matmul, | |||||
| compare_fn=compare_fn, | |||||
| ref_fn=lambda x, y: np.matmul(x[i, ...], y[i, ...]), | |||||
| ) | |||||
| # def test_logsumexp(): | |||||
| # x = np.arange(10).astype(np.float32) | |||||
| # expected = np.log(np.sum(np.exp(x))) | |||||
| # cases = [{"input": x, "output": expected}] | |||||
| # compare_fn = partial(assertTensorClose, allow_special_values=True) | |||||
| # # large value check | |||||
| # n = 100 | |||||
| # x = np.full(n, 10000, dtype=np.float32) | |||||
| # expected = 10000 + np.log(n) | |||||
| # cases.append({"input": x, "output": expected.astype(np.float32)}) | |||||
| # opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) | |||||
| # # special value check | |||||
| # x = np.array([np.inf], dtype=np.float32) | |||||
| # expected = x | |||||
| # cases = [{"input": x, "output": expected}] | |||||
| # x = np.array([-np.inf, 0.0], dtype=np.float32) | |||||
| # expected = np.zeros(1).astype(np.float32) | |||||
| # cases.append({"input": x, "output": expected}) | |||||
| # opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) | |||||
| # x = np.array([np.nan], dtype=np.float32) | |||||
| # expected = x | |||||
| # cases = [{"input": x, "output": expected}] | |||||
| # x = np.array([-np.inf, 1], dtype=np.float32) | |||||
| # expected = np.array([1.0], dtype=np.float32) | |||||
| # cases.append({"input": x, "output": expected}) | |||||
| # opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) | |||||
| # # keepdims check | |||||
| # x = np.array([[1e10, 1e-10], [-1e10, -np.inf]], dtype=np.float32) | |||||
| # expected = np.array([[1e10], [-1e10]], dtype=np.float32) | |||||
| # cases = [{"input": x, "output": expected}] | |||||
| # x = np.array([[1e10, -1e-10, 1e-10], [1e10, 1e-10, np.inf]], dtype=np.float32) | |||||
| # expected = np.array([[1e10], [np.inf]], dtype=np.float32) | |||||
| # cases.append({"input": x, "output": expected}) | |||||
| # opr_test(cases, F.logsumexp, axis=1, keepdims=True, compare_fn=compare_fn) | |||||
| # # multiple axes check | |||||
| # x = np.array([[1e10, 1e-10], [-1e10, -np.inf]], dtype=np.float32) | |||||
| # expected = np.array([1e10], dtype=np.float32) | |||||
| # cases = [{"input": x, "output": expected}] | |||||
| # x = np.array([[1e10, -1e-10, 1e-10], [1e10, 1e-10, np.inf]], dtype=np.float32) | |||||
| # expected = np.array([np.inf], dtype=np.float32) | |||||
| # cases.append({"input": x, "output": expected}) | |||||
| # opr_test(cases, F.logsumexp, axis=(0, 1), keepdims=False, compare_fn=compare_fn) | |||||