MCPcopy Index your code
hub / github.com/apple/ml-pointersect / random_crop

Function random_crop

cdslib/core/utils/tensor_utils.py:45–116  ·  view source on GitHub ↗

Randomly crop a sequence from each sequence in xs. Args: xs: (seq_len, batch, *) input sequences valid_lens: (batch,) valid sequence length of xs min_ratio: min ratio in valid sequence length max_ratio: max r

(
    xs: torch.Tensor,
    valid_lens: T.Union[torch.Tensor, T.List[int]],
    min_ratio: float = 0.1,
    max_ratio: float = 1.0,
    pad_val: float = 0.,
    min_seq_len: int = 1,
)

Source from the content-addressed store, hash-verified

43
44
45def random_crop(
46 xs: torch.Tensor,
47 valid_lens: T.Union[torch.Tensor, T.List[int]],
48 min_ratio: float = 0.1,
49 max_ratio: float = 1.0,
50 pad_val: float = 0.,
51 min_seq_len: int = 1,
52) -> T.Tuple[torch.Tensor, T.Union[torch.Tensor, T.List[int]]]:
53 """
54 Randomly crop a sequence from each sequence in xs.
55
56 Args:
57 xs:
58 (seq_len, batch, *) input sequences
59 valid_lens:
60 (batch,) valid sequence length of xs
61 min_ratio:
62 min ratio in valid sequence length
63 max_ratio:
64 max ratio in valid sequence length
65 pad_val:
66 value used to pad when forming a tensor
67 min_seq_len:
68 minimum sequence length in the cropped sequence
69
70 Returns:
71 xs_cropped:
72 (seq_len_2, batch, *). cropped sequences
73 new_valid_lens:
74 (batch,) valid sequence length of xs_cropped.
75 """
76 if valid_lens is None:
77 valid_lens = [xs.size(0)] * xs.size(1)
78
79 if isinstance(valid_lens, (list, tuple)):
80 valid_lens = torch.tensor(valid_lens)
81 is_list = True
82 valid_lens_device = None
83 else:
84 valid_lens_device = valid_lens.device
85 is_list = False
86
87 # determine new len
88 rs = torch.rand(xs.size(1), device=xs.device) * (max_ratio - min_ratio) + min_ratio # (batch,)
89 new_valid_lens = torch.maximum(
90 torch.minimum((valid_lens * rs).long(), valid_lens),
91 min_seq_len * torch.ones(1, dtype=torch.long, device=rs.device),
92 )
93 new_valid_lens = torch.minimum(new_valid_lens, valid_lens)
94
95 # determine starting point
96 last_idxs = (valid_lens - new_valid_lens) # (included)
97 s_idxs = (torch.rand(xs.size(1), device=xs.device) * (last_idxs + 1)).long()
98 xs_cropped = []
99 cropped_valid_lens = []
100 for i in range(xs.size(1)):
101 x_cropped = xs[s_idxs[i]:s_idxs[i] + new_valid_lens[i], i]
102 assert x_cropped.size(0) > 0

Callers

nothing calls this directly

Calls 1

sizeMethod · 0.80

Tested by

no test coverage detected