def test_masked_select_broadcast(test_case): x = flow.ones(2, 3, 3) mask = flow.triu(flow.ones(3, 3), 1) flow_res = flow.masked_select(x, mask) np_res = [1, 1, 1, 1, 1, 1] test_case.assertTrue( np.allclose(flow_res.numpy(), np_res, 1e-05, 1e-05))
def _test_masked_select(test_case, device): x = flow.tensor( np.array([[-0.462, 0.3139], [0.3898, -0.7197], [0.0478, -0.1657]]), dtype=flow.float32, device=flow.device(device), requires_grad=True, ) mask = x.gt(0.05) of_out = flow.masked_select(x, mask) np_out = np.array([0.3139, 0.3898]) test_case.assertTrue(np.allclose(of_out.numpy(), np_out, 1e-05, 1e-05)) of_out = of_out.sum() of_out.backward() np_grad = np.array([[0, 1], [1, 0], [0, 0]]) test_case.assertTrue(np.allclose(x.grad.numpy(), np_grad, 1e-05, 1e-05))
def _test_masked_select_broadcast(test_case, device): x = flow.tensor( np.array([[[-0.462, 0.3139], [0.3898, -0.7197], [0.0478, -0.1657]]]), dtype=flow.float32, device=flow.device(device), requires_grad=True, ) mask = flow.tensor( np.array([ [[1.0, 0.0], [1.0, 1.0], [0.0, 1.0]], [[1.0, 0], [1.0, 1.0], [0.0, 1.0]], [[1.0, 1.0], [0.0, 1.0], [1.0, 1.0]], ]), dtype=flow.int8, device=flow.device(device), ) of_out = flow.masked_select(x, mask) np_out = [ -0.462, 0.3898, -0.7197, -0.1657, -0.462, 0.3898, -0.7197, -0.1657, -0.462, 0.3139, -0.7197, 0.0478, -0.1657, ] test_case.assertTrue(np.allclose(of_out.numpy(), np_out, 1e-05, 1e-05)) of_out = of_out.sum() of_out.backward() np_grad = [[[3.0, 1.0], [2.0, 3.0], [1.0, 3.0]]] test_case.assertTrue(np.allclose(x.grad.numpy(), np_grad, 1e-05, 1e-05))
def _masked_select(self, mask): return flow.masked_select(self, mask)
def __init__(self, tensor): self.floating_dtype = tensor.dtype.is_floating_point self.int_mode = True self.sci_mode = False self.max_width = 1 self.random_sample_num = 50 tensor = _try_convert_to_local_tensor(tensor) with flow.no_grad(): tensor_view = tensor.reshape(-1) if not self.floating_dtype: for value in tensor_view: value_str = "{}".format(value) self.max_width = max(self.max_width, len(value_str)) else: nonzero_finite_vals = flow.masked_select(tensor_view, tensor_view.ne(0)) if nonzero_finite_vals.numel() == 0: # no valid number, do nothing return nonzero_finite_abs = nonzero_finite_vals.abs() nonzero_finite_min = nonzero_finite_abs.min().numpy().astype(np.float64) nonzero_finite_max = nonzero_finite_abs.max().numpy().astype(np.float64) for value in nonzero_finite_abs.numpy(): if value != np.ceil(value): self.int_mode = False break if self.int_mode: # Check if scientific representation should be used. if ( nonzero_finite_max / nonzero_finite_min > 1000.0 or nonzero_finite_max > 1.0e8 ): self.sci_mode = True for value in nonzero_finite_vals: value_str = ( ("{{:.{}e}}").format(PRINT_OPTS.precision).format(value) ) self.max_width = max(self.max_width, len(value_str)) else: for value in nonzero_finite_vals: value_str = ("{:.0f}").format(value) self.max_width = max(self.max_width, len(value_str) + 1) else: if ( nonzero_finite_max / nonzero_finite_min > 1000.0 or nonzero_finite_max > 1.0e8 or nonzero_finite_min < 1.0e-4 ): self.sci_mode = True for value in nonzero_finite_vals: value_str = ( ("{{:.{}e}}").format(PRINT_OPTS.precision).format(value) ) self.max_width = max(self.max_width, len(value_str)) else: for value in nonzero_finite_vals: value_str = ( ("{{:.{}f}}").format(PRINT_OPTS.precision).format(value) ) self.max_width = max(self.max_width, len(value_str)) if PRINT_OPTS.sci_mode is not None: self.sci_mode = PRINT_OPTS.sci_mode